首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么istream类的operator<<在C++中有引用的返回/参数类型?

istream类的operator<<在C++中有引用的返回/参数类型是为了实现链式操作。在C++中,引用类型可以通过返回引用来实现对同一对象的连续操作。

当我们使用istream类的operator<<时,通常会连续使用多个操作符来实现对输入流的处理,例如:

代码语言:cpp
复制
cin >> a >> b >> c;

这里的operator>>是istream类的成员函数,它返回一个引用类型的对象,即istream类的对象本身。这样,我们就可以将多个操作符连接在一起,实现对输入流的连续处理。

如果operator>>返回的是非引用类型,那么每次调用operator>>时都会返回一个新的临时对象,而不是原始的输入流对象。这样就无法实现链式操作,而需要使用多个独立的语句来处理输入流,使代码变得冗长。

通过返回引用类型,operator>>可以将输入流对象传递给下一个操作符,使得连续的输入操作可以在一行代码中完成。这样不仅简化了代码,还提高了代码的可读性和易用性。

总结起来,istream类的operator<<在C++中有引用的返回/参数类型是为了实现链式操作,使得对输入流的连续处理可以在一行代码中完成。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )

指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 ---- 1 ....参数使用语言环境 : 引用类型参数只能在 C++ 环境中使用 , 指针类型参数可以用于 C / C++ 两种语言环境中 , 因此很多基础库 如 FFMPEG , OpenSL ES 等使用的都是指针类型参数...C++ 中的引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数的情况 , 使参数具有返回结果的能力 ; 3 ....作用及意义 : ① 具有返回值能力 : 使用引用作参数 , 可以将参数当做返回值使用 ; ② 提高参数传递效率 : 大型对象作参数时 , 使用引用类型 , 可以提高参数传递效率 ; 更多关于引用的内容参考...引用作为参数和返回值 ---- 引用作为参数和返回值 : 如果是引用作为参数 , 修改 N 维指针指向的地址 , 那么需要传入 N 维指针的引用即可 ,在函数中修改该引用 , 即可修改外部的被引用的变量

2.2K20

【C++】C++ 引用详解 ① ( 变量的本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )

