目录
3.当类中有引用成员或const成员,需要自己定义赋值操作符函数
1.空类包含的哪些函数
对于我们写的一个空类代码1,其实相当于代码2,当相应的构造、析构等被用到的时候,编辑器就会默默生成出来并调用。
//代码1
class empty{
};
//代码2
class empty{
public:
empty(){ } //构造函数
empty(const empty& tmp){ } //拷贝构造函数
empty& operator=(const empty& tmp){ } //赋值操作符函数
~empty(){ } //析构函数
};
题外话:一个空类占用的是一个字节的空间,这是因为不同的对象不能占用同一块内存空间。
2.一个默默生成的copy构造函数的过程
class temp{
public:
temp(string m_name, int m_age) :name(m_name), age(m_age){
}
~temp(){ }
private:
string name;
int age;
};
temp t1("bin", 5);
temp t2(t1);
看上述例子,我们定义的类中没有写拷贝构造函数与赋值操作符函数,t2对象会调用copy构造函数。对于编辑器生成的拷贝构造函数将t1.name与t1.age为初值初始化t2.name与t2.age。对于name的string类型,是调用string的拷贝函数进行初始化,对于age的int内置类型,是拷贝t1.age的每一位进行初始化。编辑器默默生成的拷贝构造函数也就完成了任务。
注:当我们在类中自己定义了构造、析构、拷贝构造、赋值函数后,编辑器就不会生成相对应的函数进行调用。
3.当类中有引用成员或const成员,需要自己定义赋值操作符函数
class temp{
public:
temp(string m_name, int m_age) :name(m_name), age(m_age){
}
~temp(){ }
private:
string& name;
const int age;
};
temp t1("bin", 5);
temp t2("fen",5);
t1=t2
上述例子是编译不通过的,因为对于引用成员来说,C++不允许引用改变指向不同的对象,默认的赋值操作符函数并不能解决这个问题。const同理。所以此时我们需要自己定义赋值运算符函数。
注:当父类中赋值运算符函数设置为私有,对于子类来说,编辑器拒绝为其生成赋值操作符函数。
参考 《Effective c++》