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

复制返回*this vs (*this)的赋值运算符

在C++中,*this(*this) 都是对当前对象的引用,但它们在语法和可读性上有所不同。

基础概念

  • *this:这是一个解引用操作,它表示当前对象的引用。在成员函数中,this 是一个指向调用该成员函数的对象的指针,*this 则是对这个对象的引用。
  • (*this):这是对 *this 的括号包围,它实际上没有改变任何语义,但在某些情况下可以提高代码的可读性。

优势

  • 使用 *this 可以直接访问当前对象的成员,而不需要额外的括号。
  • 使用 (*this) 在复杂的表达式中可以提高代码的可读性,尤其是当需要明确表示对当前对象的操作时。

类型

两者都是对当前对象的引用,因此它们的类型与当前对象的类型相同。

应用场景

  • 在重载赋值运算符时,通常会使用 *this 来表示当前对象。
  • 在复杂的表达式中,为了提高可读性,可以使用 (*this)

示例代码

代码语言:txt
复制
class MyClass {
public:
    int value;

    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            this->value = other.value;
        }
        return *this; // 使用 *this 返回当前对象的引用
    }

    MyClass& operator+=(const MyClass& other) {
        this->value += other.value;
        return (*this); // 使用 (*this) 返回当前对象的引用,提高可读性
    }
};

遇到的问题及解决方法

问题:为什么在重载赋值运算符时需要返回 *this

原因:返回 *this 允许链式赋值操作,例如 a = b = c;。如果不返回 *this,链式赋值将无法工作。

解决方法:确保重载的赋值运算符返回 *this

代码语言:txt
复制
MyClass& operator=(const MyClass& other) {
    if (this != &other) {
        this->value = other.value;
    }
    return *this; // 返回当前对象的引用
}

问题:为什么在复杂的表达式中使用 (*this) 可以提高可读性?

原因:在复杂的表达式中,使用 (*this) 可以明确表示对当前对象的操作,避免与其他操作混淆。

解决方法:在需要明确表示对当前对象操作的复杂表达式中使用 (*this)

代码语言:txt
复制
MyClass& operator+=(const MyClass& other) {
    this->value += other.value;
    return (*this); // 提高可读性
}

参考链接

通过以上解释和示例代码,希望你能更好地理解 *this(*this) 在C++中的应用和区别。

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

相关·内容

C++类复制构造函数和赋值运算符

前言: C++面向对象编程过程中,凡是在类中运用到动态内存分配时候总是会写一个显示复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书内容分析下原因: 一、在C++编程中如果没有编写下列成员函数...,系统会自动提供:     (1)构造函数     (2)析构函数     (3)地址运算符     (4)赋值构造函数     (5)赋值运算符     其中(1)-(3)在编程中不会产生什么影响,...而且有些情况编译器会生成临时变量,然后将临时变量在赋值给被传递对象。 3、默认复制构造函数做了哪些事情?     默认赋值构造函数逐个复制非静态成员值。注意是值,是一种浅复制。...当将已有的对象赋给另一个对象时,将使用赋值运算符。 3、默认复制运算符做了什么事情?    其实它和默认赋值构造函数差不多,都是进行浅复制。...Str s2;s2=s1;这两句用到了赋值运算符,而浅复制导致s1和s2指针指向了同一个位置,当s1被析构时候s2指向内存单元也被释放掉,所以再delete s2中str时候系统就崩溃啦。

1.2K70

原型模式C++类复制构造函数和赋值运算符

这个可以从两个角度来说,第一,时间消耗角度:如果创建实例构造函数非常复杂,在执行这个构造函数时会消耗较长时间,这时如果需要一个跟刚刚实例化对象参数差不多实例(可以完全相同,也可以大部分相同)那么直接使用... new 来创建这样一个实例就显得太昂贵了,而如果使用原型模式克隆一个一模一样实例(或者先克隆一个一模一样实例,然后做小部分改动)就显得非常合理。...第二,用户修改麻烦程度角度,举个例子,假设要通过一个类实例化一各班同学毕业信息,那么会有大量雷同信息,这时如果要用new实例化,就需new很多次,更悲剧是如果所有同学信息都录入完毕,突然发现某个参数信息录入错了...(2)既然类可以直接赋值,为什么会用到原型模式?...因为类之间直接赋值的话,默认拷贝函数是进行引用赋值 对于指针复制会造糟糕结果,这点可以参见C++ primer plus "类和动态内存分配"章节,也可以参见我另一篇技术博客 C++类复制构造函数和赋值运算符

