C++重载运算符。 太TM难了。 进来看看

太TM的看了。 还有友元重载运算符。 我晕死。 完全看不怎么懂。
刚学到了模板,模板属于高级应用了?? 还有STL标准库重要吗?
类模板中的什么 定制类模板啊,定制类模板成员函数 这些重要吗??
friend ostream& operator<<(ostream& os,const Date t)
{
cout << "Month: " << t.iMonth << ' ' ;
cout << "Day: " << t.iDay<< ' ';
cout << "Year: " << t.iYear<< ' ' ;
return os;

这个是啥意思。os哪里来的? &是啥意思哦。 解释下
学起来好难。 前面都不怎么难。。。 这本书说这个是高级应用,还真的是- -。 难死了。。 求解释。

看来你是前面的没学懂,你问的这几个问题根本就与重载的操作符函数无关
&是引用,引用说白了就是对变量取了个别名,比如int a=1; int &b=a; 这时随便你在哪里使用名称b就和使用a一模一样。

ostream &os; //这句的意思是,os&是ostream类型的一个引用,至于他引用的是哪个变量,这要看函数传递过来的实参了,在这里ostream是一个类,是在C++库文件中写的一个类,他是使用class创建的,比如class ostream{...};当然,这个类里的具体内容就不讲了吧。

friend ostream& operator<<(ostream& os,const Date t)
这是一个函数头,也就是说他是一个函数,这个函数的名称是operator <<,你要记住的是重载操作符运算符函数,是叫函数,他和普通函数一模一样,但有一些限制,使用方法可以和普通函数一样(当然还有他的特殊用法)。就拿这个题来说,假设重载的<<是类Date的友元,则可以这样调用这个函数Date ma; cout<<ma; 或者operator<<(cout, ma); 语句cout<<ma会被自动转换为operator<<(cout,ma)的形式的。
因此,这里是声名了一个函数,其名称是operator <<,他有两个形参, 一个是ostream 类型的引用,一个是Date类的对象,这个函数反回ostream&类的引用,同时他是某个类的友元函数

友元函数:友元函数其实也没那么难,一个类的友元函数就是说这个函数可以访问类的私有成员而已。举例,假设你这个重载的<<不是友元,假设他的形式为ostream & operator <<(ostream &os){....},假设他是Date类的成员函数,则Date ma; ma<<cin; 语句ma<<cout会被自动转换为ma.operator<<(cin);的形式,注意:在这种转换方法中,最左边的对象是调用操作符成员函数的对象,也就是不能写成cout<<ma这样的形式。

友元函数和成元函数的区别还在于,友元函数是一个独立的函数,他不能通对类的对象来调用(即点运算符)比如函数g()若是类A的友元函数,则A ma; ma.g();是错误的,因为函数g()不是类A的成员,再如若函数f()是类A的成员函数,也就是class A{public:....void f(){}...}; 然后A ma; 则ma.f();是正确的,因为函数f()是类A的成员。

注:cout和cin都是C++中iostream类的一个对象,对于cout<<使用的<<运算符,是在类中被重载了的,因此<<运算符就是一个重载的操作运算符。

将操作符重载函数声明为友元时,这时的操作符重载函数必须多一个形参,若操作符成员函数是类的成员函数,则要少一个形参,还有,有些操作符重载函数必须声明为友元才能达到目的。除了参数多一个和少一个之外没什么区别。

模板,一般来讲比较重要,因为用模板写的程序基本不上用考虑这个数据是什么类型(int, float, char等)。
STL也可以看看,这个比较容易。

若还有不明白就百度搜索《C++操作符重载专题》和《C++模板专题》应该对你有帮助。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-01-04
首先,我也是初学C++,说的不好的话,请见谅!!

以我的理解
1.重载<<运算符是必须使用友元函数的,因为如果你使用的是成员函数,参数列表的第一个参数就是本类的对象,而<<该运算符重载时,第一个参数必须是ostream的对象或者其引用
2.io指的是input输入和output输出,所以ostream就是输出流,istream就是输入流,在JAVA中会比较明显,用inputstream表示输入流,用outputstream表示输出流,其实也就是命名的不同而已
3.&表示引用,也就是某某东西的别名,与某某东西占用同一个地址空间,不同于取址&,这里用&于C++类库的ostream输出流的对象占用了同一个地址的话,你修改之,他才会被修改,不然,如果你不同&引用的话,就是开辟一个新的存储单元,也就是副本,你修改了输出方式,他类库的方式还是没有修改,后面再用cout输出,就没什么意义了。达不到效果
4.这是不是所谓的高级应用我就不知道了,我是学JAVA的,现在改C++,在一个入门书学的,这些内容都有,理解起来不难!

另外要说的是,其实我们用C++的cout输出一个东西,其实cout就是类库里面的一个ostream对象,那你用这个cout对象输出东西的时候,就用到了一个运算符<<,那现在我重载这个运算符的话,相当于,我传递进去的第一个ostream对象就是cout,这样说,其实你重写<<中第一个参数的ostream就是告诉编译器,我有一个otream对象cout要传递进去啦,就这么简单!!那为什么要返回一个cout呢?因为你用cout输出时,有可能带有几个<<,比如cout<<a<<b<<endl;那么你用cout<<a的时候返回一个cout,再用这个cout去<<b才行吧?不然你第一个输出a后,没有返回cout,怎么输出b?
满意就采纳吧,我快没财富了,呵呵!
第2个回答  2013-02-18
首先,C++模板是支撑C++许多高级优秀特性的基础,也是最令C++被人诟病的特性之一。STL是这些优秀特性的代表之一,尽管我不认为STL够优秀,看看优秀的boost库吧,你会更晕的。
其次,STL相当重要,其意义是使开发者得以抛开对许多细节的关注,集中精力解决目标问题。当STL不适用的时候,如果不用STL那么就得重新面对数据储存、排序、查找这些细节了。当然这些细节对学习者来说就是基础。STL重不重要还是自己说吧。
再次,类模板和函数模板是为了解决泛型问题推出的,即可以就处理所有类型的共同方式编写统一代码,不必逐一针对不同数据类型(光整型数就多少种自己数)逐一处理的问题,看情形觉得是否需要使用,但有些情形确实不适用类模板。就比如LZ提的输出日期类,显然它跟输出数值的手法还是有区别的。
再再次,LZ给的代码有问题,是书上的吗?改了下
friend ostream& operator<<(ostream& os,const Date& t)
{
os << "Month: " << t.iMonth << ' ' ;
os << "Day: " << t.iDay<< ' ';
os << "Year: " << t.iYear<< ' ' ;
return os;
}
这是重载输入输出运算符的标准手法,如果LZ不知道&是什么意思,建议停止向前学习,返回复习关于对象引用的基础内容吧。这样做是为了类接口友好,可以用cout<<来输出类。不过挑日期啊时间啊这种涉及本地化难题的例子这样做是最不合适的,就不细说了。
最后,关于LZ的ID,不如"大便GB2312“来得讽刺一些。^_^
第3个回答  2011-12-31
Standard STL 不要学, 把 POSIX 和SandardCLibrary 搞会就够了。
最重要不是别的,而是在达到目的的过程中保持清醒。

其实同样的效果,这段代码也能做到:

FILE* print(Date t){
printf("Month:%d \nDay:%d \n Year:%d \n",t.iMonth,t.iDay,t.iYear);
}

用法从 cout<<((Date)ref)
改成 print(ref)
第4个回答  2011-12-31
额。&表示隐用,就是说这个函数里面传入的os就是os类如果在这个函数中对os进行修改其中的某些属性或者行为会被修改,然后os
表示的是你传入的一个参数
这个参数的类型为ostream &型应该是一个类的隐用型,
这个运算符重载是对<<进行,执行的结果应该就是在每次返回一个友缘类的同时输出一个Data类中的属性不懂再问

C++重载运算符。 太TM难了。 进来看看
注:cout和cin都是C++中iostream类的一个对象,对于cout<<使用的<<运算符,是在类中被重载了的,因此<<运算符就是一个重载的操作运算符。将操作符重载函数声明为友元时,这时的操作符重载函数必须多一个形参,若操作符成员函数是类的成员函数,则要少一个形参,还有,有些操作符重载函数必须声明为友...

求c++高人!
main函数中的case3语句dft3=dft1-dft2;因为重载的-操作符反回的是int型,因此不能赋给dft3,把dft3修改为一个int型的变量,比如int i3=dft1-dft2现在可以运行了,但运行有错(指的是计算方法不对),有待偶继续研究。 以下是本人的修改,其中主要修改了重载+运算符函数,和第3个构造函数,因为这两个函数存在重大...

什么是“JAVA”?
Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心,Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理...

从以前其他语言作品移植了个c++程序,结果编译出错,从头到尾was not...
一.学好C语言的运算符和运算顺序 这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种...

c++语言中::是什么意思
作用域运算符 顾名思义就是一个变量或函数的作用域.什么叫作用域呢?for(int i=0;i<10;i++){ int num=5;} 这里的num的作用域只在for中有效.出了for就无效了.namespace mynum { int num=22;} 在名字空间mynum中定义了一个变量num=22;要访问这个变量就要用到作用域符 mynum::num=5;...

Java语言的特点
运算符重载(operatoroverload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。 继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体...

C++中做 时间的相加怎么弄啊 ?
public:Time(int h, int m, int s);Time operator +(const Time &t2);friend ostream & operator << (ostream & os, const Time t);private:int hour;int minute;int second;};Time::Time(int h, int m, int s){ if(h>0 && h<=23) hour = h;else cout<<"the value of ...

如何才能编写程序,需要什么?
现在大多数的编程语言都是编译型的,例如Visual Basic、Visual C++、Visual Foxpro、Delphi等。 这个问题其实很简单。前面我们讲到,程序是人与计算机进行沟通的唯一方式,因此我们要让计算机为我们服务,就必须有程序,而程序从哪里来?当然是由我们编写出来了。或许你又会问到另一个问题:现在要什么程序有什么程序,我干嘛...

学好Java到底能做什么?
Java已用动态的交互应用软件使Web栩栩如生。它使开发人员 具有‘编写一次到处运行TM”的巨大能力。而且,借助其JavaAPI 及其编程语言上的Java虚拟机,它已产生一种分布信息的崭新模式。这种模式叫做Java企业计算,正在帮助各企业以各种不同的方法取 得竞争优势。网管和控制已大大简化。软件分配基本上是免费...

高手们帮我看看c语言程序,请给每行代码和功能注释
一.学好C语言的运算符和运算顺序 这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多...

相似回答