[toc]
编译器创建的函数
空类:
编译器默认添加的函数:
1 2 3 4 5 6 7 8 9 10
| class Empty { public: Empty() { } Empty(const Empty& rhs) { } ~Empty() { } Empty& operator=(const Empty& rhs) { } };
|
拷贝构造函数与拷贝赋值操作符函数
拷贝构造函数和拷贝赋值操作符函数,编译器创建的版本只是单纯地将来源对象的每一个非静态成员变量拷贝到目标对象。如下模板类 NamedObject
,它允许你将一个名称和类型为 T 的对象产生关联。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #ifndef __COPY_H__ #define __COPY_H__
#include <iostream>
template<typename T> class NamedObject { public:
NamedObject(const char *name, const T& value) : nameValue(name), objectValue(value) {} NamedObject(const std::string& name, const T& value) : nameValue(name), objectValue(value) {}
private: std::string nameValue; T objectValue; };
#endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include "copy.h"
int main() {
NamedObject<int> no1("Smallest Prime Number", 2); NamedObject<int> no2(no1); return 0; }
|
编译器拒绝创建拷贝赋值操作符函数的情况
编译器为 NamedObject<int>
所产生的拷贝赋值操作符函数,其行为基本上与拷贝构造函数如出一辙,但一般而言只有当生出的代码合法且有适当机会证明它有意义,其表现才会如我先前所说。万一两个条件有一个不符合,编译器会拒绝为类产生拷贝赋值操作符函数。
编译器拒绝创建拷贝赋值操作符函数情况: