Skip to content

C++ 默认提供和调用的函数

当声明一个类时,编译器就会为它声明一个 copy 构造函数、一个 copy assignment 操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会为你声明一个 default 构造函数。

所有这些自动生成的函数都是 public 且 inline 的。

编译器产出的析构函数是个 non-virtual,除非这个 class 的 base class 自身声明有 virtual 析构函数(此时函数的虚属性主要来自 base class)。

其中 copy 构造函数和 copy assignment 操作符,编译器创建的版本只是单纯地将来源对象的每一个 non-static 成员变量拷贝到目标对象。

当对象包含引用成员时或者常量成员时,copy assignment 操作符的行为是未定义的:

cpp
template <class T>
class Namedobject
{
public:
    Namedobject(std::string &name, const T &value) : namevalue(name) {}

private:
    std::string &namevalue;
    // const T objectvalue;
};

int main()
{
    std::string name1("name1");
    std::string name2("name2");

    Namedobject<int> nb1(name1, 1);
    Namedobject<int> nb2(nb1);
    nb1 = nb2; // error
    return 0;
};
template <class T>
class Namedobject
{
public:
    Namedobject(std::string &name, const T &value) : namevalue(name) {}

private:
    std::string &namevalue;
    // const T objectvalue;
};

int main()
{
    std::string name1("name1");
    std::string name2("name2");

    Namedobject<int> nb1(name1, 1);
    Namedobject<int> nb2(nb1);
    nb1 = nb2; // error
    return 0;
};

小结

  • 编译器可以暗自为 class 创建 default 构造函数、copy 构造函数、copy assignment 操作符,以及析构函数。
  • 在一个“内含 reference 成员”或内涵“const 成员”的 class 内支持赋值操作,你必须自己定义 copy assignment 操作符。
  • 如果某个 base classes 将 copy assignment 操作符声明为 private,编译器将拒绝为其 derived classes 生成一个 copy assignment 操作符。

Developed by Kisstar & Powered by VitePress.