[英]object construction with assignment operator
我想知道使用赋值运算符的对象构造工作,在我看到这个问题之前从未见过:
减少示例代码:
class A
{
public:
int x;
A(int _x):x(_x){ std::cout << "Init" << std::endl;}
void Print() { std::cout << x << std::endl; }
A& operator = ( const int ) = delete;
};
int main()
{
A a=9;
a.Print();
}
写的是
A a(9);
A a{9};
A a=9;
全部都一样?
这与赋值运算符无关,它是初始化,更准确地说是复制初始化 ,它只是在初始化程序中使用等号。
当声明非引用类型
T
的命名变量(自动,静态或线程局部)时,初始化程序由等号后跟表达式组成。
对于A a = 9;
将调用approriate构造函数(即A::A(int)
)来构造a
。 1
A a(9);
是直接初始化 , A a{9};
是直接列表初始化 (从C ++ 11开始),它们都会调用A::A(int)
来构造这种情况的对象。 2
1 在C ++ 17之前,仍然需要在概念上使用适当的移动/复制构造函数。 即使它可能已经优化但仍然必须可访问。 从C ++ 17开始,这不再需要了。
2 请注意,这些初始化样式之间仍存在细微差别,它们可能会在某些特定情况下导致不同的效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.