c++ - 为什么即使不调用公共(public)复制构造函数也需要它?

标签 c++ oop constructor

拥有一个公共(public)拷贝构造函数将使这个小程序 编译,但不显示副作用“复制”。

#include <iostream>

class X
{
    public:
    X(int) { std::cout << "Construct" << std::endl; }

    // Having a public copy constructor will make the little program 
    // compile, but not showing the side effect "Copy".

    private:
    X(const X&) { std::cout << "Copy" << std::endl; }

    private:
    X& operator = (const X&);
};

int main() {
    X x = 1;
    return 0;
}

最佳答案

您已经使用了所谓的“复制初始化”(在[decl.init] 中定义)。定义的意思是使用int构造函数构造一个X类型的临时对象,然后使用复制构造函数从临时对象中初始化x

但是,在这种情况下,该标准还允许称为“复制构造函数省略”(在 [class.copy] 中定义)的优化。如果应用该优化,则没有临时的。 x 是使用 int 构造函数构造的,就好像您编写了所谓的“直接初始化”X x(1);

为了避免您不小心编写了在应用优化时编译但未应用优化时不编译的代码,标准要求复制构造函数必须可访问,即使它被省略也是如此。因此,构造函数必须是公共(public)的,即使(使用您正在使用的编译器和选项)它没有被调用。

在 C++11 中,考虑了移动构造函数,并且也有资格进行省略。然而,此类 X 没有移动构造函数,因此 C++11 和 C++03 对于此示例是相同的。

关于c++ - 为什么即使不调用公共(public)复制构造函数也需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455382/

相关文章:

c++ - -> 在智能指针中的用法

java - 热切初始化与延迟初始化用例

java - 如果输入参数无效,如何在构造函数中制作防御性副本

c++ - 条件堆栈变量

c++ - 内存问题,不知道为什么。什么():std::bad_alloc

c# - 在 C 系列中,在一个循环中,为什​​么 "less than or equal to"比 "less than"符号更受欢迎?

PHP:重构为面向对象——如何对连接建模

java - Android 设备中等效的标签控件是什么?

javascript - "this"在私有(private)函数内部调用时引用窗口

java - 私有(private)构造函数干扰公共(public)方法测试