我是从C#来到C ++而const-correctness对我来说还是新手。在C#中,我可以声明这样的属性:
class Type
{
public readonly int x;
public Type(int y)
{
x = y;
}
}
这将确保x仅在初始化期间设置。我想在C ++中做类似的事情。我能想到的最好的是:
class Type
{
private:
int _x;
public:
Type(int y) { _x = y; }
int get_x() { return _x; }
};
有更好的方法吗?更好的是:我可以使用结构吗?我想到的类型实际上只是一个数据集合,没有逻辑,所以如果我能保证只在初始化期间设置它的值,结构会更好。
答案 0 :(得分:6)
有一个const
修饰符:
class Type
{
private:
const int _x;
int j;
// Prevent C4512 - remove operator=
Type& operator=(const Type&);
public:
Type(int y):_x(y) { j = 5; }
int get_x() { return _x; }
};
请注意,您需要在构造函数初始化列表中初始化常量。其他变量也可以在构造函数体中初始化。
关于你的第二个问题,是的,你可以这样做:
struct Type
{
const int x;
const int y;
Type(int vx, int vy): x(vx), y(vy){}
private: // Prevent C4512
Type& operator=(const Type&);
};
答案 1 :(得分:2)
您可以拥有一个常量集合,而不是常量集合。不变的属性似乎与您的用例有关,而与数据模型本身无关。像这样:
struct extent { int width; int height; };
const extent e { 20, 30 };
有可能拥有一个类的特定常量数据成员,但是你需要编写一个构造函数来初始化它:
struct Foo
{
const int x;
int & y;
int z;
Foo(int a, int & b) : x(a + b), y(b), z(b - a) { }
};
(该示例还显示了需要初始化的另一种数据成员:引用。)
当然,结构和类是一回事。
答案 2 :(得分:1)
您可以使用构造函数初始化类const成员。如果需要在构造函数中添加其他逻辑,但在.cpp文件中而不是.h中,则可以创建一个私有方法并在构造函数中调用它。
File.h
class Example
{
private:
const int constantMember1;
const int constantMember2;
const int constantMember3;
void Init();
public:
Example(int a, int b) :constantMember1(a), constantMember2(b), constantMember3(a + b) {
//Initialization
Init();
};
};
File.cpp
void Init()
{
//Some Logic intialization
}