我写了一个简单的C ++程序来测试C ++中默认复制行为的概念。所以,我有一个示例类X,我创建了一个名为" var"的对象。然后我尝试初始化另一个名为" defaultCopyObject"的对象。用" var"假设默认复制行为只是一个对象的成员副本到另一个对象。我已正确理解了这个概念,但我无法理解用于初始化的语法。
X defaultCopyObject{var};// this code snippet works perfectly fine
// this code snippet returns a compile time error
X defaultCopyObject;
defaultCopyObject{var};
有人可以解释一下为什么前一个声明有效而后者无效?
答案 0 :(得分:5)
X defaultCopyObject{var};
调用X
的构造函数。只有在首次实例化变量时才能调用构造函数。
在第二个示例中,变量在调用defaultCopyObject{var};
时已经被实例化,因此无法再次调用构造函数。
请注意,在实例化变量后,您仍然可以使用复制赋值运算符:
defaultCopyObject = var;
答案 1 :(得分:3)
如果初始化列表一不存在,则第一个是初始化列表构造函数或默认构造函数。在声明这样的对象之后,你无法调用构造函数,这就像代码所做的那样
答案 2 :(得分:0)
X defaultCopyObject{var};
仅在声明变量时有效,而在不可能之后使用它。
您需要一个合适的赋值运算符,以将值移动到变量。有一些方法(比如从std::initializer_list
分配),但不使用那种语法,保留用于声明。