我来自于C#背景,习惯于实现不可变的结构体(structs)。
所以当我开始在C++中编程时,我尝试对通常通过按值传递的类型执行相同的操作。
我有一个简单的结构体,它表示自定义索引并简单地包装了一个整数。因为在C++中const
关键字与C#中的readonly
有些相似,所以像这样实现我的结构体似乎是合理的:
struct MyIndex
{
MyIndex(int value) :
Value(value)
{
}
const int Value;
};
这种方法的问题在于,这个结构体的行为与 C# 中的不可变结构体有很大不同。不仅不能修改 MyIndex
变量的 Value 字段,而且任何现有的 MyIndex
变量(局部变量或字段变量)都不能被替换为另一个 MyIndex
实例。
因此,以下代码示例无法编译:
a)将索引用作循环变量。
MyIndex index(0);
while(someCondition)
{
DoWork();
index = MyIndex(index.Value + 1); // This does not compile!
}
b) 修改类型为MyIndex
的类成员字段
class MyClass
{
MyIndex Index;
void SetMyIndex(MyIndex index)
{
Index = index; // This does not compile!
}
};
这两个样例无法编译,构建错误相同:
error C2582:'operator =' 函数在 'MyIndex' 中不可用
为什么变量不能被另一个实例替换,尽管它们不是const
?这是什么原因?构建错误具体意味着什么?operator=
函数是什么?
std::shared_ptr
吗?实际上,http://www.javapractices.com/topic/TopicAction.do?Id=29提到“不需要复制构造函数”。 - Mooing Duck