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

为什么赋值运算符会返回对象的引用?

赋值运算符在大多数编程语言中会返回对象的引用,这是因为赋值运算符的目的是将一个对象的值赋给另一个对象,而不是创建一个新的对象。返回对象的引用可以使程序更高效地操作对象,避免不必要的内存拷贝和对象创建。

当使用赋值运算符将一个对象赋给另一个对象时,实际上是将目标对象的引用指向了源对象所在的内存地址。这意味着目标对象和源对象指向同一块内存空间,它们共享相同的数据。这样,在修改目标对象时,源对象也会相应地被修改,因为它们指向同一份数据。

返回对象的引用还可以支持链式赋值操作。例如,可以通过连续使用赋值运算符将多个对象赋给同一个目标对象,而不需要每次都创建新的中间对象。这样可以减少内存的使用和对象的创建,提高程序的性能和效率。

总结起来,赋值运算符返回对象的引用是为了提高程序的效率和性能,避免不必要的内存拷贝和对象创建。它允许多个对象共享相同的数据,并支持链式赋值操作。

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

相关·内容

  • C++核心准则C.60: 拷贝赋值运算符应该是以const&为参数,返回非常量引用类型非虚函数

    const&为参数,返回非常量引用类型非虚函数 Reason(原因) It is simple and efficient....通过将数据直接写入对象元素,我们可以得到基本保证而不是通过swap技术提供强保证。为了防止自己给自己赋值。...如果你认为你需要一个虚赋值操作运算符,而且理解它会产生很深刻问题,别把设计成赋值运算符。将它定义为具名函数,例如virtual void assign(const Foo&)。...(简单)赋值运算符应该返回T&,这样才能实现连续赋值。不要改成类似const T&类型,这样影响组装性并妨碍将对象放进容器中。...(中等)赋值运算符应该(隐式或显式)调用所有的基类和成员赋值运算符。观察析构函数以决定这个类型式指针语义还是值语义。

    81330

    奇怪Java题:为什么128 == 128返回为false,而127 == 127返回为true?

    奇怪Java题:为什么128 == 128返回为false,而127 == 127返回为true? 在回答这个问题之前,我们先来看看int和Integer对比,一步步揭开问题答案。...实际是对象引用,指向此newInteger对象;int是直接存储数据值 ; (4) Integer默认值是null;int默认值是0。...基本类型(原始数据类型)在传递参数时都是按值传递,而封装类型是按引用传递(其实“引用也是按值传递”,传递对象地址)。 由于包装类型都是不可变量,因此没有提供改变它值方法。...2. int与Integer深入对比 注:对于引用类型变量,==操作符比较是两个引用是否指向同一个对象;对于基本类型变量,==操作符比较是两个变量值是否相等。...(1) 由于Integer变量实际上是对一个Integer对象引用,所以两个通过new生成Integer变量永远是不相等

    2.2K31

    一文入魂:妈妈再也不用担心我不懂C++移动语义了!

    一、为什么要有移动语义 (一)从拷贝说起 我们知道,C++中有拷贝构造函数和拷贝赋值运算符。那既然是拷贝,听上去就是开销很大操作。...移动赋值运算符也是接收右值引用,它实现和移动构造函数基本一致。...但这里不同,以移动构造函数为例,如果我们定义了移动构造函数,那么编译器不会为我们自动生成移动赋值运算符,此时,移动赋值运算符调用并不会转而执行拷贝赋值运算符,而是产生编译错误:...,命名返回值优化)”技术,即如果函数返回一个临时对象,则该对象直接给函数调用方使用,而不会再创建一个新对象。...因此,当返回局部对象时,我们不用画蛇添足,直接返回对象即可,编译器优先使用最佳NRVO,在没有NRVO情况下,尝试执行移动构造函数,最后才是开销最大拷贝构造函数。

    1.2K20

    类和对象运算符重载

    通过运算符重载,我们可以使得我们自定义对象像内置类型一样进行运算,这为编写清晰、简洁且易于理解代码提供了便利。 为什么要进行运算符重载?...当运行到使用重载运算符时候就会进行调用重载函数: 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值...尝试将其定义为非成员函数导致编译错误,因为编译器期望赋值运算符是类成员。 语义问题:赋值运算符语义是将一个对象值设置为另一个对象值。...这个默认赋值运算符进行成员到成员简单赋值,也就是逐个复制每个非引用、非指针成员变量值。...,所以在函数内定义一个对象进行储存++前数据,不使用引用返回,使得在返回后构造函数,使程序正常进行。

    10910

    剖析深拷贝与浅拷贝,探究重载返回引用还是对象

    前置++返回是增加后对象,这个对象是需要保留,不是临时对象返回引用就不需要拷贝对象,效率高....上面这句话说真的稀里糊涂,第一次看到这句话,肯定一脸懵逼,实际上将上述话差分开就是解决两个问题: (1) 深拷贝和浅拷贝? (2) c++中有些重载运算符为什么返回引用?...只不过赋值函数最好有返回值(进行链式赋值),返回也最好是对象引用, 而拷贝函数不需要返回任何。...同时,赋值函数首先要释放掉对象自身堆空间(如果需要的话),然后进行其他operation.而拷贝函数不需要如此,因为对象此时还没有分配堆空间。 2.C++中有些重载运算符为什么返回引用?...原因有两个: 允许进行连续赋值 防止返回对象返回对象也可以进行连续赋值(常规情况,如a = b = c,而不是(a = b) = c))时候调用拷贝构造函数和析构函数导致不必要开销,降低赋值运算符效率

    86040

    【C++】类和对象(中):类默认成员函数,构造函数、析构函数、拷贝构造函数、运算符重载

    这里解释一下为什么拷贝构造第一个参数传参方式必须是引用。 首先我们要知道,C++规定传值传参要调用拷贝构造,没有为什么,就是规定。比如说下面这个f1函数。...不需要了吧,编译器自动生成。这也就是为什么我在这一小节开头并没有自己写拷贝构造函数代码但依然可以进行拷贝构造。...赋值运算符重载特点: 1.赋值运算符重载是一个运算符重载,规定必须重载为成员函数。赋值运算符重载参数建议写成 const 当前类类型引用 ,可以减少传值传参拷贝。..._day; } 2.有返回值时,也建议写成当前类类型引用引用返回可以提高效率,有返回值是为了支持连续赋值情况。 内置类型我们支持连续赋值,像下面这样。...3.没有显示实现时,编译器自动生成一个默认赋值运算符重载,默认赋值运算符重载行为跟默认拷贝构造函数类似。 4.

    8910

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

    、(成员)函数(指针) 构造时必须传入所引用对象引用对象右值引用 主要方法有 =号操作符, 用于重新绑定引用对象 类型转换操作符, 用于转换为模板目标类引用类型 get方法, 用于获取引用对象...()操作符, 用于执行引用函数 同时与其配对函数有 std::ref 返回std::reference_wrapper,可以视为转换对象引用 std::cref 返回常量引用对象std::...,但是由于绑定变量和函数参数类型推断是分离导致传值而不是引用 另外有些函数,如 std::ptr_fun, 通过函数指针构造函数对象 std::mem_fun, 通过成员函数指针构造函数对象...(仿函数)返回值类型 主要涉及一个模板函数std::result_of,它使用了decltype并支持函数对象(关于decltype请参见 https://www.owent.net/2011/508....html) std::result_of::type 即是返回类型,比如: struct foo { double operator()(char, int); }; // 这两个是一样

    1.8K30

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

    、(成员)函数(指针) 构造时必须传入所引用对象引用对象右值引用 主要方法有 =号操作符, 用于重新绑定引用对象 类型转换操作符, 用于转换为模板目标类引用类型 get方法, 用于获取引用对象...()操作符, 用于执行引用函数 同时与其配对函数有 std::ref 返回std::reference_wrapper,可以视为转换对象引用 std::cref 返回常量引用对象std::reference_wrapper...,但是由于绑定变量和函数参数类型推断是分离导致传值而不是引用 另外有些函数,如 std::ptr_fun, 通过函数指针构造函数对象 std::mem_fun, 通过成员函数指针构造函数对象 std...(仿函数)返回值类型 主要涉及一个模板函数std::result_of,它使用了decltype并支持函数对象(关于decltype请参见 https://www.owent.net/2011/508....html) std::result_of::type 即是返回类型,比如: struct foo { double operator()(char, int); }; // 这两个是一样 std

    1.3K30

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

    拷贝构造函数参数只有一个且必须是类类型对象引用(&),使用传值方式编译器直接报错,因为引发无穷递归调用 为什么无限递归:当我们传值调用函数时,首先传参–>因为是传值会调用新一个拷贝构造–>...函数参数类型为类类型对象 函数返回值类型为类类型对象 2.赋值运算符重载 2.1运算符重载 C++为了增强代码可读性引入了运算符重载,运算符重载是具有特殊函数名函数,也具有其返回值类型,函数名字以及参数列表...赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值 返回*this :要复合连续赋值含义 class...int为了让前置++与后置++形成能正确重载 { Date temp(*this); (*this) += 1; return temp;//temp是临时对象,因此只能以值方式返回,不能返回引用...int _day; }; 前置递增运算符++重载函数返回是Date对象引用,因为前置递增运算符先对对象进行加一操作,然后返回加一后对象本身,因此返回引用

    18510

    【C++ 初阶路】--- 类和对象(下)

    拷贝构造函数参数只有一个且必须是类类型对象引用,使用传值方式编译器直接报错,因为引发无穷递归调用。...而我们都知道传值传参,形参是实参一份临时拷贝! 那么拷贝构造函数如果不是引用就会形成无穷递归调用。有人说为什么不写一个返回条件来结束递归?...三、赋值运算符重载 3.1 运算符重载 C++为了增强代码可读性引入了运算符重载,运算符重载是具有特殊函数名函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。..._day; } //调用处: d1 == d2 => d1.operator==(d2); 3.2 赋值运算符重载 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型...:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this:要复合连续赋值含义 Date& operator=(const Date& d) { if

    7610

    C++运算符重载详解(日期类实操)

    前言:为什么要实现运算符重载?...看返回值如果是*this,就用引用返回(出了函数作用域,不会销毁); 返回值如果是在函数体内创建临时变量,就不用引用返回(出了作用域,临时变量销毁)。 赋值运算符重载: 1....赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值检测是否自己给自己赋值 返回*this :要复合连续赋值含义...,因此只能以值方式返回,不能返回引用 this指向对象函数结束后不会销毁,故以引用方式返回提高效率 输入流输出流操作符重载 为什么cin cout能够自动识别任意类型数据呢?...不然可读性很差,像下面定义在类内部: 重载流操作符为什么必须用引用

    5110

    C++:类与对象(2)

    答:因为成员函数隐藏一个this指针,在运行时候编译器自动帮我们处理,所以我们只需要传那个我们需要拷贝类类型对象就行 2、为什么传值方式编译器无限递归? ...3、为什么概念里提到,对本类类型对象引用一般用const修饰?有什么好处吗?...5.2 赋值运算符重载 特性1:参数类型:const T&,传递引用可以提高传参效率 特性2:返回值类型:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值 特性3:检测是否自己给自己赋值...如果是自赋值,如果类里面含有指针指向动态开辟内存的话,那么自身赋值就可能出错,因为在赋值前需要把原来空间给释放掉。就不能赋值了。 2、为什么要用引用返回? 为了支持连续赋值!!...特性5:赋值运算符只能重载成类成员函数不能重载成全局函数 思考: 1、之前我们实现其他运算符,也是可以定义全局函数啊,大不了传两个参数不就行了。为什么这里赋值运算符重载必须是成员函数?

    12910

    类与对象(中(2))

    拷贝构造函数是构造函数一个重载形式。 2. 拷贝构造函数参数只有一个且必须是类类型对象引用,使用传值方式编译器直接报错, 因为引发无穷递归调用。...,尽量使用引用类型,返回时根据实际场景,能使用引用尽量使用引用哦~ 补充 我们就构造函数与运算符重载函数做一个简单区分: 构造函数:用一个已经存在对象初始化另一个对象。...运算符重载函数:已经存在两个对象之间赋值拷贝。 默认成员函数不能写到全局。...) 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this :要复合连续赋值含义 特别的...这里先买个关子,后面的深拷贝继续讲解~ 这里我们先用一张图来理解为什么: 我们可以得出一个结论:如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必须要实现。

    8310

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

    赋值运算符重载 运算符重载 当运算符被⽤于类类型对象时,C++语⾔允许我们通过运算符重载形式指定新含义。...//后置++,编译器自动转换成 d1.operator++(0) d1++; return 0; } 赋值运算符重载 赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在对象直接拷...没有显式实现时,编译器⾃动⽣成⼀个默认赋值运算符重载,默认赋值运算符重载⾏为跟默认拷⻉构造函数类似,对内置类型成员变量完成值拷⻉/浅拷⻉(⼀个字节⼀个字节拷⻉),对⾃定义类型成员变量会调⽤他赋值重载函数...下面我们可以看到,d1是个隐含this指针,把d2年/月/日赋值给d1,但是为什么引用返回d1呢。...(d1 = d2 = d3)连续赋值时候,把d3赋值给d2,然后d2引用返回,d2赋值给d1。 就和下面这个int类型连续赋值一样。 如果没有返回,就不支持连续赋值了。

    9410

    C++核心准则编译边学-F.43 永远不要返回指向局部对象指针或引用

    F.43: Never (directly or indirectly) return a pointer or a reference to a local object 无论直接还是间接,永远不要返回指向局部对象指针或引用...想象一下破密者如果处理悬空指针。 译者注:破密者可以通过这个人变量改变函数行为。 Fortunately, most (all?)...幸运是,大部分(所有?)现代编译器都可以捕捉并对这个简单情况报警。 Note(注意) This applies to references as well: 这一问题也适用于引用情况。...局部变量地址以多种方式被“返回”或者说被泄漏。具体方式可以是通过返回语句,T&类型输出参数,返回对象成员,返回值数组元素或者是其它方式。...编译器倾向于捕捉返回指向局部变量引用情况,也可以在很多情况下捕捉返回指向局部变量指针情况。

    72320

    C++初阶——(类中默认成员函数)下

    1.2特征 1.拷贝构造构造是构造函数一个重载形式。 2.拷贝构造函数参数只有一个且必须是类类型对象引用,如果使用传值方式的话编译器直接报错,因为这样的话会引起无穷递归调用。...为什么这样呢? 编译器默认生成拷贝构造函数,默认拷贝构造函数是按照值拷贝,即将s中内容原封不动拷贝到s2.由此 s和s2指向了同一块内存空间。...为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。...2.赋值运算符重载 2.1运算符重载 2.1.1概念 C++为了增强代码可读性引入了运算符重载,运算符重载是具有特殊意义函数名函数,也具有其返回值类型,函数名以及参数列表,其返回值类型与参数列表与普通函数类似...2.2赋值运算符重载 1.赋值运算符重载格式 参数类型:const T(类目名)&,传递引用可以提高传参效率。 返回值类型:T&,返回引用可以提高返回效率,返回值目的是为了支持连续赋值

    8610

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

    返回类型: 赋值运算符通常返回对象本身引用(ClassName&),以支持链式赋值(例如 a = b = c;)。...参数: 赋值运算符接受一个const引用作为参数,这个引用指向要赋值对象(const ClassName& other)。使用const是为了保证赋值操作不会修改源对象。...深拷贝资源:如果赋值对象有动态资源,则需要为当前对象分配新资源,并将数据复制过来。 返回当前对象返回当前对象引用(*this),使得赋值运算符可以支持连续赋值(如 a = b = c)。...为什么返回 *this? 返回 *this(即当前对象引用)是为了支持连续赋值操作。...例如: A obj1(10), obj2(20), obj3(30); obj3 = obj2 = obj1; // 支持链式赋值 通过返回当前对象引用赋值运算符可以被连续调用,从而支持链式操作。

    9410
    领券