在C ++中,有静态和非静态const
数据成员。
当我想要一个常量时,我总是将它设为static
,因为如果无法修改项目,则拥有多个副本(每个类的一个实例一个)是没有意义的。我想知道为什么会有非静态const
成员?
答案 0 :(得分:4)
class MyClass
{
public:
MyClass(int val): myVal(val) {}
const int myVal;
};
在这个小例子中,没有getter方法的每个人都可以读取myVal
,但是只要MyClass被实例化,它就无法修改。
如果您想确保以后不修改数据类型,则只需将数据类型声明为const
。
由于myVal
不是static
,因此MyClass
的每个不同实例都可以使用不同的值。如果myVal
为static
,则每个实例的值都相同,并且构造函数不能赋值。
采取以下示例
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass(int val) : myConst(val) {}
void printVars() {
cout << "myStatic " << myStatic << endl;
cout << "myConst " << myConst << endl;
}
static const int myStatic;
const int myConst;
};
const int MyClass::myStatic = 5; //Note how this works without
//an instance of MyClass
int main()
{
MyClass ca(23);
MyClass cb(42);
cout << "ca: " << endl;
ca.printVars();
cout << "cb: " << endl;
cb.printVars();
return 0;
}
结果:
ca:
myStatic 5
myConst 23
cb:
myStatic 5
myConst 42
以下会导致编译错误,因为变量是const:
ca.myConst = 11;
ca.myStatic = 13;
答案 1 :(得分:3)
static const
适用于班级const
适用于对象E.g。
class Verticies {
public:
const int colour;
static const int MAX_VERTICIES = 100;
Point points[MAX_VERTICIES];
Verticies(int c) : colour(c) { }
// Etc
};
此处MAX_VERTICIES
适用于Verticies
类型的所有对象。但是不同的物体可以有不同的颜色,并且颜色在结构上固定