1. 友元函数不能直接访问对象数据成员,也不能通过this指针访问,只能用函数参数传递进来(访问规则和成员函数一致)
Class MyClass {
private;
int num;
public:
friend void print(MyClass &);
};
void print(MyClass &x) {
cout << x.num << endl;
}
2. 派生类继承基类的成员,访问权限为继承规则和声明时权限最低的那个
基类中的成员 | public继承 | protected继承 | private继承 |
---|---|---|---|
public成员 | public | protected | private |
protected成员 | protected | protected | private |
private成员 | 不可直接访问 | 不可直接访问 | 不可直接访问 |
3. 函数的参数或返回值不是对象的引用都会调用类的拷贝构造函数构造中间对象
4. 类的拷贝构造函数参数必须为对象的引用,否则会无限递归(拷贝函数也是函数,递归原因参照 3.)
5. 类的构造函数调用顺序遵循:先调用基类,如果继承多个基类,按继承顺序调用;再调用类中成员变量的构造函数,按定义顺序调用;最后再执行该类的函数体
class Derived : public Base2, public Base1 {
public:
Member member;
Derived() : Base1(), Base2(), member() {
cout << "Derived" << endl;
}
};
构造函数函数体执行顺序:Base2->Base1->Member->Derived
6. 有一种情况只能用友元运算符重载而不能用成员运算符重载
complex2 = 100 + complex1;
如果用成员运算符重载,编译器解释为
complex2 = 100.operator(complex1); //编译错误
如果用友元运算符重载则可以这样解决
friend Complex operator + (Complex complex, int num);
friend Complex operator + (int num, Complex complex);
7. 如果要delete掉一个指向无名派生类对象的基类指针,派生类的析构函数应该定义为虚函数
class Base {
public:
//如果基类析构函数不定义为虚函数,delete时只会调用Base的析构函数虎
virtual ~Base() {
cout << "~Base()" << endl;
}
};
class Derived : public Base {
public:
~Derived() {
cout << "~Derived()" << endl;
}
};
int main() {
Base *p = new Derived;
delete p;
return 0;
}