默认函数
class Empty{};
上面的类和下面的等价。默认会创建以下四个成员函数
class Empty { public:
Empty() { ... }
Empty(const Empty& rhs) { ... }
~Empty() { ... }
Empty& operator=(const Empty& rhs) { ... }
};
- 默认构造函数
- 默认拷贝构造函数
- 默认析构函数
- 默认拷贝赋值函数
注意事项
- 这些函数都是public并且是inline的。
- 只有当这些函数被使用到的时候,编译器才会创建它。
编译器的行为
如果用户声明了一个构造函数,编译器不会再创建默认构造函数。
成员变量是引用类型
#include <iostream>
#include <string>
using namespace std;
template<class T>
class NameObject{
public:
NameObject(std::string& name, const T& value):
nameValue(name),ObjectValue(value)
{
}
public:
std::string& nameValue;
const T ObjectValue;
};
int main(int argc, char *argv[])
{
std::string newDog("Perspephone");
std::string oldDog("Satch");
NameObject<int> p(newDog, 2);
NameObject<int> s(oldDog, 36);
//p=s; //引发错误
cout<<&newDog<<endl; // 0x7ffeeb9aa558
cout<<&(p.nameValue)<<endl; // 0x7ffeeb9aa558
return 0;
}
那些情况编译器会抱怨拒绝
- 含有reference 成员,你必须自己去定义copy assignment操作符。
- 内涵const成员,也需要你去自定义copy assignment操作符。
- 如果某个base class将copy
assignment设置为private。编译器也会拒绝生成copy assignment操作符。