【问题标题】:does default copy constructor handle const?默认复制构造函数是否处理 const?
【发布时间】:2015-06-15 18:01:13
【问题描述】:

我了解到默认的复制赋值运算符(编辑:更正,不是复制构造函数)不处理 const 和引用。因此,如果一个类包含这样的成员,那么编译器将不会为它生成默认的复制构造函数。这个说法正确吗?为什么const不能处理?

此外,如果一个类包含指针作为成员,编译器会生成一个复制构造函数吗?我知道默认的拷贝构造函数只做浅拷贝,但编译器至少会生成一个拷贝构造函数,对吗?

非常感谢您的澄清!

【问题讨论】:

  • 你可能学错了。
  • 您将copy constructor 与copy assignment 混淆了。只有后者不能用 const 或 reference 成员完成。

标签: c++ pointers reference constants copy-constructor


【解决方案1】:

构造函数需要一种方法来初始化常量非静态数据成员和引用类型的非静态数据成员,因为这些数据成员应在创建相应对象时进行初始化。 因此,要么您必须自己编写默认构造函数,要么这些数据成员必须在类定义中指定大括号或等号初始化器。

还有一些数据成员可以没有默认构造函数。因此编译器无法为该类创建默认构造函数,因为它无法调用此类数据成员对应的默认构造函数。

对于指针,它们不会阻止编译器定义复制构造函数。

这是一个演示程序

#include <iostream>

struct A
{
    const int i = 10; 
};

struct B
{
    const int i; 
};

int main()
{
    A a;
    std::cout << "a.i = " << a.i << std::endl;

//  B b; // compilation error
}    

对于结构 A,编译器隐式定义了默认构造函数,因为数据成员 i 在类定义中被初始化。 但是对于结构 B,编译器无法定义默认构造函数,因为它不知道如何初始化常量数据成员 i。

【讨论】:

    【解决方案2】:

    如果您没有为类X 定义复制构造函数,则会隐式定义复制构造函数。它通常采用X(const X&amp;) 的形式,但如果成员需要,它也可以是其他单参数形式之一,并且可以定义为删除。构造函数的行为就像每个成员都是从右侧的相应成员初始化的一样,并且具有一个空的主体。有一些细节,但这是大体的想法。

    由于您可以从相同类型的值初始化 const 数据成员和引用数据成员,因此这些成员没有什么特别之处。 (不过,任务的故事是不同的。)

    【讨论】:

    • 我认为他指的是 default ctor,因为当存在 const 限定或引用类型的数据成员时,它是唯一被隐式删除的构造函数。
    • @0x499602D2:我很确定它在问题中说“复制构造函数”......
    • 这可能是他的误解,因为复制构造函数 可以 实际上用其行为初始化 const 对象和引用,但默认构造函数不能。 (编辑:他也可能指的是复制赋值运算符)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2020-05-14
    • 2016-03-25
    • 2013-05-06
    相关资源
    最近更新 更多