1.4K50
  • Java赋值运算符(二)

    以下是这些赋值运算符详细介绍及示例: 条件赋值运算符(?:=): 条件赋值运算符(?:=)用于在变量没有被初始化时,根据一个条件表达式来为变量赋值。如果变量已经被初始化,则不会执行任何操作。...条件赋值运算符语法如下: variable ?:= value; 其中,variable表示变量名,value表示要赋给变量值。...以下是条件赋值运算符示例: int a; // a没有被初始化 a ?:= 10; // a值变为10,因为a没有被初始化 a ?...:= 20; // a值仍为10,因为a已经被初始化 在这些示例中,我们使用条件赋值运算符为变量a赋值。在第一次赋值时,由于变量a没有被初始化,因此条件表达式值为true,将值10赋给变量a。...在第二次赋值时,由于变量a已经被初始化,因此条件表达式值为false,不会执行任何操作。 空合并赋值运算符(??=): 空合并赋值运算符(??=)用于将变量赋为非空值。

    23710

    Java赋值运算符(一)

    基本赋值运算符(=)基本赋值运算符(=)用于将一个值赋给一个变量。基本赋值运算符语法如下:variable = value;其中,variable表示变量名,value表示要赋给变量值。...Java提供了五种算术赋值运算符,包括加法赋值运算符(+=)、减法赋值运算符(-=)、乘法赋值运算符(*=)、除法赋值运算符(/=)和取模赋值运算符(%=)。...以下是算术赋值运算符示例:javaCopy codeint a = 10;a += 5; // a值变为15,相当于 a = a + 5a -= 3; // a值变为12,相当于 a = a...Java提供了六种位运算赋值运算符,包括按位与赋值运算符(&=)、按位或赋值运算符(|=)、按位异或赋值运算符(^=)、左移赋值运算符(>=)和无符号右移赋值运算符(>>>=...以下是位运算赋值运算符示例:int a = 5; // a二进制表示为 0000 0101a &= 3; // a二进制表示为 0000 0001,相当于 a = a & 3a |= 8;

    47520

    C++对象赋值复制

    13.对象赋值复制 对象赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现,即将一个对象成员一一赋值给另一对象对应成员...注意:对象赋值只是对其中数据成员赋值,而不是对成员函数赋值。...//对象赋值:两个对象都已经存在,然后用一个对象给另一个对赋值 //对象复制:已经有一个对象,再创建另一个对象时,用已知对象初始化创建对象 对象复制一种形式: Box box2(box1);//...: Box box2 = box1;//类名 对象1 = 对象2; 两者区别: 对象赋值是对一个已经存在对象赋值,因此必须先定义被赋值对象,才能进行对象赋值。...c3 = c1.complex_add(c2);//此处存在对象赋值复制问题 //对象复制,存在于实参到形参以及函数返回中 //实现机制实例 //重载=号实现对象赋值 Person& operator

    3.2K90

    有趣赋值逻辑运算符

    写在前面 我们在写js逻辑时候,不可否认用到了很多逻辑运算符,像||、&&这些,那么我们基本都是在三元运算符或者if判断里进行使用,那么我们其实可以在赋值时候一样使用,今天我们就看看怎么使用它来写一些看起来比较牛逼代码...规则 首先说一下他们规则,比如我们写一个简单赋值: let name = 0 || 2 //结果:2 let name = 0 && 2 //结果:0 let name = 0||4 && false...,从而进行一个业务执行,但是如果使用赋值逻辑运算符怎么写呢?...形参 函数 */ function fn(value, callback) { console.info(value = value || 0) //如果vlaue为false,直接赋值为...怎么样,是不是看起来就比较装逼了,其实我们看大神代码时候,很多时候会这样写,其实好不好呢,我觉得不好,那如果我直接传一个null过去,其实是false,但是他给我赋值为0了,怎么办,只是说我们一般情况下默认不会传一个

    89810

    C++移动赋值运算符

    C++移动赋值运算符是一种特殊赋值运算符,用于将资源从一个对象转移到另一个对象而不进行深拷贝。移动赋值运算符通常用于支持移动语义,以提高代码效率和性能。...通过使用右值引用,我们可以获取到要赋值源对象,并将其资源移动到目标对象中。 在移动赋值运算符中,通常会执行以下操作: 检查是否为自赋值情况,如果是则直接返回当前对象。...释放当前对象资源,以防止资源泄漏。 将源对象资源指针或资源句柄复制给目标对象,避免深拷贝。 将源对象资源指针或资源句柄置为nullptr,以确保源对象析构时不会释放资源。...在移动赋值运算符中,我们首先检查是否为自赋值情况,如果不是则释放当前对象资源,并将源对象资源指针赋值给目标对象data,然后将源对象资源指针置为nullptr。...这会触发移动赋值运算符调用,将资源从str1移动到str2,最终输出"Hello"。 使用移动赋值运算符可以避免不必要数据拷贝,特别是当对象拥有大量资源时,移动语义可以显著提高代码性能和效率。

    40130

    Python中赋值与浅复制与深复制之间

    #赋值与浅复制一层列表 """ a = [1, 2]    b = a   #赋值 c = a.copy() #浅复制 a.append(3)     print(b)  #父对象改变 print(...c)  #父对象不变 ''' [1, 2, 3] [1, 2] ''' """ #赋值与浅复制二层列表 """ a = [1,2,[1,2]]    b = a #赋值 c = a.copy() #浅复制...a[-1].append(3) a.append(3) print(b)  #父对象该变 赋值 print(c)  #父对象该变 浅复制 ''' [1, 2, [1, 2, 3], 3] [1, 2,...#父对象该变 浅复制 print(c)    #父对象不变 深复制 ''' [1, 2, [1, 2, 3]] [1, 2, [1, 2]] ''' """ #一层列表中,赋值会改变父对象 ,浅复制和深复制不会改变父对象...#二层列表中,赋值会改变父对象(内外都变),浅复制会改变内层父对象,深复制不会改变内层父对象。

    80510

    Java中复制和浅赋值

    复制和浅复制也称为深拷贝和浅拷贝。简单说就是创建一个和当前对象一模一样对象。在日常编码过程中使用几率并不多,但在面试中却会被经常问到。...了解深复制和浅复制原理后,可以帮助我们对Java中值传递和引用传递有更深刻理解。 浅复制 下面的实例中,我们创建一个原始类Monster,调用对象clone方法复制一个新对象。...().getX() + "\t" + monster1.getPosition().getY()); } } 我们可以通过这个例子体会浅复制特点: 被复制对象所有成员属性都有与原来对象相同值,...即浅复制后,新对象地址变了,但新对象中字段(属性)所指向内存地址(引用)却没变,新旧对象字段指向了同一块内存空间。...System.out.println(monster1.equals(monster2)); //2.对比对象中值(浅复制中,只复制了对象引用) - 浅复制 System.out.println

    1K20

    谈谈C语言中赋值运算符

    在C语言中,赋值运算符很常用,常见运算符有:=、+=、-=、*=、/=。...赋值运算符能简化代码,我们要算一个数加二,完整代码可以写成 a = a + 2;如果用上了赋值运算符,则可写成 a += 2。下面将会详细介绍C语言支持所有的赋值运算符。...C语言支持所有赋值运算符,如下表所示: 运算符 解释 例子 = 简单赋值运算符 A=1相当于将1赋值给A += 加且赋值运算符 A+=1相当于A=A+1 -= 减且赋值运算符 A-=1相当于A=A...-1 *= 乘且赋值运算符 A*=1相当A=A*1 /= 除且赋值运算符 A/=1相当A=A/1 %= 去余且赋值运算符 A%=2相当A=A%2 >= 右移且赋值运算符 A>>=2等价于A=A>>2 &= 按位与且赋值运算符 A&=2等价于A=A&2 ^= 按位异或赋值运算符 A^=2等价于A=A^2 |= 按位或且赋值运算符 A|=2等价于A

    1.8K20

    js数组拷贝赋值复制-你真的懂?

    在看react-native性能优化时候,看到如何避免shouldComponentUpdate异常数据时,脑内一阵风暴,从而牵连出一连串问题,于是有了这一篇关于js数组复制(深浅拷贝)与赋值等为何能产生异常数据文章...有什么问题欢迎指正 现在进入正题: 首先异常数据产生在于我们在复制赋值时,会有或没有改变到本身值。 一、push与concat push定义是:像数组末尾添加一个或更多元素,并返回长度。...该方法会改变数组长度。 concat定义是:连接两个或更多数组,并返回结果,该方法不会改变现有数组,而仅仅会返回数组一个副本。...所以浅复制会导致 a 和 b 指向同一块内存地址 数组赋值其实相当于给了索引,改变其中一个变量其他引用都会改变 var a = [1,2,3]; var b = a; b[0] = 4;...2.深拷贝 (1)slice 函数 (2)concat 函数 (3)assgin 三个函数原理都是返回数组一个副本(相当于另外开辟内存空间),所以并不会改变数组本身值 但是这里有一点不同,就是assgin

    4.8K30

    C++核心准则编译边学-F.47 赋值运算符应该返回T&

    F.47: Return T& from assignment operators F.47 赋值运算符应该返回T&。...运算符重载习惯(特别是值类型)是在operator=(const T&)中执行赋值操作然后返回(非常量)*this。这保证了和标准库类型一致性而且遵守了“像整数一样动作”准则。...译者注:“像整数一样动作”应该说是,使用重载赋值运算符代码,看起来要和使用整数赋值运算符代码具有同样形式。...历史上存在过某些保证赋值操作会返回const T&准则。其主要目的是避免(a=b)=c--形式代码,但这种代码普遍性还不足以将其视为和对标准类型一致性违反。...应该强制对任何赋值运算符返回值类型(和返回值)进行工具化检查。 觉得本文有帮助?请分享给更多人。 关注【面向对象思考】,轻松学习每一天! 有任何疑问,欢迎留言提问或讨论。

    34910

    C++避坑---赋值运算符函数中自我赋值和异常控制

    在定义某个类赋值运算符函数时候,如果涉及到动态内存分配,我们首先会考虑到深拷贝和浅拷贝这种容易犯错问题。但有些时候容易忽略自我赋值风险和异常控制方面的问题。...那如何让我们赋值运算符函数既能规避自我赋值可能带来风险,又能防止这种未知风险发生呢?...2)关键原因:虽然增加自我检测判断,可以让代码在自我赋值情况下及时返回, 提高运行速度,但实际中自我赋值情况很少发生,所以大部分时间是无用, 因此综合考虑,程序没有它可能会更好。...通过拷贝构造函数和交换函数完成了赋值运算符函数实现,其中交换函数swap(B& b)还可以为其他函数(如移动赋值运算符等)共用,进一步降低重复代码编写。...来防止自我赋值风险产生和提高赋值运算符函数异常控制能力。 参考文献 《Effective C++ 第三版》

    41010

    构造函数没有返回值是怎么赋值

    可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象时候是怎么赋值呢?...init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型是void,那么它究竟是怎么赋值呢?...赋值探究 我们明白一点,方法调用过程就是栈帧入栈和出栈过程,栈帧随着方法调用创建,方法结束销毁。栈帧内部包含局部变量表、操作数栈、动态链接等。...以上面测试代码方法来看Test t = new Test() 调用过程: new 创建Test对象,并将其引用值压入操作数栈顶 dup 复制栈顶数值并将复制值压入栈顶 invokespecial 使用...dup复制引用并用来初始化,此时栈顶应该只有new创建原始引用 astore_1 将new创建引用存入局部变量表索引为1位置 return 方法正常返回 ?

    1.7K20

    构造函数没有返回值是怎么赋值

    可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象时候是怎么赋值呢?...init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型是void,那么它究竟是怎么赋值呢?...赋值探究 我们明白一点,方法调用过程就是栈帧入栈和出栈过程,栈帧随着方法调用创建,方法结束销毁。栈帧内部包含局部变量表、操作数栈、动态链接等。...以上面测试代码方法来看Test t = new Test() 调用过程: new 创建Test对象,并将其引用值压入操作数栈顶 dup 复制栈顶数值并将复制值压入栈顶 invokespecial 使用...dup复制引用并用来初始化,此时栈顶应该只有new创建原始引用 astore_1 将new创建引用存入局部变量表索引为1位置 return 方法正常返回 ?

    1.7K20

    TypeScript 中常用运算符:算术运算符赋值运算符、逻辑运算符、比较运算符和位运算符

    let a: number = 5;a--; // a 值变为 4赋值运算符赋值运算符用于将一个值赋给变量。简单赋值运算符(=)简单赋值运算符(=)用于将右边值赋给左边变量。...let a: number = 5;a -= 3; // a 值变为 2乘法赋值运算符(*=)乘法赋值运算符(*=)用于将右边值与左边变量相乘,并将结果赋给左边变量。...let a: number = 10;a /= 2; // a 值变为 5逻辑运算符逻辑运算符用于执行逻辑运算并生成布尔值结果。逻辑与运算符(&&)逻辑与运算符(&&)用于在两个条件都为真时返回真。...|)用于在至少一个条件为真时返回真。...a; // false比较运算符比较运算符用于比较两个值,并返回一个布尔值。相等运算符(==)相等运算符(==)用于比较两个值是否相等。

    58920

    Java赋值运算符使用技巧,你Get了吗?

    前言  在Java开发中,赋值运算符是一种常用运算符,用于给变量赋值。在实际工作中,我们经常需要对变量进行赋值操作,因此掌握赋值运算符使用技巧是非常重要。  ...本文将对Java赋值运算符进行详细解析,包括其基本语法,应用场景案例,优缺点分析等。希望能够帮助读者更好地掌握Java赋值运算符使用方法。摘要  赋值运算符是一种常用运算符,用于给变量赋值。...然后,使用赋值运算符将 b 值赋给 a。最后,我们使用一系列复合赋值运算符对 a 进行操作,并将结果输出到控制台。   需要注意是,Java中赋值运算符和C++中赋值运算符是不同。...在赋值运算符中,变量a被赋值为变量b值,因此a值变为了10。在复合赋值运算符中,变量a和变量b进行了不同运算操作后,将结果赋值给变量a。  ...因此,该代码演示了Java中常见赋值运算符和字符串操作方法。总结  赋值运算符是一种非常常用运算符,它可以方便地对变量进行赋值操作。

    28251

    Java中赋值运算符,你真的掌握了吗?

    摘要   本文将介绍Java中赋值运算符,包括赋值运算符概念、语法、用法、注意事项等内容。同时,本文还将通过源代码解析、应用场景案例和优缺点分析等方面,深入探讨赋值运算符实际应用。...Java-赋值运算符 简介   Java中赋值运算符是一种用于给变量赋值运算符,它作用是将右边值赋给左边变量。Java中常见赋值运算符包括=、+=、-=、*=、/=和%=等。...测试代码分析   根据如上测试用例,在此我给大家进行深入详细解读一下测试代码,以便于更多同学能够理解并加深印象。   该程序演示了Java中赋值运算符,包括基本赋值运算符和复合赋值运算符。...使用某些赋值运算符可以替代常规运算符,从而提高程序执行效率。 方便操作。赋值运算符可以让程序员更方便地对变量进行赋值和更新。 缺点   赋值运算符缺点主要体现在以下几个方面: 容易出错。...赋值运算符是一种用于给变量赋值运算符,它作用是将右边值赋给左边变量。Java中常见赋值运算符包括=、+=、-=、*=、/=和%=等。

    42951
    领券