const
1、const修饰数据成员
与类外部数据一致,即认为此数据成员不可改变。
在参数列表(构造函数)位置初始化
class A{
public:
A(int a):num(a){}//参数列表初始化const数据成员
private:
const int num;
};
2、const修饰成员函数
首先,声明方式:const位于函数声明之后,函数体之前,如果声明在头文件和实现源文件都需要加const,即括号之前的位置,!!!注意与const返回类型区分。
class A{
public:
A(int a):num(a){}//参数列表初始化const数据成员
void func()const{}//const函数
private:
const int num;
};
意义: 修饰成员函数即宣称此函数不会改变数据成员(包括非const),因此此函数如果需要调用其他函数也只能调用const函数,才能保证不改变数据成员。
最后const构成重载,这也是为什么声明和实现都要加const的原因。const对象只能调用const成员函数,非const对象优先调用非const对象。
3、const修饰类对象。
意义:从对象层面宣称此对象不修改数据,只能调用const函数。
static
1、在C语言中:
修饰全局变量使得此变量作用域仅限于本文件,
修饰局部变量使得此变量生命周期与main函数相同,并且存储位置改变不在堆栈,处于数据段rw段。
2、在类内部中:
初始化位置:
类内声明,类外初始化:
class A{
public:
void func(int num){
a=num;
}
void dis(){
cout<<a;
}
private:
static int a;
};
int A:: a=10;//初始化
int main(){
A Q,W,E;
Q.func(20);
Q.dis();
W.func(30);
Q.dis();
E.func(40);
Q.dis();
}
static用来实现族类对象间数据共享,在生成对象的普通数据成员才拥有空间,而static成员在类声明时就开辟了空间。
因为数据共享,因此上述代码的三个Q.dis()
的输出结果是不一样的。
3、因此没有对象也能访问static数据成员,类也是一个命名空间,但这里我修改了a的权限为public 不然无法访问。
4、static修饰成员函数只有一个作用:管理static数据成员。
static成员函数无this指针,因此它没有办法访问对象的其他数据成员。
static成员函数与数据成员既属于对象也属于类,但说到底是属于类的。因此static成员不占用对象空间,属于类空间。
5、static const 同时修饰一个成员,即共享且不可改变,初始化方式为就地初始化。
写在最后
类本质也是一个命名空间。
static成员函数与数据成员既属于对象也属于类,但说到底是属于类的。因此static成员不占用对象空间,属于类空间。