(二)c++细分const与static
参考自博文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全局变量

浙公网安备 33010602011771号