参考自博文https://www.cnblogs.com/5iedu/protected/p/5397232.html
在c++中
const成员变量与const成员函数与const对象
static成员变量与static成员函数与static全局变量
const成员变量
1. const用于类中成员变量时,将类成员变为只读属性(只读:不能出现在“=”的左边,但在类中仍可以用一个指针来修改其值。) 所以不可以直接在类的构造函数中初始化const 的成员。const成员变量必须在初始化列表中初始化;
#include <iostream> using namespace std; class A { private: const int a; // 声明类const成员变量,必须初始化 int b; // 声明类non-const成员变量,可不初始化 public: A():a(10) // 必须初始化 { a = 10; // 错误 // b = 9; 正确 b = 9; // 正确 } }; int main() { A a; return 0; }
const成员函数 const对象
1. const 成员函数只能调用const成员函数;
2. const 成员函数能调用const成员变量和non-const成员变量;
3. const 成员函数不能修改成员变量的值;
4. non-const 成员函数能调用const和non-const成员函数;
5. const 对象只能调用const成员函数;
#include <stdio.h> #include <iostream> using namespace std; class A { private: int a; const int b; // const成员变量,有几个构造函数就要初始化几次 public: A(int x):b(90) { cout<<"A(int x)"<<endl; a = x; } A(const A& x):b(80) { cout<<"A(const A& x)"<<endl; a = x.a; } int getA() const {
// a = 90; const 成员函数不能修改成员变量的值; return a; } void show() const { cout<<"getA()"<<getA()<<endl; // const 成员函数只能调用const成员函数不能调用non-const成员函数 cout<<"a="<<a<<endl; // const 成员函数能调用const成员变量和non-const成员变量; cout<<"b="<<b<<endl; } void print() { cout<<"a="<<a<<endl; } };
int main()
{
A a(10);
a.print();
a.show();
cout<<"----------------"<<endl;
const A b(80);
b.show();
return 0;
}
static成员变量
由于普通的成员变量,是不能在对象之间共享,且每个对象的成员变量都是专属的,只能通过对象名来访问public成员变量
如果多个对象想共享一个成员变量,该如何,static解决了此问题
1. 静态成员变量属于整个类所有;
2. 静态成员变量的生命周期也不依赖与任何对象;
3. 既可以通过对象名,也可以通过类名直接访问public静态成员变量;
4. 所有对象共享类的静态成员变量;
5. 静态成员变量,在内部位于全局数据区,需要类外单独为其分配空间;
6. 在类中,只是声明静态变量,并没有定义;
7. 静态成员变量一定在类外初始化
这是因为被static声明的类静态数据成员,其 实体 远在main()函数开始之前就已经在全局数据段中诞生了(《Inside the C++ Object Model》page247)!其生命期和类对象是异步的,这是最主要的原因
static成员函数
static全局变量