C++中输出流运算符的重载
cout是ostream类的对象,cin是istream类的对象。
我们平时用的cout<<就相当于cout.operator<<(...)。也就是说正常使用(不对operator<<进行函数重载,我们用的都是ostream类库中本身定义好了cout对象的成员函数)
而当我们需要对cout<<进行重载时,比如我们定义了一个类Student,他的一个对象s1,我们想要cout<<s1,这时<<的意义就改变了,因此如果我们想按照我们自己的个性化需求来使用<<运算符,就需要对其进行重载,而重载分为重载为全局函数和引入为类的友元函数,由于我们是要通过cout这个iostream头文件中定义的对象来调用operator<<这个函数,当我们cout<<一个自定义的对象时,编译器在cout本身定义<<的那些基础数据类型中找不到参数满足我们需要的函数,这时有个全局函数的签名满足我们的需要,因此这个函数就是我们最终调用的函数,也就是我们重载<<运算符的函数。
ex:类的友元函数
ostream& operator<<(ostream& co,const Student& s) {
co<<s.sname<<endl;
return co;
}
关于这个函数,有两点值得注意:
(1)它的返回值,是这样理解的:
cout<<5<<"hello";
在我们输出了一个5以后返回的是调用第一个<<的对象的引用,即相当于第一个cout,我们就可以接着连续的用同一个cout来调用第二个<<函数了。
(2)之所以把全局函数以友元的形式引入class Complex中是因为在这个重载函数的实现过程中,我们往往需要引用实参对象中的一些非公有的对象,而这时就必要获得权限,C++中的做法便是将其以友元的形式引入class Complex中。
C++中输出流运算符的重载的更多相关文章
- C++重载输入流、输出流运算符
在c++中类的私有成员是不能被直接访问的,需要通过类中提供的成员函数简介的操作这些数据.同时C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型 ...
- C++中的运算符重载注意事项
1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Python 中的运算符重载
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...
- C++中运算符的重载
运算符重载相当于运算符的函数重载,用于对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型.我们之前提到过C++中的函数重载,可以根据形参的不同调用不同的函数,那么运算符重载跟函数重载的 ...
随机推荐
- SGU131--NYOJ435
参考blog http://m.blog.csdn.net/blog/u012760629/36927465 http://www.cppblog.com/menrowitianya/archive/ ...
- shell 数组(in_array)
if [[ ! "${array[@]}" =~ $val ]] ; then fi
- html跳转到同一个页面的不同位置
<html> <body> <p><a href="#C4">查看 Chapter 4.</a></p> & ...
- Spring 3.0就这么简单读书笔记
一般情况下,spring容器中的大部分Bean都是单实例的,所以一般无须通过@Repository.@Service.@Component等注解的value属性为Bean指定名称,也无须使用@Qual ...
- MySQL数据库备份与恢复方法(转)
来源于:http://www.jb51.net/article/25686.htm 网站数据对我们对站长来说都是最宝贵的,我们平时应该养成良好的备份数据的习惯. 常有新手问我该怎么备份数据库, ...
- 《CSS网站布局实录》学习笔记(四)
第四章 CSS网站元素设计 4.1 网站导航 网站导航是网站中最重要的元素.从形式上看,网站导航主要分横向导航.纵向导航.下拉及多级菜单导航灯3种常见形式. 横向导航:作为门户网站的设计而言,主导航一 ...
- iOS改变图片尺寸
- (UIImage *)originImage:(UIImage *)image scaleToSize:(CGSize)size { UIGraphicsBeginImageContext(siz ...
- (三)Angularjs - 小实例
AngularJS处理数据表格 使用 np-repeat 指令 <table> ... <!-- 这里使用ng-repeat指令来重复数据生成表格 --> <tr ng- ...
- sql语法图
- jdk与cglib的动态代理
JDK动态代理中包含一个类和一个接口: InvocationHandler接口: public interface InvocationHandler { public Object invoke(O ...