接上篇C++57个入门知识点_53 运算符重载方式:类成员的运算符重载及友元全局的运算符重载(operator:算数±、关系运算==<>、逻辑&&||、条件(三元运算);实现运算符重载的两种方式),本篇介绍转换运算符。转换运算符不是很难,使用情况也不是很多,但是作为一个知识点需要进行讲解。
总结:
- 前缀++写法,++n有效
- 后缀++写法,n++有效
- new重载方法
- 转换运算符:将自定义的类转换为我们想要转换的类型
以下代码中的CInt
类代表了我们自己封装的一个Int
类
#include <iostream>
class CInt {
public:
CInt(int n) {
m_int = n;
}
private:
int m_int;
};
int main(int argc, char* argv[]){}
我们知道,一个数字n
,我们可以对其进行n++
或者++n
,而对于上面的类是否可以进行类似的操作?
1. 前缀++写法,++n有效
对于上面代码,在
main
中写代码如下:
int main(int argc, char* argv[])
{
CInt objN(1);
objN++;
}
编译结果如下:
这是因为没有在类中定义++
运算符,在类中定义相应的成员运算符重载如下:
#include <iostream>
class CInt {
public:
CInt(int n) {
m_int = n;
}
//前缀++写法,++n有效
CInt operator++() {
return ++m_int;
}
private:
int m_int;
};
int main(int argc, char* argv[])
{
CInt objN(1);
objN++;
}
编译结果:显示未定义该运算符
但是将main函数中改为++objN;
,可以正常编译。
因此我们知道以下写法是一种前缀++
写法,++n
有效
CInt operator++() {
return ++m_int;
}
2. 后缀++写法,n++有效
对应编译器规定的
后缀++
写法如下:
//后缀++写法,n++有效
CInt operator++(int) {
return m_int++;
}
整体代码如下:
#include <iostream>
class CInt {
public:
CInt(int n) {
m_int = n;
}
//后缀++写法,n++有效
CInt operator++(int) {
return m_int++;
}
private:
int m_int;
};
int main(int argc, char* argv[])
{
CInt objN(1);
objN++;
}
3. new重载方法
前面我们已经讲过
new
也是一种运算符,通过以下方式对
new
进行重载
#include <iostream>
class CInt {
public:
CInt(int n) {
m_int = n;
}
//new是一种运算符
void* operator new(size_t cb)
{
return new char[cb];
}
private:
int m_int;
};
int main(int argc, char* argv[])
{
CInt* p = new CInt(123);
}
4. 转换运算符
以下写法为转换运算符的写法,会将自定义的类转换为我们想要转换的类型。
以下的写法将CInt
类转换为int
类型
//转换运算符,运算符重载优先级更高于转换运算符
operator int() {
return m_int;
}
从而在main
中可以像下面代码中使用int
的操作,而不需要重载+
#include <iostream>
class CInt {
public:
CInt(int n) {
m_int = n;
}
//转换运算符,运算符重载优先级更高于转换运算符
operator int() {
return m_int;
}
private:
int m_int;
};
int main(int argc, char* argv[])
{
CInt objN(1);
objN = objN + 1;//当+重载时,+没有定义,系统默认匹配到转换运算符位置进行转换
}
5.学习视频地址:C++57个入门知识点_54 转换运算符