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

在::operator =中从我自己调用类构造函数

在C++中,赋值运算符(operator=)用于将一个对象的值赋给另一个对象。当在类中定义了赋值运算符时,如果在赋值运算符中从自己调用类构造函数,会导致对象的自我赋值(self-assignment)问题。

自我赋值问题指的是将一个对象赋值给自身,例如:

代码语言:txt
复制
MyClass obj1;
obj1 = obj1;  // 自我赋值

为了避免自我赋值问题,可以在赋值运算符中添加自我赋值检查。一种常见的做法是在赋值运算符的开头检查两个对象是否是同一个对象,如果是同一个对象,则直接返回当前对象,避免进行不必要的赋值操作。示例如下:

代码语言:txt
复制
class MyClass {
public:
    MyClass& operator=(const MyClass& other) {
        if (this == &other) {
            return *this;  // 自我赋值,直接返回当前对象
        }
        // 进行赋值操作
        // ...
        return *this;
    }
};

这样做可以确保在自我赋值情况下不会出现问题,并且能够正常完成赋值操作。

关于云计算领域,腾讯云提供了一系列相关产品和服务,包括云服务器、云数据库、云存储、人工智能等。具体推荐的腾讯云产品和产品介绍链接地址如下:

  1. 云服务器(CVM):提供弹性计算能力,支持多种操作系统和应用场景。了解更多:腾讯云云服务器
  2. 云数据库 MySQL 版(CDB):提供高性能、可扩展的关系型数据库服务。了解更多:腾讯云云数据库 MySQL 版
  3. 云对象存储(COS):提供安全、稳定、低成本的云端存储服务。了解更多:腾讯云云对象存储
  4. 人工智能(AI):提供丰富的人工智能服务和工具,包括图像识别、语音识别、自然语言处理等。了解更多:腾讯云人工智能

以上是腾讯云在云计算领域的一些推荐产品,供您参考。

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

相关·内容

创建子类对象时,父构造函数调用被子类重写的方法为什么调用的是子类的方法?

void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象的时候父调用子类方法...但是:创建B对象父调用的方法? 答案: 当子类被加载到内存方法区后,会继续加载父到内存。...如果,子类重写了父的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父的方法引用。 如果子类重载了父方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父构造方法调用的方法的参数已经强制转换为符合父方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

6.1K10

ASP.NET AJAX(6)__Microsoft AJAX Library的面向对象类型系统命名空间——构造函数——定义方法——定义属性——注册——抽象——继承——调用

定义构造函数 定义成员(方法、属性、事件) 注册 ——构造函数 构造函数即为function定义 通常用于初始化域变量 自由成员使用下划线开头(形式上的封装) ——定义方法 使用prototype..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 ——继承 调用构造函数 有父必须调用构造函数,否则会丢失继承效果...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用构造函数 } MyNamespace.Intern.prototype...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用构造函数 } MyNamespace.Intern.prototype...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用构造函数 } MyNamespace.Intern.prototype

6.2K50

【C++】构造函数分类 ② ( 不同的内存创建的实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同的内存创建的实例对象 1、栈内存创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) , 介绍了 三种类型的 构造函数 , 并在 main 函数 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 实例对象 , 最终将实例对象赋值给了...栈内存的 变量 Student s1 ; 这些都是 栈内存 创建 的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 栈内存只占 4 字节的指针变量大小 ; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建的 实例对象 ; 在下面的 C++ 代码 ,...声明并定义了 MyClass , 该类定义了一个有参构造函数 , 接受两个整数作为 构造函数参数 ; main 函数 , 使用 使用 new 关键字 来调用 有参构造函数 创建 MyClass

14820

【笔记】C++面向对象高级编程

这个课程主要是用来C++回顾和拾遗的,其中很多内容都来自他其它的课程,并且有很多是《EffectiveC++》的内容,在看了在看了。 这里直接就是当时记录的全部笔记了,有点乱,自己也不太满意。...父写好一套算法流程, 但是其中调用的都是虚函数, 子类实现父函数后, 调用的算法流程, 父由于本质上使用的是子类this指针, 因此会自动流程调用子类的实现....模板参数的标注类型可以用class也可以用typename, 建议使用typename防止歧义 C++对象模型 不管是复合还是继承, 都是内到外构造, 外到内析构的....编译器默认构造函数初始化阶段调用的默认构造函数, 然后析构函数的最后一行调用的析构函数...., 静态绑定是指非虚函数和不满足多态条件的虚函数调用, 静态绑定的情况下, 编译后的代码实际上直接调用call跳转到真正函数的地址进行执行 动态函数绑定需要满足三个条件: 通过指针进行调用, 指针是从子类上转型到父

