本节大意
面向对象编程中的构造函数和复制控制
细节摘录
1. 如果某些类只希望派生类使用某个构造函数,可将其声明为protected。
2. 一个类的构造函数中只能初始化它的直接基类。
3. 当类发生重构,所有使用这些类的代码都要重新编译。
4. 请尊重基类接口,用基类的构造函数初始化基类。
5. 有指针成员的类要添加复制控制机制(3 rule)
6. 正如我们在派生类中调用基类构造函数初始化基类对象,我们也应当调用基类复制函数复制基类对象。
7. 每个析构函数只会负责清除自己的成员。
8. 析构函数应当声明为虚,当要用指针使用它以及它的派生对象的时候。
9. 如果为了将基类的虚函数声明为虚而特意定义了一个空的虚函数,那么这是三法则的唯一例外。
10. 虚函数的形参返回必须相同
11. 构造和赋值操作重载不能也不用是虚函数
12如果在构造函数【【【【【【【【【暂留】】】】
课后习题
1.
2. 略
3. a错 因为Base的默认函数是有参数的,而a没有提供。b错 跨基类调用构造函数。c错 原因同b。 d错 id没有声明在形参括号中。 e错 同样原因没有提供Base的构造实参。
4. 需要进行指针动态绑定时
5. 动态绑定
面向对象编程中的构造函数和复制控制
细节摘录
1. 如果某些类只希望派生类使用某个构造函数,可将其声明为protected。
2. 一个类的构造函数中只能初始化它的直接基类。
3. 当类发生重构,所有使用这些类的代码都要重新编译。
4. 请尊重基类接口,用基类的构造函数初始化基类。
5. 有指针成员的类要添加复制控制机制(3 rule)
6. 正如我们在派生类中调用基类构造函数初始化基类对象,我们也应当调用基类复制函数复制基类对象。
7. 每个析构函数只会负责清除自己的成员。
8. 析构函数应当声明为虚,当要用指针使用它以及它的派生对象的时候。
9. 如果为了将基类的虚函数声明为虚而特意定义了一个空的虚函数,那么这是三法则的唯一例外。
10. 虚函数的形参返回必须相同
11. 构造和赋值操作重载不能也不用是虚函数
12如果在构造函数【【【【【【【【【暂留】】】】
课后习题
1.
#include <iostream>
using namespace std;
class A {
private:
int a;
public:
A() {
a=0;
}
int geta() {
return a;
}
};
class B : public A {
private:
int b;
public:
B(int b) : b(b), A() {
}
int getb() {
return b;
}
};
int main()
{
A a;
B b(9);
cout << b.getb() << endl;
return 0;
}
2. 略
3. a错 因为Base的默认函数是有参数的,而a没有提供。b错 跨基类调用构造函数。c错 原因同b。 d错 id没有声明在形参括号中。 e错 同样原因没有提供Base的构造实参。
4. 需要进行指针动态绑定时
5. 动态绑定