运算符重载:
- operator + 合法的运算符 构成函数名(举例:重载<运算符的函数名:operator< )。
- 重载运算符以后,不能改变运算符的 优先级/结合性/操作数个数。
3.若成员变量为共有的,则可以重载为全局函数;若为私有的,重载为成员函数
编译器对于==运算符的重载进行的操作:
- 重载运算符以后,不能改变运算符的 优先级/结合性/操作数个数。
5个C++不能重载的运算符是哪些?
1..* 2. :: 3.sizeof 4.?: 5..
注意:
1.不能通过连接其他符号来创建新的操作符:如operator@
2.重载操作符必须有一个类类型或者枚举类型的操作数
3.用于内置类型的操作符,其含义不能改变,如不能将+重载为-
4.作为类成员的重载函数,其形参看起来比操作数少1,因为操作符一个默认的形参this,限定为第一个形参
赋值运算符的重载:
1.赋值运算符的重载是对一个已存在的对象进行拷贝赋值 。
2.当程序没有显式地提供一个以本类或本类的引用为参数的赋值运算符重载函数时,编译器会自动生成这样一个赋 值运算符重载函数
思考:为什么operator=赋值函数需要一个 Date&的返回值, 使用void做返回值可以吗?
//void
Date& operator=(const Date& d) //引用效率较高,优先考虑引用
{
_year = d._year;
_month = d._month;
_day = d._day;
return this;
}
d1 = d2 = d3;
需要注意:
1.类型参数 2.返回值 3.检测是否自己给自己赋值 4.返回this
类的const成员函数:
const修饰普通变量
在C++中,const修饰的变量已经为一个常量,具有宏的属性,即在编译期间,编译器会将const所修饰的常量进行替换。
const修饰类成员
- const修饰类成员变量时,该成员变量必须在构造函数的初始化列表中初始化
- const修饰类成员函数,实际修饰该成员函数隐含的this指针,该成员函数中不能对类的任何成员进行修改( const Test* const)
注意:在const成员函数中不能修改类的“成员变量”,因为const在此处修饰的是this指针指向空间中的内容,若需要对类的某个成员变量进行修改,该成员变量只需被mutable关键字修饰即可
思考:
首先明确一点:非const函数实际是可读可写当前对象的函数,如SetData(),而const函数只能读取当前对象的内容,如GetData()
- const对象可以调用非const成员函数和const成员函数吗?
答:不能调用普通非const类型成员函数,可以调用const类型成员函数(只读不可写) - 非const对象可以调用非const成员函数和const成员函数吗?
答: 可以,非const对象本身就具有可读属性,完全可以使用const函数 - const成员函数内可以调用其它的const成员函数和非const成员函数吗?
答:不能调用非const函数,可以调用const类型成员函数- 非const成员函数内可以调用其它的const成员函数和非const成员函数吗?
答:可以
- 非const成员函数内可以调用其它的const成员函数和非const成员函数吗?
类的取地址操作符重载 & const修饰的取地址操作符重载 :
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
当想让别人获取到你指定的内容才会需要你自己重载这两个操作符
Test operator&()
{
cout << this << endl;
return this;
}
const Date operator&() const
{
return this ;
}
Test operator&(); 和 const Test opertor&();形成重载
原因是:默认隐藏参数this指针类型不同,第一个是Test const,第二个是const Test const