使用表达式的结果初始化对象时使用哪个构造函数
Which constructor is used when an object is initialized with the result of an expression
我有以下简单的c++代码:
class X {
public :
int x ;
X(int val) : x(val) {cout<<"one argn" ;}
X(const X&xx) {cout<<"const copy constrn" ; x = xx.x ;}
X(X&xx) {cout<<"non const copy constrn" ; x = xx.x ;}
X(const X&&xx) {cout<<"const move constrn" ; x = xx.x ;}
X(X&&xx) {cout<<"non const move constrn" ; x = xx.x ;}
X operator +(X &ob) {
X xx(x+ob.x) ; cout<<"addn" ; return xx ;
}
X operator=(const X &x) {cout<<"const assignn" ;}
X operator=(X &x) {cout<<"non const assignn" ;}
X operator=(const X &&x) {cout<<"const move assignn" ;}
X operator=(X &&x) {cout<<"non const move assignn" ;}
} ;
main() {
X x1(10), x2(x1) ;
cout<<"$$$$$$$$$$$$$$n" ;
X x3 = x1+x2 ;//does not invoke move/copy constr ---> do not know why
cout<<"###########"<<x3.x<<endl ;
cout<<"$$$$$$$$$$$$$$n" ;
vector<X> v ;
v.push_back(X(100)) ;//invokes move constr
}
x3对象是通过哪个构造函数创建的?
stackoverflow上有大量重复的问题,移动/复制被删除,请参阅http://en.wikipedia.org/wiki/Copy_elision
正如GCC常见问题解答("我的复制构造函数不运行!")中所述,当使用GCC(或clang)与-fno-elide-constructors
一起编译以查看每个中间临时对象被复制或移动时,没有理由这样做,因为这会使程序速度慢得多。
您观察到的是,operator+
中的X
是在为x3
保留的堆栈位置构建的,因此不需要复制或移动,因为具有正确值的X
已经在正确的位置构建。如果你打印出xx
的地址和x3
的地址,你会发现它们是同一个对象。
相关文章:
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 内置类型的构造函数初始化
- 构造函数初始化和对象损坏