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

2024-12-18 20:55:41
推荐回答(5个)
回答1:

看来你是前面的没学懂,你问的这几个问题根本就与重载的操作符函数无关
&是引用,引用说白了就是对变量取了个别名,比如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<因此,这里是声名了一个函数,其名称是operator <<,他有两个形参, 一个是ostream 类型的引用,一个是Date类的对象,这个函数反回ostream&类的引用,同时他是某个类的友元函数

友元函数:友元函数其实也没那么难,一个类的友元函数就是说这个函数可以访问类的私有成员而已。举例,假设你这个重载的<<不是友元,假设他的形式为ostream & operator <<(ostream &os){....},假设他是Date类的成员函数,则Date ma; 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++模板专题》应该对你有帮助。

回答2:

首先,我也是初学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<满意就采纳吧,我快没财富了,呵呵!

回答3:

首先,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“来得讽刺一些。^_^

回答4:

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)

回答5:

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