#include <iostream>
using namespace std;
class T1
{
const int t = 100;
public:
T1()
{
cout << "T1 constructor: " << t << endl;
}
};
当我尝试用100.初始化const成员变量t
时,但它给了我以下错误:
test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static
如何初始化const
值?
答案 0 :(得分:104)
const
变量指定变量是否可修改。每次引用变量时,将使用分配的常量值。在程序执行期间无法修改分配的值。
Bjarne Stroustrup的explanation总结了一下:
类通常在头文件中声明,并且头文件通常包含在许多翻译单元中。但是,为避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。如果C ++允许将需要作为对象存储在内存中的实体的类内定义,则该规则将被破坏。
必须在类中声明const
变量,但不能在其中定义它。我们需要在类之外定义const变量。
T1() : t( 100 ){}
此处,赋值t = 100
发生在初始化列表中,远在类初始化之前。
答案 1 :(得分:45)
好吧,你可以把它static
:
static const int t = 100;
或者您可以使用成员初始值设定项:
T1() : t(100)
{
// Other constructor stuff here
}
答案 2 :(得分:27)
有几种方法可以初始化类中的const成员..
一般来说,const成员的定义,也需要变量的初始化..
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)好吧,如果你不想在声明初始化,那么另一种方法是通过构造函数,变量需要在初始化列表中初始化(而不是在构造函数的主体中)。它必须像这样
class A
{
const int b;
A(int c) : b(c) {} //const member initialized in initialization list
};
答案 3 :(得分:12)
您可以升级您的编译器以支持C ++ 11,您的代码将完美运行。
在构造函数中使用初始化列表。
T1() : t( 100 )
{
}
答案 4 :(得分:8)
如果您不想在类静态中创建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){}
答案 5 :(得分:5)
另一种解决方案是
class T1
{
enum
{
t = 100
};
public:
T1();
};
因此t被初始化为100并且无法更改它是私有的。
答案 6 :(得分:3)
如果一个成员是一个数组,它将比正常情况稍微复杂一点:
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) {}
};
答案 7 :(得分:2)
另一种可能的方式是命名空间:
#include <iostream>
namespace mySpace {
static const int T = 100;
}
using namespace std;
class T1
{
public:
T1()
{
cout << "T1 constructor: " << mySpace::T << endl;
}
};
缺点是如果其他类包含头文件,也可以使用常量。
答案 8 :(得分:0)
您可以添加static
以使此类成员变量的初始化成为可能。
static const int i = 100;
但是,使用内部类声明并不总是一个好习惯,因为从该类中实例化的所有对象将共享相同的静态变量,该变量存储在实例化对象的作用域内存之外的内部存储器中。
答案 9 :(得分:0)
这是正确的方法。您可以尝试此代码。
#include <iostream>
using namespace std;
class T1 {
const int t;
public:
T1():t(100) {
cout << "T1 constructor: " << t << endl;
}
};
int main() {
T1 obj;
return 0;
}
如果使用C++10 Compiler or below
,则在声明时不能初始化cons成员。因此,这里必须使构造函数初始化const数据成员。还必须使用初始化程序列表T1():t(100)
来立即获取内存。
答案 10 :(得分:0)
在C ++中,不能在声明时直接初始化任何变量。
为此,我们必须使用构造函数的概念。
参见以下示例:-
if testnumber >= 1:
a = int(input("What is their mark?"))
b = int(input("Out of?"))
c = a / b
d = c * 100
print("Their mark is", d, "percent.")
希望对您有帮助!