C++ 关于对象初始化与构造函数的一个问题?

#include <iostream>
using namespace std;

struct A {
    A() { cout<<"构造"<<endl; }
    A(int temp):i(temp) { cout<<temp<<"构造"<<endl; }
    A(const A &a):i(a.i + 1) { cout<<i<<"拷贝构造"<<endl; }
    
    ~A() { cout<<i<<"析构"<<endl;; }
    
    int i;
};

int main()
{
    A a = A(16);
    
    return 0;
}

这段代码输出为什么是:

16构造
16析构

而不是:

16构造
17拷贝构造
16析构
17析构
A a = A(16);

不应该是构造了一个临时对象,然后再构造一个 a 吗?应该出现两次构造输出才对,为什么只有一次构造呢?

阅读 2.6k
2 个回答

如果右侧本身是右值(临时对象),这种拷贝赋值或者拷贝构造会被优化。

这种优化依赖于编译器的实现,有的编译器就没有。

那你还应该有另外一个问题:

const int a = 10

为什么可以给 const 的变量赋值?

其实吧,这样的"赋值"应该叫做初始化

于是,后来的c++标准规定(或者说建议)这么写const int a{10}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题