1 static
同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,所以加了static关键字的变量和函数可对其它源文件隐藏。
还可以保持变量内容的持久性。
用static前缀作为关键字的变量默认的初始值为0。
1、静态成员函数只能访问静态成员变量
2、静态成员变量不属于对象,而是属于整个类
3、静态成员变量不能通过初始化列表进行初始化,必须类外初始化
int Test::ma = 12;
4、static修饰的成员函数没有this指针,不依赖对象,是c标准调用约定
非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。
类内声明,类外初始化
类外初始化或者定义的时候不加static.
2 const
2.1 修饰普通类型的变量
const int a = 7;
此时a的值不允许修改
volatile const int a =7;
这个时候就可以修改a了。
2.2 修饰指针变量
A: const 修饰指针指向的内容,则内容为不可变量。
const int *p = 8;
应该从右往左读,p是一个指针,指向常整型。
B: const 修饰指针,则指针为不可变量。
int a =10;
int* const p = &a;
p是一个常指针,指向int。
C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
int a =10;
const int* const p = &a;
const在* 左,值不变;const在* 右,指向不变。
2.3 修饰参数传递
传递过来的参数在函数内不可以改变。
2.4 修饰成员函数
const修饰的成员函数不能修改任何成员变量(mutable修饰的变量除外)
const成员函数不能调用非const成员函数,因为非const成员函数可以会修改成员变量.
static和const不能同时修饰类成员函数,因为static修饰静态成员函数,静态成员函数中不包含this指针,即不能实例化。而const成员函数必须具体到某一实例。
void fun(const int* p) const{}
第一个const表示函数内部不会修改传入的指针,第二个参数表示函数不会修改this指针指向的内容。
2.5 修饰函数返回值
-指针传递
如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。
-值传递
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。
1、常对象只能调用常成员函数
2、普通对象可以调用全部的成员函数包括常成员函数
3、常方法不能调用普通方法,可以调用常方法、静态成员方法
4、普通方法可以调用常方法