88730

《Effective C++》读书笔记(二):构造析构赋值运算(条款05~条款12)

对于这六大默认成员函数,详细的解析和对象这篇博客将在这里简单的总结一下编译器是如何调用它们的。...而对于的自定义类型,它们会自动调用构造和析构函数,如果是别的的自定义类型,则会到它们自己中去调用它们的构造和析构函数多态,基构造,然后再是派生构造。...() { Corgi co; return 0; } 分析代码: 代码,用派生创建了一个派生的对象,构造函数调用的时候,会先去构造的成分,然后才会去构造派生成分,这就意味着,会先去调用构造函数...7.条款11:operator=处理“自我赋值” 自己自己赋值,这种情况不能说没有,只能说少见,比如: class A { public: A() {} ~A(){} }; int main...做法就是派生的拷贝构造函数和赋值重载调用的拷贝构造和赋值函数

33510

C++的new和delete详解

所以当对象是堆内存分配时,构造函数执前内存就已经完成分配,同样当析构函数执行完成后内存才会被销毁。...如果你代码里面使用的是new关键字那么系统内部除了会调用operator new操作符来分配内存还会调用构造函数,而如果你直接使用operator new时则只会进行内存分配而不会执行任何构造就比如下面的代码...如果说是第一步出现了问题导致内存分配失败则不会调用构造函数,这是没有问题的。如果说是第二步构造函数执行过程中出现了异常而导致无法正常构造完成,那么就应该要将第一步中所分配的堆内存进行销毁。...<< endl; } } 上面的代码可以看到CA的对象构造函数内部抛出了异常,虽然系统会对p对象执行自动删除技术来销毁分配好的内存,但是对于其内部的数据成员m_pa来说,因为构造不完整就不会调用析构函数来销毁分配的堆内存...这想就是为什么C++要支持对new/delete运算符重载的原因吧。

1.1K50

【细品C++】深入了解和对象(六大默认成员函数以及操作符重载)

