我们可以构建一个空类,
class Empty
{
};
尽管没有定义任何函数,但我们可以通过以下方式使用这个类:
Empty e1;
Empty e2(e1);
e2 = e1;
因为当编译器发现你用上述方式使用这个类而却在类声明中没有定义一般构造函数(非复制构造函数)、复制构造函数、赋值操作符重载函数和析构函数时,会自动为其生成这些函数,上面的Empty
类经编译后就对应着下面的类:
class Empty
{
public:
Empty(){...};
Empty(const Empty& rhs){...};
~Empty(){...};
Empty& operator=(const Empty& rhs){...};
};
编译器生成的默认构造函数和析构函数的主要任务是分别调用基类和非静态成员变量的构造和析构函数。生成的复制构造函数和赋值操作符重载函数只是单纯的将源对象的每一个非静态变量拷贝给目标对象。
/******************************************
* simple_class.cpp *
* *
* C++自动生成的函数 *
******************************************/
#include <string>
#include <iostream>
class Simple
{
std::string name;
int age;
public:
void SetName(std::string name)
{
this->name = name;
}
void SetAge(int age)
{
this->age = age;
}
void Print()
{
std::cout<<"name="<<name<<","<<"age="<<age<<std::endl;
}
};
int main()
{
Simple s1;
std::cout<<"s1: ";
s1.Print();
std::cout<<"s1: ";
s1.SetName("Jim");
s1.SetAge(20);
s1.Print();
std::cout<<"s2: ";
Simple s2(s1);
s2.Print();
Simple s3;
s3.SetName("Tom");
s3.SetAge(25);
std::cout<<"s3: ";
s3.Print();
s3 = s2;
std::cout<<"s3: ";
s3.Print();
return 0;
}
赋值操作符重载函数只有当编译器生成的代码是合法且有意义时才会由编译器自动生成。
/****************************************
* wired_employee.cpp *
* *
* 不合法的赋值运算符重载函数不会