C++ 碎知识点
23. 不能被重载的运算符
- ** sizeof **:sizeof 运算符
- ** . **:成员运算符
- ** .* **:成员指针运算符
- ** :: **:作用域解析运算符
- ** ? : **:条件运算符
- ** typeid **:一个 RTT 运算符
- ** const_cast **:强制类型转换运算符
- ** dynamic_cast **:强制类型转换运算符
- ** reinterpret_cast **:强制类型转换运算符
- ** static_cast **:强制类型转换运算符
24. 重载限制
- 重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。
- 使用运算符时不能违反运算符原来的句法规则。同样,不能修改运算符的优先级和结合性。
- 不能创造新的运算符。
- 不能重载上面问题 23 中的那些运算符。
- 大多数运算符都可以通过成员函数或非成员函数进行重载,但下面的运算符只能通过成员函数进行重载:
- ** = **:赋值运算符
- ** ( ) **:函数调用运算符
- ** [ ] **:下标运算符
- ** -> **:通过指针访问类成员的运算符
25. 如何重载前置++ 和后置++ 运算符?
C++中规定重载后置运算时需要添加一个整型参数进行标识。例如,下面的代码重载了++运算符,实现了前置运算和后置运算。
class CEnty
{
public:
int count;
CEnty operator++(int) //重载后置++运算符
{
CEnty enty = *this;
this->count++;
return enty;
}
CEnty operator++() //重载前置++运算符
{
this->count++;
CEnty enty = *this;
return enty;
}
CEnty() //默认构造函数
{
count = 1;
}
};
int main(int argc, char* argv[])
{
CEnty a;
CEnty b = a++; //调用后置++运算符重载函数
CEnty c = ++a; //调用前置++运算符重载函数
return 0;
}
26. 重载 == 运算符实现两个对象的比较
请在 CArea 类中添加重载 == 运算符的代码,当两个对象的 Length 和 Height 数据成员完全相等时,则认为两个对象相等,否则认为不相等。
class CArea
{
public:
int Length;
int Height;
CArea()
{
Length = 0;
Height = 0;
}
CArea(int len, int height)
{
Length = len;
Height = height;
}
};
我们可以定义一个布尔类型的 == 运算符重载函数。
例如参考代码:
class CArea
{
public:
int Length;
int Height;
CArea() //默认构造函数
{
Length = 0;
Height = 0;
}
CArea(int len, int height) //自定义构造函数
{
Length = len;
Height = height;
}
bool operator==(CArea &area) //运算符重载
{
if (area.Length = Length && area.Height==Height)
{
cout <<"两个对象相等!" << endl;
return true;
}
else
{
cout <<"两个对象不相等!" << endl;
return false;
}
}
};
int main(int argc, char* argv[])
{
CArea area1(30, 25);
CArea area2(20, 30);
if (area1 == area2) //调用重载的==运算符
{
;
}
return 0;
}
参考资料:
C++ Primer Plus (第6版)
网友评论