首页
学习
活动
专区
工具
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.1K20

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

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

73321

和对象:运算符重载

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

8710

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

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

17820

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

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

6710

C++实现一个简单String

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

1.5K10

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

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

14910

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

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

8710

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

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

3.3K10

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

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

8310

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可以自动识别类型呢??

11310

C++ 运算符重载

由于-被重载为 Complex 成员函数,因此,第 23 行中a-b就被编译器处理成:  a.operator-(b);  由此就能看出,为什么运算符重载为成员函数时,参数个数要比运算符目数少 1...String 没有编写参数类型为 char * 构造函数,因此编译不能通过。 就上面的程序而言,对 operator= 函数返回类型没有什么特别要求,void 也可以。...cin 是 istream 对象,是头文件 中声明istream 将>>重载为成员函数,因此 cin 才能和>>连用以输入数据。...7 C++重载()(强制类型转换运算符)  C++ 中,类型名字(包括名字)本身也是一种运算符,即类型强制转换运算符。...为了解决这个问题,C++ 规定,重载++或--时,允许写一个增加了无用 int 类型形参版本,编译器处理++或--前置表达式时,调用参数个数正常重载函数;处理后置表达式时,调用多出一个参数重载函数

1.2K00

C++抛出异常与传递参数区别

抛出异常与传递参数区别 从语法上看,C++异常处理机制中,catch子句中申明参数函数里声明参数几乎没有什么差别。例如,定义了一个名为stuff,那么可以有如下函数申明。...相同点就是传递参数和传递异常都可以是传值、传引用或传指针。 (1)区别一:C++标准要求被作为异常抛出对象必须被拷贝复制。考察如下程序。...& operator>>(istream&, Stuff&); }; istream& operator>>(istream& s, Stuff& w) { w.addr(); cin>>w.n;...C++规定对被抛出任何类型异常对象都要进行强制复制拷贝, 为什么这么做,我目前还不明白。 (2)区别二:因为异常对象被抛出时需要拷贝,所以抛出异常运行速度一般会比参数传递要慢。...对象作为引用参数传递给函数时,不需要进行额外拷贝; 第二,对象作为异常被抛出与作为参数传递给函数相比,前者允许类型转换比后者要少(前者只有两种类型转换形式); 第三,catch子句进行异常类型匹配顺序是它们源代码中出现顺序

1.6K20

C++ 运算符重载

由于-被重载为 Complex 成员函数,因此,第 23 行中a-b就被编译器处理成:  a.operator-(b);  由此就能看出,为什么运算符重载为成员函数时,参数个数要比运算符目数少 1...String 没有编写参数类型为 char * 构造函数,因此编译不能通过。 就上面的程序而言,对 operator= 函数返回类型没有什么特别要求,void 也可以。...cin 是 istream 对象,是头文件 中声明istream 将>>重载为成员函数,因此 cin 才能和>>连用以输入数据。...7 C++重载()(强制类型转换运算符)  C++ 中,类型名字(包括名字)本身也是一种运算符,即类型强制转换运算符。...为了解决这个问题,C++ 规定,重载++或--时,允许写一个增加了无用 int 类型形参版本,编译器处理++或--前置表达式时,调用参数个数正常重载函数;处理后置表达式时,调用多出一个参数重载函数

1.1K20

C++和对象练习——日期实现

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

26510

C++C++ IO 流

需要注意是,自定义类型重载流插入和流提取运算符时,需要先将 operator> 声明为友元函数,然后再在外对函数进行定义,至于原因我们 和对象下篇 中有详细介绍..._day; return out; } 上下文转换 C++上下文转换指的是特定上下文环境中,将对象或表达式隐式地转换为其他类型。...派生向基转换:派生对象可以转换为基对象指针或引用,这样可以使得派生对象使用基成员函数和成员变量。...... } 可以看到,我们案例中包含了 string 类型;但是我们又发现,string 中重载流提取运算符 operator>> 返回值是 istream 类型对象。...>>,该函数返回一个 istream类型对象;同时,因为 istream 中还重载了 bool,所以 istream 对象会去调用 operator bool函数;operator bool 调用时如果接收流失败

29130

C++核心编程学习

:int a = 10; int &b = a; int c = 233; &b = c 3、做函数参数,可以达到指针效果 4、引用做函数返回值,可以作为左值 5、引用本质C++内部实现是一个指针常量...+ ++Complex,返回引用 Complex operator++(int); //后置++,返回值 //赋值运算符重载,如果涉及到堆区内存,,要先释放原来堆区空间,,再来分配新赋值空间...中,所有的非静态成员变量(包括private)都要继承到子类(不论权限);只是子类访问时候,编译器会把private类型数据隐藏起来 先构造父亲,再构造儿子;;先析构儿子,再构造父亲 (4...纯虚函数:virtual 返回值 函数名(参数列表) = 0; 只要有一个纯虚函数,被称为抽象; 抽象特点:无法实例化对象, 抽象子类必须要重写父纯虚函数,否则子类也为抽象; (5)...虚析构和纯虚析构 多态使用时, 如果子类中有属性开辟到堆区, 那么父指针释放时无法调用到子类析构代码;(即:子类析构函数不会被调用) 上面问题解决:将父析构函数改为虚析构或者纯虚析构即可

37510

C++ 新特性学习(五) — 引用包装、元编程类型属性和计算函数对象返回类型

这各部分主要是一些很实用和在一些地方帮助编译器自动推断类型库和函数 首先是引用包装 名 template class std::reference_wrapper; 这个保存了对一个实例...、(成员)函数(指针) 构造时必须传入所引用对象或引用对象右值引用 主要方法有 =号操作符, 用于重新绑定引用对象 类型转换操作符, 用于转换为模板目标引用类型 get方法, 用于获取引用对象...()操作符, 用于执行引用函数 同时与其配对函数有 std::ref 返回std::reference_wrapper,可以视为转换对象为引用 std::cref 返回常量引用对象std::reference_wrapper...,但是由于绑定变量和函数参数类型推断是分离,会导致传值而不是引用 另外有些函数,如 std::ptr_fun, 通过函数指针构造函数对象 std::mem_fun, 通过成员函数指针构造函数对象 std...元编程类型属性 元编程定义是可以修改自身或其他代码代码,当然,C++不是动态语言,这个修改可以在编译或执行时期。

1.2K30
领券