C++---运算符重载(1)

运算符重载功能很强大,可以方便很多操作
这些简单看一下它都有哪些用法:
比如,当我们要对两个字符串直接拼接在一起的时候,通常我们利用append()函数,
那能不能简单地直接用+号连接呢,类似于下面

’ + ’ 号重载

	string a = "Hello ";
	string b = "World";
	cout<< a + b << endl;

如果直接这样用,那肯定是会报错的
这时候,我们可以重载+号运算符实现直接加起来的效果

#include <iostream>
#include <string>
using namespace std;

string operator+(string a,string b)//这里对+号运算符进行重载
{ 
   string tmp;
   tmp = a.append(b); //内部使用append()函数实现两个字符串拼接
   return tmp;        //返回一个拼接后的string
}

int main()
{
	string a = "Hello ";
	string b = "World";
	cout<< a + b << endl;
}

又或者,我们想让我们自定义的类型进行相加,比如结构体,
我们想要实现两个结构体钟的某个成员相加,
同样也可以利用重载+号运算符来达到目的

#include <iostream>
#include <string>
using namespace std;

//定义一个结构体
struct competitor{
   string name;
   int sport_score;
};

//重载+号运算符
int operator+(competitor a,competitor b)
{
    int tmp;
    tmp = a.sport_score + b.sport_score;
    return tmp;
}

int main()
{
    competitor A = {"tom",90};
    competitor B = {"jack",89};
    competitor C = {"Duncan",79};
    C.sport_score = A + B;//这里直接就可以两个结构体相加
    cout<<C.sport_score<<endl;

    return 0;
}

又或者其他,我们想让两个类中的某个属性相加,也可以重载+号运算符来达到目的

’ << ’ 重载

这里我们希望输出类的某个属性的时候,通过直接输出类对象名直接输出这个属性

#include <iostream>
#include <string>
using namespace std;

class Dog{
    friend ostream & operator<<(ostream &cout, Dog &a);//使用友元,让运算符可以访问类的私有成员
public:
    Dog(string col, int h)//定义构造函数初始化类属性
    {
       color = col;
       height = h;
    }
private:
    string color;
    int height;
};

//使用全局函数重载,而不使用类的成员函数去重载
ostream & operator<<(ostream &cout, Dog &a)
{
    cout << a.color ;
    cout << a.height ;
    return cout;
}

int main()
{
    Dog B("white",50);

    cout << B << endl;
    return 0;
}

返回值为ostream流类型,不会影响后续正常操作,有一种链式编程思想,
这里不是很懂,搞懂了会再说说链式编程思想

其中一些细节问题:在重载<<的时候,不应该在里面输出换行符,也是为了不影响后续操作,让用户在正常使用<<的时候有权控制更多的输出细节

其中,为什么要使用全局函数重载输出运算符
如果我们使用成员函数去重载输出运算符
会出现

class Harsh{
 //这里重载了<<运算符
}
//想要输出的时候,就会变成
Harsh A;
A  << cout;

cout在右边,会不会很奇怪。
在C++Primer里面有写:假设输入输出运算符是某个类的成员,则它们也必须是istream或ostream的成员。然而,这两个类属于标准库,并且我们无法给标准库中的类添加任何成员。因此,如果我们希望为类自定义IO运算符,则必须将其定义成非成员函数。当然,IO运算符通常需要读写类的非公有数据成员,所以IO运算符一般被声明为友元。

发布了14 篇原创文章 · 获赞 30 · 访问量 8723

猜你喜欢

转载自blog.csdn.net/weixin_43086497/article/details/104951114