易错点:
1.复制过程中涉及指针内存问题
以下是computer类的定义部分:
class computer{
private:
char *name;
public:
computer(char *n){ //注意传参是指针类型
name=new char[strlen(n)+1]; //记得要新开一块内存
strcpy(name,n);
}
~computer(){
delete[] name;
}
virtual void print(){ //父类中设成虚函数
cout<<"Name:"<<name<<endl;
}
2.复制过程中记得检查自赋值问题
String& String::operator=(const String& other) {
if (this == &other) return *this;//检查自赋值问题!!!
delete[] m_data;
m_data = new char[strlen(other.m_data) + 1];
strcpy(m_data, other.m_data);
return *this;
}
3.运算符函数可以重载为成员函数或友员函数:关键区别在于成员函数有this指针,友员函数没有this指针;
当一元运算符的操作数或者二元运算符的左操作数是类的左操作数是类的对象时,定义重载算符函数为成员函数;
一个运算符要修改类的对象的状态,要重载为友员函数时,应该使用引用参数;友员函数重载运算符常用于运算符左右操作数类型不同的情况
c++中不能用友员函数重载的运算符有:=、()、[]、->;
如果运算符的操作数(尤其是第一个操作数)希望有隐式转换,则必须用友员函数重载;
- 赋值运算符:
用于对象数据的复制;operator=必须重载为成员函数;
函数原型:类型 & 类名 ::operator=(const 类名&);
- 重载运算符[]和()
- []:类型 类 ::operator[](int);
- ():类型 类 ::operator()(表达式表);
4.构造函数进行类类型转换
5.虚函数与多态性
- 派生类指针只有经过强制类型转换后才能引用基类对象
- 虚函数必须是类的成员函数;不能将友员说明为虚函数,但虚函数可以是另一个类的友员;悉析构函数可以是虚函数,但构造函数不能是虚函数
- 具有纯虚函数的基类称为抽象类
6.继承
- 访问控制:
(1)公有继承:
(2)私有继承:
(3)保护继承:
- 基类初始化
知识点零碎难记:
强类型转换注意!
由基类指针建立的派生类对象不会调用派生类析构函数,而是调用基类析构函数
有纯虚函数的基类称为一个抽象类
构造函数执行顺序:基类->对象成员->派生类!!!