重载<< >>

碰到fa + fb的两种解析规则,首先去类的成员函数中找一个函数operator+(constFraction& fb),找不到则去全局区找一个全局函数operator+(constFraction& fa, const Fraction& fb),这里的意思就是说,我们可以把重载函数写成成员函数的形式,也可以写成全局函数的形式,博主建议,能写成成员函数的就不要写成全局函数,而且最好只选取一种方案。

上面这句话来自于http://blog.youkuaiyun.com/uestclr/article/details/51126112,可以好好阅读,有助于理解运算符重载。



cin>>是由istream类支持的,cin是类 istream 的一个对象;

cout<<是由ostream类支持的,cout是类ostream的一个对象;

其实,<<  和 >>重载了按位移的运算符,并且只能对c++中的标准数据类型进行输入和输出。


如何重载<<  >>使它们能输入和输出用户自己定义的类型的数据呢?

对“<<”和“>>”重载的函数形式:

形式:

ostream& operator <<(ostream&, const 自定义类 &)

因为由cout<<可知,<<运算符的第一个运算量是cout,它是ostream类的一个对象,因此函数的第一个参数是ostream类型的引用;

第二个参数是要输出的自定义类的引用;

istream& operator>>(istream &, 自定义类&)//这里第二个参数前面没有const


由上面可知,因为这两个操作符的第一个运算量不是我们正在定义的类,所以<<  >>的重载不能用成员函数。因此,

将这两个运算符的重载函数作为友元函数或普通函数。


重载流插入运算符<<:



对于上面的重载函数来说,之所以返回值为ostream类型的引用,是为了能连续输出多个值,

其中,cout<<c2<<c2;等同于

operator<<(operator<<(cout,c1),c2)。


重载流提取运算符“>>”:

需要注意的是,这里面的第二个参数不是const,原因在于,这里面的第二个参数是放从键盘上输入的值的,

必定会改变的。

istream& operator>>(istream& input,Complex c)

input>>c.real>>c.imag;//可以这样为对象c进行初始化!!!

return input;//同样是为了能够连续的输入
}

但是上面的程序太简单了,输入的时候并不是严格的复数的形式,因此有下面的实现:




对于上面的函数来说,在istream重载函数中,c2只是一个局部变量,这个函数结束之后这个变量就会被释放,因此它的值并不会传递给main函数中的c1和c2中去,如果想用*this指针将它的值复制给当前对象就更错了,因为*this指针只能在成员函数中被引用。

### C++ 中运算符重载 #### 方法概述 在 C++ 中,运算符重载允许程序员定义类对象之间的操作行为。通过这种方式可以实现更加直观的操作方式[^1]。 对于不同的运算符,其重载的方式也有所不同。例如加法运算符 `+` 可以被用于自定义类型的相加逻辑;乘法运算符 `*` 则可用于表示两个对象间的某种形式的组合或交互。 #### 实现细节 当在一个类内部声明成员函数来重载二元运算符时(如 `operator+()`),该成员函数通常接收一个参数并隐含地接受当前实例作为第一个参数 (`this`)。下面是一个具体的例子展示如何为名为 `Person` 的类重载加法运算符: ```cpp class Person { public: int m_a; double m_b; // 构造函数 Person(int a, double b):m_a(a), m_b(b){} // 成员函数版本的 operator+ Person operator+(const Person& other) const{ return Person(this->m_a + other.m_a, this->m_b + other.m_b); } }; ``` 上述代码展示了怎样创建一个新的 `Person` 对象并将两个现有对象的数据成员相加以返回新对象的结果[^2]。 另外一种常见的做法是以全局友元 (friend) 函数的形式来进行运算符重载,这使得语法上看起来更自然,并且支持左操作数不是本类的对象的情况。这里给出同样的加法运算符重载但是采用非成员函数的方式来完成: ```cpp // 声明为 friend 以便访问私有/保护成员变量 friend Person operator+(const Person& lhs, const Person& rhs){ return Person(lhs.m_a + rhs.m_a, lhs.m_b + rhs.m_b); } ``` 这两种方法都可以有效地达到相同的效果,在实际编程过程中可以根据具体需求和个人偏好选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值