1. .* :? :: sizeof . 这五个运算符不能重载
2.赋值运算符必须要重载成类的成员函数,否则编译失败(只能定义在类内)
原因:赋值运算符重载是默认成员函数,如果用户没有显示实现,则编译器会自动生成一份。
3.赋值运算符加返回值目的:为了实现连续赋值。
返回引用目的:为了提高程序的运行效率(直接将this返回回去,而不是返回临时对象)
如果以自定义类型作为函数的参数,尽量传递应用,因为在传参时,不需要拷贝临时对象。
如果返回的是自定义的对象,最好也以引用的形式返回。
4.const:不想要通过形参修改外部的实参。
- const类型对象:只能调用const成员函数,不能调用普通成员函数。
- 普通对象,const成员函数和普通成员函数都可以调用。
- const成员函数内可以调用其它的非const成员函数吗?答案是不可以,const 修饰成员函数 本质就是在修饰this,表明this指向对象中成员是不能修改的。
- 在普通成员函数中,既可以调用普通成员函数,也可以调用const成员函数。
- 构造函数、拷贝构造函数、赋值运算符重载、析构函数都不能使用const修饰。
- const修饰的是一个常量,在编译阶段会进行替换,const修饰的常量在定义时必须初始化(或者在初始化列表中对其初始化),除此以外,引用类型的变量也必须初始化。
5.重载前置++和后置++:可在重置后置++的时候,多增加1个int形参数。
eg:
//前置++
Date& operator++()
{
*this = *this + 1;
return *this;
}
//后置++
Date operator++(int)
{
Date temp(*this);
*this = *this + 1;
return temp;
}
6.mutable:mutable修饰成员变量,则该成员变量可以在const修饰的函数中被修改。
7.初始化列表:
- 构造函数只是对变量进行了赋值,并不能说是初始化,使用初始化列表对变量进行初始化。
- 类中包含①const类型的成员变量、②引用类型的成员变量、③类类型对象,且该类的构造函数不是默认的构造函数的时候,必须放在初始化列表位置进行初始化。
- 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。
8.explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。用explicit修饰构造函数,将会禁止单参构造函数的隐式转换。例如Date d1=2022;(此时编译不会通过,若没有explicit,则2022会通过单参构造函数创建临时对象,将其赋值给d1,然后会将临时对象销毁)。
9.static关键字
静态成员变量的属性:
- 在类中被static修饰
- 静态成员变量在类中只是声明,需要在类外重新进行定义,在类外定义时不要加上static,但要加上类名::(eg: int Date::_count = 0;)
- 不是具体某对象的属性,没有存储在对象中,是所有类共享的成员变量,肯定不影响sizeof的结果。
- 静态成员变量可以通过对象.静态成员变量名字|| 类名::静态成员变量名字来访问。
- 受访问限定符的限制(如果是private,类外就不能用上面两种方式进行访问,较安全,此时可通过提供共有的get方法让类外可以访问 eg: static int GetCount()---加static可直接通过类名打点的方式来访问)
- 静态成员变量不能在构造函数初始化列表位置进行初始化。(初始化的都是类内部的)
静态成员函数:
- 必须要被static修饰
- 通过类名::静态成员函数名字() || 对象.静态成员函数名字()来访问
- 静态成员函数没有隐藏的this指针。因此在静态成员函数中不能访问普通成员变量,也不能调用非静态成员函数。(没有this,调用其实需要用this来调)
- 静态成员函数不能被设置为const成员函数,const修饰成员函数,本质是在修饰this,而静态成员函数中没有this。
- 静态成员函数不能作为虚函数。