如何在类中初始化const成员variables?
#include <iostream> using namespace std; class T1 { const int t = 100; public: T1() { cout << "T1 constructor: " << t << endl; } };
当我试图用100初始化const成员variablest
,但它给了我以下错误:
test.cpp:21: error: ISO C++ forbids initialization of member 't' test.cpp:21: error: making 't' static
我怎样才能初始化一个const
值?
const
variables指定variables是否可修改。 每当variables被引用时,将使用分配的常量值。 在程序执行期间,赋值不能被修改。
Bjarne Stroustrup的解释简单总结一下:
一个类通常在头文件中声明,而头文件通常包含在许多翻译单元中。 但是,为了避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。 如果C ++允许将需要作为对象存储在内存中的实体的类定义中断,那么该规则将被破坏。
const
variables必须在类中声明,但不能在其中定义。 我们需要在类之外定义constvariables。
T1() : t( 100 ){}
这里的赋值t = 100
发生在初始化器列表中,远远早于类初始化发生。
那么,你可以把它变成static
:
static const int t = 100;
或者你可以使用成员初始值设定项:
T1() : t(100) { // Other constructor stuff here }
有几种方法来初始化类内的常量成员..
一般const成员的定义,也需要variables的初始化。
1)在类内部,如果你想初始化const,那么语法是这样的
static const int a = 10; //at declaration
2)第二种方式可以
class A { static const int a; //declaration }; const int A::a = 10; //defining the static member outside the class
3)那么如果你不想在声明中初始化,那么另一种方法是通过构造函数,variables需要在初始化列表(不在构造函数的主体中)初始化。 它必须是这样的
class A { const int b; A(int c) : b(c) {} //const member initialized in initialization list };
-
您可以升级您的编译器以支持C ++ 11,并且您的代码将完美工作。
-
在构造函数中使用初始化列表。
T1() : t( 100 ) { }
另一个解决scheme是
class T1 { enum { t = 100 }; public: T1(); };
所以t被初始化为100,不能被改变,并且是私人的。
如果一个成员是一个数组,它会比正常的有点复杂:
class C { static const int ARRAY[10]; public: C() {} }; const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
要么
int* a = new int[N]; // fill a class C { const std::vector<int> v; public: C():v(a, a+N) {} };
另一种可能的方式是命名空间:
#include <iostream> namespace mySpace { static const int T = 100; } using namespace std; class T1 { public: T1() { cout << "T1 constructor: " << mySpace::T << endl; } };
缺点是其他类也可以使用包含头文件的常量。
如果你不想在静态类中创buildconst
数据成员,你可以使用类的构造const
初始化const
数据成员。 例如:
class Example{ const int x; public: Example(int n); }; Example::Example(int n):x(n){ }
如果在类中有多个const
数据成员,则可以使用以下语法来初始化成员:
Example::Example(int n, int z):x(n),someOtherConstVariable(z){}
你可以添加static
来使这个类成员variables的初始化成为可能。
static const int i = 100;
但是,在类声明中使用这种方式并不总是一个好的做法,因为从该类中释放的所有对象将共享存储在实例化对象的作用域内存之外的内部存储器中的相同静态variables。