一、变量的本质 - 引入 " 引用 " 概念 " 引用 " 语法 是 C++ 语言中 特有的 , 在 C 语言中是没有 引用 这个概念的 ; 1、变量的本质 - 内存别名 分析 引用 之前 , 先回顾下...返回值使用 ; 二、引用语法简介 ---- 1、语法说明 " 引用 " 语法如下 : 类型& 引用名称 = 变量; & 符号建议紧贴类型写 , 与 引用名称 使用空格隔开 ; ( 指针符号 * 建议也是紧贴..., 也实现了变量交换 ; C++ 中的引用使用非常简单 , 没有使用指针进行操作 ; 在使用引用时 , 可以看到 引用的效果 , 实际上等同于一级指针 ; 使用引用作为函数参数时 , 传入的实参不需要使用取地址符获取...---- 1、复杂类型参数的三种传递方式 定义一个结构体类型 , 想要传递结构体对象到函数中 , 有三种方式 ; // 定义一个结构体 // C++ 中结构体就是类 struct Student {...引用 , 引用只是变量的一个别名 , 几乎不消耗性能 ; 参数访问 : 传入的 引用 参数 在函数中 使用 .

1.1K21
  • 类和对象:运算符重载

    前言: 在C++中,运算符重载是一种强大的特性,它允许我们重新定义已有的运算符,以便用于用户自定义的数据类型。...通过运算符重载,我们可以使得我们自定义的类对象像内置类型一样进行运算,这为编写清晰、简洁且易于理解的代码提供了便利。 为什么要进行运算符重载?...运算符重载的语法 函数原型:**返回值类型 operator操作符(参数列表)** 注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符...当运行到使用重载运算符的时候就会进行调用重载函数: 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值...,所以在函数内定义一个对象进行储存++前的数据,不使用引用返回,使得在返回后构造函数,使程序正常进行。

    12310

    返回类型引用(ref-qualified)的C++成员函数暗示了什么?

    一、引子:返回引用类型的成员函数是 暗示了使用它的this指针是左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针是左值还是右值都是调用同一个函数。...那理解到这里是对的吗?----二、解释:先说结论,来说一个c++的一个理解。...而另一种写法A{}.inc()是被允许的。这是consistency的做法。...有时候一个成员函数需要有能力从类中取到资源,那么他就能被右值rvalue call到,否则,它就是const修饰的成员函数。...----四、未来C++23在 C++23 有显式的对象, 因为用户可以forward上次的references. 也有可能简单地写一个non-static成员函数。

    21220

    由浅入深理解面向对象思想的组成模块

    特性 析构函数名是在类名前面加上“ ~ ” :~Stack() { } ; 无参数和返回值; 一个类只能有一个析构函数。...拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。...⾃动⽣成的拷⻉构造对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型成员变量会调⽤他的拷⻉构造(深拷贝)。 为什么拷贝构造函数参数一定要以引用的形式?...) 如何定义及使用 运算符重载是具有特名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他 函数⼀样,它也具有其返回类型和参数列表以及函数体 。...C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。 前置++ 前置递增运算符直接修改对象本身,并返回修改后的对象的引用。返回引用的原因是为了提高性能和节省内存。

    8310

    C++实现一个简单的String类

    C++实现一个简单的String类 使用基本的C++知识实现一个简单的String类,这个类中包含了C++常用的知识点。感觉是很有意思的一个小代码片段。...类声明 该类中包含了三个构造函数:有参数的构造函数,拷贝构造函数已经移动构造函数 重载了[],=(一个普通赋值运算符,一个移动赋值运算符),+,==四个运算符 一个用于求字符长度的方法;一个用于获取...init(str); cout << "默认构造函数(" << *this << ")\n"; } String::String(const String& other) { // 在类的成员函数中可以访问同类型实例的私有变量..._buffer); } } /* * 关于是返回对象本身还是返回对象引用 * 如果函数返回在函数中创建的临时对象,则不要使用引用 * 如果函数返回的是通过引用或指针传递给它的对象,则应当按引用返回对象...7行和第11行各自调用一次默认的有参构造函数,第14行是重载的加法运算符中调用了一次无参的构造函数(由于C++编译器的优化,函数返回值没有调用拷贝构造函数)

    1.6K10

    【C++】实现日期类相关接口

    对于temp属于临时对象,出了函数作用域就会销毁,因此只能传值返回,不能返回引用 侧面反映了this虽然不能在参数部分显式写,但是可以在函数体内使用,这样子设计是有需求的。...在实现operator+=/+,都可以间接实现operator+/+= 这里operator+=使用日期加天数,提高了效率和避免传值返回中的拷贝过程 operator+这里不能使用引用返回,这里是创建了一个临时变量...类,cin属于istream类,可以自动识别类型 对于我们可以在日期类中,实现>重载打印日期和提取日 int main() { Date d1(2024, 3, 10); //void...,就可以自己设计参数部分的位置 但是又引出了另一个问题:类外不能访问类中的私有成员,如果将私有权限放开,就缺乏安全性,对此C++中有友元,接下来我们会涉及到,这里就使用下,虽然这个全局函数不在类中,但是可以访问私有成员函数...因为这里的结合性是从左往右,**cout返回一个临时变量,那么这里运算符重载函数需要通过引用返回了。C++存在私有的,printf不支持自定义打印,cout本质实现所用类型的打印。

    7910

    【C++篇】深度解析类与对象(中)

    这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。 一、类的默认成员函数 在C++中,编译器会为每个类自动生成一些成员函数,即使你没有显式地编写这些函数。...自定义类型是指通过 class 或 struct 等关键字定义的类型。 2.3 构造函数的类型 C++中,构造函数可以有多个类型,主要包括: 无参构造函数:用于初始化一个对象,没有需要用户提供的参数。...三、析构函数 3.1 析构函数的作用 析构函数是用于销毁对象的特殊成员函数。它的名字是在类名前加上波浪号~,没有参数且没有返回值。...3.2 析构函数的特点 1.函数命名:析构函数的名字是在类名前加上 ~,例如,类 Stack 的析构函数为 ~Stack()。 2.无参且无返回值:析构函数没有参数,也不需要返回类型。...4.2 拷贝构造函数的特点 1.构造函数重载:拷贝构造函数是构造函数的一种重载。 2.参数要求:第一个参数必须是类类型对象的引用,不能用传值方式,否则会引发无限递归。

    12410

    在Java中为什么不同的返回类型不算方法重载?

    本文已收录《Java常见面试题》:https://gitee.com/mydb/interview 方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载...doSomething } public void method(Integer id, String name) { // doSomething } } 为什么不同返回类型不算方法重载...从方法签名的组成规则我们可以看出,方法的返回类型不是方法签名的组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回值类型不同的方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名的一部分呢?...总结 在同一个类中定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。方法重载的典型使用场景是 String 中的 valueOf 方法,它有 9 种实现。

    3.4K10

    C++初阶类与对象(三):详解复制构造函数和运算符重载

    (一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用(是构造函数的重载) 拷贝构造函数典型调用场景(自动调用): 使用已存在对象创建新对象 函数参数类型为类类型对象 函数返回值类型为类类型对象...拷贝构造函数的参数只有一个且必须是类类型对象的引用(&),使用传值方式编译器直接报错,因为会引发无穷递归调用 为什么会无限递归:当我们传值调用函数时,首先传参–>因为是传值会调用新的一个拷贝构造–>...函数返回值类型为类类型对象 2.赋值运算符重载 2.1运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似...函数原型:返回值类型 operator操作符(参数列表) 注意: 重载双操作数的运算符,第一个参数是左操作数,第二个参数是右操作数 不能通过连接其他符号来创建新的操作符:比如operator...} // 后置++: // C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递 Date operator++(int)// 前置++和后置++都是一元运算符

    21610

    【C++】操作符重载的应用—— 重现

    一.流插入,流提取 【流插入的库是在iostream里,流提取的库是在ostream里】 可以支持内置类型是因为在库里面实现了 可以支持自定义类型,是因为人为进行了函数重载 图示:...,只能将流插入重载写在类外(虽然流提取不会出现这种情况,为了统一,一并写在类外) 2.流插入写在类外访问类内成员的方法——友元 但是类内的成员是private(私有的),我们可以通过友元(声明操作符重载函数能进入类内访问的权限...YY的C++知识合集博客,关于const的解读) PS:const加在后面表示const Date* this ;表明在该成员函数中不能对类的任何成员进行修改,而+=,-=是要实现对类内成员的改变,因此不能加...前置的是【先赋值后使用】:返回的是本身(Date&接收)(引用提高效率) 后置的是【先使用后赋值】:返回的是临时变量(Date接收)(不用引用,因为临时变量出作用域即销毁,引用会变成野引用) 2.如何在定义与声明中区分前后置...增加参数int,构成函数重载 2.代码展示: 类内声明: //增加这个int参数不是为了接收具体的值,仅仅是占位,跟前置++构成重载 Date& operator++(); Date operator

    10610

    【C++ 类和对象 进阶篇】—— 逻辑森林的灵动精灵,舞动类与对象的奇幻圆舞曲

    如果⼀个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。...拷贝构造函数的第⼀个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语法逻辑上会引发无穷递归调用。...拷贝构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引用,后面的参数必须有缺省值。...5、运算符重载 在 C++ 中,运算符重载(Operator Overloading)允许你为自定义类型定义或修改运算符的行为,使得可以使用运算符来操作类的对象。...赋值运算重载的参数建议写成 const 当前类类型引用,否则会传值传参会有拷贝 有返回值,且建议写成当前类类型引用。引用返回可以提高效率,有返回值目的是为了支持连续赋 值场景。

    3900

    【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载

    语义上:前置运算符的语义是先对对象进行递作,然后返回操作后的对象。这里的关键是“操作后的对象”。 效率:返回引用避免了不必要的创建和返回对象的拷贝。在C++中,对象的复制可能是一个昂贵的操作。...语义上:后置运算符的语义是先返回操作后的对象,然后对对象进行递作。后置运算符的关键在于返回操作前的状态。 安全性:返回拷贝还避免了潜在的外部修改,此时得到的是一个独立的值,而不是对原始数据的直接引用。...前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递。..._day << "日" << endl; // 返回输出流的引用,以便支持链式调用 return out; } // 重载输入流操作符>>,用于从输入流中读取数据并设置到Date对象中 istream...d.CheckDate()) { cout << "日期非法" << endl; } // 返回输入流的引用,以便支持链式调用 return in; } 为什么参数顺序为(ostream

    10410

    C++:类与对象(2)

    4.3 使用场景 1、使用已存在对象创建新对象 2、函数参数类型为类类型对象 3、函数返回值类型为类类型对象 为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用...5.1 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...函数原型:返回值类型 operator操作符(参数列表) 注意事项: 1、不能通过连接其他符号来创建新的操作符:比如operator@ 2、重载操作符必须有一个类类型参数 3、用于内置类型的运算符...5.2 赋值运算符重载 特性1:参数类型:const T&,传递引用可以提高传参效率 特性2:返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 特性3:检测是否自己给自己赋值...类,cin属于istream类 我们还可以发现为什么cout和cin可以自动识别类型呢??

    13410

    类和对象(万字总结!深度总结了类的相关知识)(中)

    命名:构造函数的名字与类名相同(在C++中),没有返回类型(即使是void也没有)。 重载:构造函数可以被重载,即可以定义多个构造函数,参数列表不同以实现不同的初始化方法。...4.2 拷贝构造函数的定义 在C++中,拷贝构造函数的定义通常如下: class A { public: A(const A& other); // 拷贝构造函数 }; 参数:它接受一个自身类型对象的引用作为参数...为什么返回 *this? 返回 *this(即当前对象的引用)是为了支持连续赋值操作。...返回类型: istream& 函数返回一个对输入流 (istream) 的引用。这使得可以支持链式输入操作。...参数: istream& in: 输入流的引用,通常是 std::cin 或其他 istream 类型的输入流(如文件流 std::ifstream)。

    9810

    C++类和对象(中)【下篇】

    赋值运算符重载 运算符重载 当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。...C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。 运算符重载是具有特殊名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。...重载操作符⾄少有⼀个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y) 重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多...下面我们可以看到,d1是个隐含this指针,把d2的年/月/日赋值给d1,但是为什么要引用返回d1呢。...引用返回ostream流,因为出了作用域cout还在。 返回cout 我们可以看到连续插入了3个日期。 流提取 cin是istream类型的对象 流提取,提取我们从键盘输入的数据,写入日期里。

    9610

    【C++】类和对象练习——日期类的实现

    那对于+的重载: 大家有没有注意到我们没有返回引用,为什么? 因为我们返回的是啥,是不是tmp,而tmp是一个局部的对象,出了作用域就销毁了,所以我们不能返回引用。...C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递(它的作用就是为了构成重载),编译器自动传递。 所以呢,这样搞就行了。...为什么我们的内置类型可以直接用,因为库里面已经对这些类型都进行了重载,所以可以自动识别类型,是根据操作数的不同类型进行匹配。 那我们现在自定义类型想用怎么办,是不是需要自己重载啊。...我们测试一下: 但是我们使用的时候发现报错了。 这里操作数是不是写反了,为什么? 对于函数重载来说,两个参数的话,第一个参数是左操作数,第二个参数是右操作数。...是在类外不能访问私有的成员变量,那怎么办? 可以把成员变量变成共有的public,但这样是不是就不能很好的保证封装性了; 或者可以提供Get方法,但C++一般不喜欢这样搞。

    33310
    领券