前言
前面刚刚整理了一下new和const的关系 ,突然觉得static和const也是面试的时候一个比较常问的方面,现在也来稍微整理下。
static整理
static用法
static int m, n;
static int *a;
int main(){
cout << m << " " << n;
cout << *a;
return 0;
}
在不赋初值时默认为0,指针默认为NULL;打印看不到任何结果
修饰普通函数,表明函数的作用范围,只有定义在该函数的文件内才能使用,在多人开发的项目中为了防止命名空间中的函数重名,可以加上static
修饰成员变量时,所有的对象只保存一个该变量,并且不需要生成对象就可以访问该变量。
举个例子如下:class A{ public: static int a; int b; A(){ b = 3; } }; int A::a = 5; int main(){ cout << A::a<<" "; A c; cout << c.b; return 0; }
需要注意静态成员变量必须在类外初始化,值得注意的是,如果不初始化静态成员变量,将会报错(使用mingw编译)。而他的性质也符合类中的public private和protected的性质,需要注意的是他不属于类,是一个全局变量。
其实从代码也可以看出,是在类外初始化,他所占的内存是不变的。
- 修饰成员函数,使得成员函数不需要生成对象就可以访问该函数,但是static成员函数中无法访问this指针。也就是无法访问其他非静态成员。稍加思考也可以理解,静态成员函数。本身也不属于类。但是还是有一点很重要,static成员也可以通过对象进行访问,也就是说可以通过对象进行访问,也可以不通过对象进行访问,只要是已经初始化过。
#include<iostream>
using namespace std;
class A{
public:
static int a;
int b;
A(){
b = 3;
}
static void fun(){
cout << "this is fun" << endl;
}
};
int A::a = 5;
int main(){
cout << A::a<<" ";
A::fun();
A c;
cout << c.b<<" "<<c.a;
c.fun();
return 0;
}
结果如下:
const 整理
const用法
- 修饰变量,说明该变量不可以被改变
- 修饰指针,分为指针常量和常量指针
- 常量引用,经常用于形参类型,即避免了拷贝,有避免了对值的修改
- 修饰成员函数,说明该成员函数不能修改成员变量。
举例如下:
// 类
class A
{
private:
const int a; // 常对象成员,只能在初始化列表赋值
public:
// 构造函数
A() : a(0) { };
A(int x) : a(x) { }; // 初始化列表
// const可用于对重载函数的区分
int getValue(); // 普通成员函数
int getValue() const; // 常成员函数,不得修改类中的任何数据成员的值
void function()
{
// 对象
A b; // 普通对象,可以调用全部成员函数、更新常成员变量
const A a; // 常对象,只能调用常成员函数
const A *p = &a; // 常指针
const A &q = a; // 常引用
// 指针
char greeting[] = "Hello";
char* p1 = greeting; // 指针变量,指向字符数组变量
const char* p2 = greeting; // 指针变量,指向字符数组常量
char* const p3 = greeting; // 常指针,指向字符数组变量
const char* const p4 = greeting; // 常指针,指向字符数组常量
}
// 函数
void function1(const int Var); // 传递过来的参数在函数内不可变
void function2(const char* Var); // 参数指针所指内容为常量
void function3(char* const Var); // 参数指针为常指针
void function4(const int& Var); // 引用参数在函数内为常量
// 函数返回值
const int function5(); // 返回一个常数
const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6();
int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7();
总结
static 和const中还是有很多容易混淆的东西,不过多写之后就会慢慢记住了。