的6个默认成员函数 在上一篇文章提到过空,也就是什么成员都没有的。 但事实上,空真的什么都没有吗?并不是,任何什么都不写时,编译器会自动生成以下6个默认成员函数。...注意:C++11针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量声明时可以给默认值。 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。...(也可以参考析构函数是否要自己实现,要,那么拷贝构造函数也要) 拷贝构造函数典型调用场景: 使用已存在对象创建新对象 函数参数类型为类型对象 函数返回值类型为类型对象 class date { public...此时用户再在自己实现一个全局的赋值运算符重载,就和编译器中生成的默认赋值运算符重载冲突了,所以赋值运算符重载只能是的成员函数。...表明该成员函数不能对的任何成员进行修改。

48220

C++:与对象(2)

这其实是设计过程遗留下来的一个问题,后来C++11 针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量声明时可以给默认值。  ...只要一开始我们把每个的定义的构造函数和析构函数都考虑清楚,那么其他的就放手交给编译器去做!! 四、拷贝构造函数  现实生活,可能存在一个与你一样的自己,我们称其为双胞胎。...(假如你银行先存了100万,后存了200元,如果由于这个原因导致的200把你的100万覆盖了。...此时用户再在自己实现一个全局的赋值运算符重载,就和编译器中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是的成员函数。...修饰的“成员函数”称之为const成员函数,const修饰成员函数,实际修饰该成员函数 隐含的this指针,表明该成员函数不能对的任何成员进行修改。

10210

学过 C++ 的你,不得不知的这 10 条细节!

---- 细节 07:绝不在构造和析构过程调用 virtual 函数 我们不该在构造函数和析构函数体内调用 virtual 函数,因为这样的调用不会带来你预想的结果。...构造函数调用,但首先 CFather(基构造函数一定会更早被调用。...---- 细节 07 小结 - 请记住 构造和析构期间不要调用 virtual,因为这类调用不会下降至派生。...---- 细节 09: operator= 处理「自我赋值」 「自我赋值」发生在对象被赋值给自己时: class A { ... }; A a; ... a = a; // 赋值给自己 这看起来有点愚蠢...---- 细节 10:复制对象时勿忘其每一个成分 以下把复制构造函数和赋值操作符函数,称为「copying 函数」。

68520

【C++】侯捷C++面向对象高级编程(下)

std::cout << typeid(f).name()<<std::endl;//class Fraction std::cout << d <<std::endl;//4.6 注意: 侯捷老师的视频的发现了一个小问题...允许或不允许限制的条件为: 下方代码构造函数。(父指针可以指向子类对象) 这样,让构造函数更有弹性 。...调用指针->向上转型(转为具体的子类)->调用函数 补充: 继承父函数,继承的是调用权。 父的虚函数子类也一定要有。 父和子类可以出现同名的函数,但实际上不是同一个。...---- this pointer 的成员函数,默认会有一个this指针传递进来。由编译器自己处理。...第一个参数必需为size_t——大小 其余参数为使用时()中指定的参数,例如下方示例的300,‘c’ 重载operator delete()后,绝对不会被delete调用,只有当new所调用构造函数抛出异常

60520

C++ new的三种面貌

void* raw=operator new(strlen(“hello world”)); //第二步:通过placement new调用string构造函数,初始化申请空间 new (raw)...作用是已经获得的堆空间上调用构造函数来初始化对象,也就是定位构造对象。...为何称为定位放置new,其作用上可以看出用于指定内存空间上调用构造函数构造对象。 给定一块已经申请好的内容空间,由指针void* ptr指定,考察如下程序。...(2)使用语句A *p=new (mem) A;定位生成对象时,会自动调用A的构造函数,对象生命周期结束时,也需要显示调用的析构函数,避免内存泄漏,如本例的p->~A()。...总结: (1)若想在堆上建立一个对象,应该用new运算符,它既分配内存又调用构造函数进行初始化。 (2)若仅仅想分配内存,应该调用operator new(),它不会调用构造函数

54821

Effective c++ 小结

自己重载operator new,则可以自己进行管理这个区块,减少内存使用 实现内存池,每次内存池中申请,若内存池也不够的话,则扩张之 所以,写了一个operator new之后,要对应写一个...3,基本类型的non-const, non-reference对象,初始化和赋值之间没有2所说的区别 条款13: 初始化列表成员列出的顺序和它们声明的顺序相同 编译器构造和析构的顺序是相反的...小tip:如果析构函数不是虚的,那么基和派生的析构都要调用 ,先调用派生,再调用 tip2:虚函数要占用class空间,要综合考量 条款15: 让operator=返回*this的引用...(*this) = rhs两种方式解决 条款17: operator=检查给自己赋值的情况 一般采用的方法: C& C::operator=(const C&rhs) {...获取控制性,比如只读、可读可写、不处理,通过不同的函数实现 函数抽象性,提供一个借口,底层如何实现上层用户不用关心 不过实际编程,很少人能够完全做到这点,毕竟需要自己花些时间来写get和set,暂时也没找到自动生成

74850

C++-带你初步走进继承(1)

下面写了三个,Student和Teacher都继承了Person,当我们调用监视窗口可以看到,Person里面的成员变量和成员函数Student和Teacher中都有,并且Student...Person和Student都写了一个fun函数,这两个fun函数只有参数不同,那么是构成重载吗?不是,这两个函数构成隐藏 ,为什么呢?...派生的拷贝构造函数必须调用的拷贝构造完成基的拷贝初始化。 3. 派生operator= 必须要调用operator= 完成基的复制。 4....,这就说明了当派生进行实例化时,会调用构造函数构造派生的成员。  ...当我自己写了一个Student的构造函数,那么怎么初始化基的成员呢?可以初始化列表调用构造函数,然后我们可以看到,是先调用了基构造函数,再构造派生的成员。

10510

C++ new 的三种面貌

当为成员函数时,使用 new 产生对象时调用的则是其成员函数 operator new()。...作用是已经获得的堆空间上调用构造函数初始化对象,也就是定位构造对象。...为何称为定位放置 new,因为其作用是指定内存空间上调用构造函数初始化对象。 给定一块已经申请好的内容空间,由指针void* ptr指定,考察如下程序。...(2)使用语句A *p=new (mem) A;定位生成对象时,会自动调用 A 的构造函数,对象生命周期结束时,也需要显示调用的析构函数,避免内存泄漏,如本例的p->~A()。...4.小结 (1)若想在堆上建立一个对象,使用 new 运算符,它既分配内存又调用构造函数完成初始化。 (2)若仅仅想分配内存,应该调用 operator new(),它不会调用构造函数

27410

C++ new的三种面貌

当为成员函数时,使用new产生对象时调用的则是其成员函数operator new()。如果要重载全局的operator new会改变所有默认的operator new的方式,所以必须要注意。...作用是已经获得的堆空间上调用构造函数来初始化对象,也就是定位构造对象。...为何称为placement new,其用法可以看出只是用于调用构造函数。 定位放置new操作的语法形式不同于普通的new操作。...(3)使用语句A *p=new (mem) A;定位生成对象是,会自动调用A的构造函数,但是由于对象的空间不会自动释放(对象实际上是借用别人的空间),所以必须显示的调用的析构函数,如本例的p->~...它既分配内存又调用构造函数进行初始化。 (2)若仅仅想分配内存,应该调用operator new(),他不会调用构造函数

5.1K10

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

和对象 往期 和对象(上篇) ,我们初步接触了C++和对象,接下来我会和大家分享有关这个知识点更多的内容~ 的六大默认成员函数 如果一个什么成员都没有,简称为空。...我们可以观察下面的程序,我们日期的成员变量,添加了一个时间的自定义类型 _t ,我们会发现编译器生成默认的构造函数会对自定类型成员 _t 调用了它的默认成员函数。...例如日期,日期的析构函数虽然没有资源需要清理,最后系统直接将其内存回收即可,但是在对象销毁时还是会自动调用;我们析构函数打印了它的函数名,证明它有调用析构函数: // 日期 class...,并在里面打印它的函数名字,证明它确实被调用;然后我们日期的成员变量添加自定义类型 _t,我们观察它是否会自动调用 Time 的析构函数: 我们可以看到,对于自定义类型,编译器确实调用了它的析构函数...: 如上图,我们可以观察到,构造函数调用是按照全局域先构造,再到局部域顺序进行构造的; 然后我们观察谁先调用析构函数: 我们可以观察到,是局部域先调用析构函数,而且是按照栈的结构顺序,先构造的后析构

9310

【C++】拷贝构造函数和赋值运算符重载详解

⭐拷贝构造函数 ⭐概念 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 类型对象创建新对象时由编译器自动调用。...C++,拷贝构造函数通常用于将一个对象的值复制到另一个对象(一个对象存在,一个对象不存在),以便在程序中进行对象的赋值和传递操作时,能够确保对象的内容被正确复制。...(函数名也与名相同,第一个参数是隐式的this,第二个参数是被拷贝的对象,如果我们自己实现了拷贝构造函数,也要自己实现一个构造函数,否则会报错,如图:) 拷贝构造函数的参数只有一个且必须是类型对象的引用...0; } 注意:在编译器生成的默认拷贝构造函数,内置类型是按照字节方式直接拷贝的,而自定 义类型是调用其拷贝构造函数完成拷贝的。...此时用户再在自己实现一个全局的赋值运算符重载,就和编译器中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是的成员函数

13710

细说new与malloc的10点区别

当时回答new自由存储区上分配内存,malloc堆上分配内存;new/delete会调用构造函数/析构函数对对象进行初始化与销毁;operator new/delete可以进行重载;然后强行分析了一下自由存储区与堆的区别...第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。 总之来说,new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。...可以看出A的默认构造函数并没有被调用,因为数据成员a,b的值并没有得到初始化,这也是上面为什么说使用malloc/free来处理C++的自定义类型不合适,其实不止自定义类型,标准库凡是需要构造/析构的类型通通不合适...)noexcept; 我们可以自定义上面函数版本的任意一个,前提是自定义版本必须位于全局作用域或者作用域中。...调用调用 malloc给你的就好像一块原始的土地,你要种什么需要自己土地上来播种 ?

1.4K52
领券