C++ 拷贝构造函数等编译器自动生成的函数

2023-11-05

了解 C++ 默认编写的函数

空的类,在C++处理过后,编译器会为它声明

  1. 默认构造函数
  2. copy 构造函数
  3. copy assignment 操作符
  4. 析构函数

并且这些函数都是 public 且 inline 的。

class Empty {};
class Empty {
public:
	Empty() {...}	// 默认构造函数
	Empty(const Empty &rhs) {...} 	// 拷贝构造函数
	~Empty() {...}	// 析构函数
	
	Empty& operator =(const Empty& rhs) {...}	// copy assignment 操作符
};

Empty e1;		// 默认构造函数

Empty e2(e1);	// copy 构造函数
e2 = e1;		// copy assignment 操作符

这些函数做些什么:

  1.  构造函数:调用 base classes 和 non-static 成员变量的构造和析构函数 (## 编译器产生的析构函数是 non-virtual 的)
  2.  copy 和 copy assignment 函数将来源对象的每一个 non-static 成员变量拷贝到目标对象

对于copy构造函数:string 成员变量会调用 string 的 copy 构造函数,NamedObject<int>::m_tObjectValue 的类型是int,则会"拷贝每一个bits"来完成初始化

编译器生出 operator= 有两个条件:

  1. class 里面不含有 "引用成员"
  2. 如果某个 base class 将 copy assignment 操作符声明为 private, 编译器将拒绝为其 derived classes 生成一个 copy assignment 操作符

 

防止自动生成拷贝构造函数

  1. 编译器自动生成的函数全部是public,并且是按照固定的机制实现的,所以有些时候我们不能让它自动生成
  2. 为拷贝构造函数和 copy assignment 写一个 private 函数,防止生成,然而这时候还会碰到 friend 和 member 函数中可以使用
  3. 设计一个专门阻止 copying 动作的 base class
        class Uncopyable {
        protected:
            Uncopyable() {}
            ~Uncopyable() {}
        private:
            Uncopyable(const Uncopyable&);
            Uncopyable& operator=(const Uncopyable&);
        };
        
        class A : private Uncopyable {
            ...
        };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 拷贝构造函数等编译器自动生成的函数 的相关文章

随机推荐