| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5186 人关注过本帖, 1 人收藏
标题:C++ Primer Plus 学习中,不时更新一些自己感觉有趣,初学者可能还不知道的 ...
取消只看楼主 加入收藏
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
以上代码已经是正确的重载,分析时,我们可以回到重载的最初过程中来,为了实现基本的自定义对象的输出,可以像下面这样重载运算符:
void operator<<(ostream& os,const Time& t)
{
    os<<setw(2)<<setfill('0')<<t.hours<<":"<<setw(2)<<setfill('0')<<t.minutes;//这样可以使用cout<< <对象名>打印时间对象
}

但这种方法存在的问题是不允许通常那样将重新定义的<<运算符与cout一起使用,比如这样是不行的,对于Time对象t:cout<<t<<"Tuesday\n";
这是因为<<运算符要求左边是一个ostream对象,具体的说,它返回一个指向调用对象本身(一般是cout)的引用,所以对于cout<<x<<y;(cout<<x)的结果是返回一个cout对象,继而可以做cout<<y;而重载的<<运算符无返回类型时,将无法与cout一起使用,因此可以如上楼所示定义重载函数时返回一个指向ostream对象的引用。函数开始执行时已经传入一个引用对象,这样做的最终结果是返回值就是传递给它的对象。
cout<<t;将被转换为operator<<(cout,t);此调用返回cout对象,此时cout<<t<<"Tuesday\n";可以正常工作
这个版本还可以被用来写入到文件:
程序代码:
#include<fstream>
.........
ofstream fout;
fout.open("time.txt");
Time t(1,5);
fout<<t;
.....


重载<<显示c_name对象的一般模式:
程序代码:
ostream& operator<<(ostream& os,const c_name &obj)
{
    os<<.......;
    return os;
}


[此贴子已经被作者于2016-3-8 17:07编辑过]

2016-03-08 16:57
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
17.类的定义,常见算符的重载,友元函数存在的意义(之一吧算是)
程序代码:
#include <iostream>
using namespace std;
class complex0{
private:
    double real;
    double img;
public:
    complex0();
    complex0(double,double);
    complex0 operator+(complex0 cp);
    complex0 operator-(complex0 cp);
    complex0 operator~(){complex0 tmp;tmp.real=real;tmp.img=-img;return tmp;};
    complex0 operator*(complex0 cp);
    complex0 operator*(double x);
    ~complex0(){};
    friend ostream& operator<<(ostream& os,const complex0 cplx);
    friend istream& operator>>(istream& is,complex0& cpi);
    friend complex0 operator*(double x,complex0 cp);
};
complex0::complex0()
{
    real=0;
    img=0;
}
complex0::complex0(double r,double i):real(r),img(i)
{

}
istream& operator>>(istream& is,complex0& cpi)
{
    cout<<"real:";
    is>>cpi.real;
    cout<<"img:";
    is>>cpi.img;
    return is;
}
ostream& operator<<(ostream& os,const complex0 cplx)
{
    os<<"("<<cplx.real<<","<<cplx.img<<"i)";
    return os;
}
complex0 complex0::operator+(complex0 cp)
{
    complex0 tmp;
    tmp.real=real+cp.real;
    tmp.img=img+cp.img;
    return tmp;
}
complex0 operator*(double x,complex0 cp)
{
    return cp*x;
}
complex0 complex0::operator-(complex0 cp)
{
    complex0 tmp;
    tmp.real=real-cp.real;
    tmp.img=img-cp.img;
    return tmp;
}
complex0 complex0::operator*(complex0 cp)
{
    complex0 tmp;
    tmp.real=real*cp.real-img*cp.img;
    tmp.img=real*cp.img+img*cp.real;
    return tmp;
}
complex0 complex0::operator*(double x)
{
    complex0 tmp;
    tmp.real=real*x;
    tmp.img=img*x;
    return tmp;
}
int main()
{
    complex0 a(3.0, 4.0); // initialize to (3,4i)
    complex0 c;
    cout << "Enter a complex number (q to quit):\n";
    while (cin >> c)
    {
        cout << "c is " << c << '\n';
        cout << "complex conjugate is " << ~c << '\n';
        cout << "a is " << a << '\n';
        cout << "a + c is " << a + c << '\n';
        cout << "a - c is " << a - c << '\n';
        cout << "a * c is " << a * c << '\n';
        cout << "2 * c is " << 2 * c << '\n';
        cout << "Enter a complex number (q to quit):\n";
    }
    cout << "Done!\n";
    return 0;
}


[此贴子已经被作者于2016-3-30 10:42编辑过]

2016-03-30 10:26
快速回复:C++ Primer Plus 学习中,不时更新一些自己感觉有趣,初学者可能还不知 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018520 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved