五、了解C++默默编写并调用哪些函数
如果自己没有声明,编译器会为一个类生成一个copy 构造函数,一个copy assignment操作符和一个析构函数。如果没有声明任何构造函数,还会声明一个default构造函数。这些默认的函数都做了些什么呢?
一般来说,默认构造和析构函数主要用来调用基类和non-static成员变量的构造和析构函数。而copy构造函数和copy assignment操作符则会将源对象的每个non-static成员变量拷贝到目标对象。
这就出现了一个问题,如果一个类中有一个成员变量是引用,会出现什么样的情况呢?我们看下面的代码:
#include <iostream>
using namespace std;
class Pet {
string &name;
public:
Pet(string s): name(s) {}
string getName() {
return name;
}
};
int main() {
Pet cat("cat"), dog("dog");
dog = cat;
cout << dog.getName() << endl;
}
实事上这段代码编译是会报错的:
non-static reference member ‘std::string& Pet::name’, can’t use default assignment operator
因为在C++中,引用是不能指向不同对象的。
使用const成员也会出现这样的问题。这时必须要自定义一个copy assignment操作符才行。
另外,如果基类将copy assignment操作符设成了private,则编译器将拒绝为子类生成一个copy assignment操作符。如下面的代码编译也会出错:
#include <iostream>
using namespace std;
class Animal {
Animal& operator=(const Animal & a);
protected:
string name;
};
class Pet: public Animal {
public:
Pet(string s) {
name = s;
}
string getName() {
return name;
}
};
int main() {
Pet cat("cat"), dog("dog");
dog = cat;
cout << dog.getName() << endl;
}