前面在C++57个入门知识点_51 运算符重载引出和简要介绍(作用:使代码简洁;运算符重载定义:重载已有运算符,赋值新功能;运算符重载本质还是函数调用,operator+=即为函数名;有些可重载有些不可以)中我们介绍了运算符重载的基本知识点,cstring的基本用法。C++57个入门知识点_52 cin&cout的奥秘(文件和流;cin是istream的对象,cout是类ostream的对象;endl本质是函数;<<(左移运算符)是一种运算符重载)中介绍了cin/cout的本质。下面通过一个例子将字符串的管理及运算符重载的2大类型在实际工作中的使用方式。
总结:
运算符重载方式:
1. 类成员的运算符重载:通过在类中进行运算符重载;
2. 友元全局的运算符重载:由于类的封闭性,可以通过类外实现友元全局的运算符重载
3. operator关键字表示对其后的运算符进行重载
本篇我们将通过手动写一个字符串的管理类,来理解运算符重载的两种方式。
1. 类成员的运算符重载
以下代码中是采用类成员的运算符重载的方式,在CMystring
类中通过CMystring& operator=(const char* psz)
对=
号进行了重载,因此在main
中使用str = "hello world";
也是可以正常编译通过的
#include <iostream>
class CMystring {
public:
//类成员的运算符重载
//=的运算符重载,借鉴整数型的返回值为数据本身类型,返回值为CMystring的引用
//建议返回值采用引用的方式
CMystring& operator=(const char* psz)
{
//因为没有定义psz的大小,可能会大于256个字节,导致溢出,系统建议用strcpy_s
strcpy_s(m_szBuf, psz);
return *this;
}
private:
char m_szBuf[256];
};
int main(int argc, char* argv[])
{
CMystring str;
str = "hello world";
return 0;
}
运行结果:
由于返回的为对象的引用,因此在main
中可以写成str2=str = "hello world";
的形式
int main(int argc, char* argv[])
{
CMystring str;
CMystring str2;
str2=str = "hello world";
return 0;
}
运行结果:str2和str的地址不同,看起来默认执行的深拷贝操作
关于str2=str
,其也是对=进行了运算符重载,重载方法大致为以下方式,只不过我自己写的代码内部没写逻辑
CMystring& operator=(CMystring& c)
{
return c;
}
上面str2=str
应该是执行了默认的=运算符重载,具体内部后期再研究
2. 友元全局的运算符重载
前面我们学习过cin
和cout
的使用,通过cout<<"hello world"
就可以实现字符串的输出,而当我们在前面代码的基础上想要输出CMystring
的类型时编译就会显示如下错误
从上篇文章可知,cout
是类ostream
的对象,<<(左移运算符)
是一种运算符重载是,在C++编写cout类内部<<
重载时并不认识新的CMystring
的类型,因此并未重载CMystring
的类型,因此无法编译通过。
常规的解决方案可能是重写<<
的运算符重载,实际上是无法实现的,因为cout
类是本身就有的,因此无法在其内部添加新的运算符重载,因此考虑另一种方案,在类的外部写友元全局的运算符重载
。
具体写法如下:
#include <iostream>
/*
1.类成员的运算符重载
2.友元全局的运算符重载
*/
class CMystring {
public:
//类成员的运算符重载
//=的运算符重载,借鉴整数型的返回值为数据本身类型,返回值为CMystring的引用
//建议返回值采用引用的方式
CMystring& operator=(const char* psz)
{
//因为没有定义psz的大小,可能会大于256个字节,导致溢出,系统建议用strcpy_s
strcpy_s(m_szBuf, psz);
return *this;
}
//使用友元可以调用私有成员
friend std::ostream& operator<<(std::ostream& out, CMystring& str);
private:
char m_szBuf[256];
};
//在类的外部,友元全局的运算符重载
//左移符号<<本质上有两个参数,左边对象和右边对象
std::ostream& operator<<(std::ostream& out, CMystring& str)
{
out << str.m_szBuf;
return out;
}
int main(int argc, char* argv[])
{
CMystring str;
CMystring str2;
str2=str = "hello world";
std::cout << str<<123;
return 0;
}
运行结果如下:同样实现运算符重载的效果
3.学习视频地址:C++57个入门知识点_53 类成员的运算符重载及友元全局的运算符重载