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

当我修改复制构造函数做一些奇怪的事情,然后通过值将一个(该类的)对象传递给函数时会发生什么?

当修改复制构造函数并进行一些奇怪的操作后,通过值将一个该类的对象传递给函数时,会发生以下情况:

  1. 首先,复制构造函数用于创建一个新的对象,该对象与原始对象具有相同的属性和值。如果复制构造函数被修改,可能会导致创建的新对象与原始对象有所不同。
  2. 当将该对象传递给函数时,如果函数参数是按值传递的,将会调用复制构造函数来创建函数内部的副本。这意味着会再次调用修改后的复制构造函数,可能会导致创建的副本与原始对象和之前创建的新对象有所不同。
  3. 如果函数内部对传递的对象进行修改,这些修改只会影响函数内部的副本,而不会影响原始对象或之前创建的新对象。
  4. 如果函数返回一个对象,并且该对象是通过复制构造函数创建的,同样会调用修改后的复制构造函数来创建返回的对象。这可能会导致返回的对象与原始对象、传递给函数的对象和之前创建的新对象有所不同。

总之,修改复制构造函数并进行奇怪操作后,通过值将一个该类的对象传递给函数会导致创建的对象和副本可能与原始对象有所不同,并且函数内部对对象的修改只会影响副本而不会影响原始对象。

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

相关·内容

C++缺陷与思考(上)

我们按照上面对左右分析,当一个变量时,该变量只读,不会被修改,那么,“引用”这个变量自然是想让引用成为这个变量替身,而如果我们希望这里事情是“当通过这个引用来操作实体时候,实体不能被改变...buffer,然后对这个buffer一些修改操作,最后可能把这个buffer输出出去之类(代码中没有体现,但是一般业务肯定会有)。...由于我们在Buffer类中定义了拷贝构造函数来实现深复制,那么任何传入buffer都会在这里进行一次拷贝构造(深复制)。再观察Demo中调用,仅仅是一个临时对象而已。...把buf2强制“亡”,把“遗体”转交个buf3,buf3原本东西不要了} 为了解决用一个对象构造/赋值另一个对象情况,引入了移动构造和移动赋值函数,既然是用一个对象,那么参数自然是右引用来接收了...,我们希望是保持其左右性 但如果不这样当我向f2传递右时,右性无法传递下去,也就是t2是int &&类型,但是传递给f1时候,t1变成了int &类型,这时t1是t2引用(就是左引用绑定右引用场景

1.6K50

【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)

特点如下: 1. c++规定对象只要发生拷贝行为,就必须调用拷贝构造,包括对象传参或者返回,都需要产生一份临时拷贝。 2. 拷贝构造函数一个参数必须是类类型引用,而不是对象。...因为对象时候需要调用拷贝构造,如果拷贝构造参数带有对象临时拷贝,那就会再次调用拷贝构造,以至于发生无限递归。 3. 如果我们没有显示定义拷贝构造函数,编译器会自动生成一个拷贝构造。...& m)//确保源数据不被修改,在引用之前加上const { //逐一完成成员变量复制 _a = m....所以对于这种情况(类中有额外申请资源),我们就需要手动去写一个拷贝构造函数,实现深拷贝,申请内存也复制一份出来。 小技巧:是否需要显示写拷贝构造函数,就看类中是否有显示写析构函数。...如果有写析构函数,那么通常需要写拷贝构造当我们在某个函数当中将对象作为返回时,由于这个返回是一份临时拷贝,所以会自动调用拷贝构造函数,造成运行效率下降。

13310
  • JavaScript 工厂函数 vs 构造函数

    工厂函数 所谓工厂函数,就是指这些内建函数都是类对象,当你调用他们时,实际上是创建了一个类实例”。意思就是当我调用这个函数,实际上是先利用类创建了一个对象然后返回这个对象。...如果我们在工厂和构造函数中使用new关键字会发生什么 如果在使用构造函数创建对象实例时不使用new关键字会发生什么,试着找出以上问题答案之前,我们先做一个小练习来理解这里面发生什么。...__proto__属性,属性一个普通对象 所有的函数,都有一个prototype属性,属性也是一个普通对象 所有的引用类型(数组、对象函数),__proto__属性指向它构造函数prototype...当我们使用工厂函数创建对象时,它__proto__指向Object.prototype,而当从构造函数创建对象时,它指向它构造函数原型对象。 那么这里发生什么?...因此,使用new运算符,JavaScript引擎this 变量设置为引用新创建对象实例,这就是为什么我们可以看到传递给构造函数所有属性都已设置为 mike。

    1.1K20

    理解std::move和std::forward

    此类构造函数接受一个包含注释std::string参数,并且将此参数拷贝到一个数据成员上,你声明一个接收by-value参数构造函数。...//so per Item 41, pass by value }; 但是Annotation构造函数只需要读取text。并不需要修改它。根据一个历史悠久传统:能使用const时候尽量使用。...这样行为对于保持const正确性是必须。从一个对象里move出一个通常会改变这个对象,所以语言不允许const对象递给像move constructor这样会改变次对象函数。...为了让以上代码行为表现正确,我们需要一个机制,param转化为rvalue当且仅当:传递给logAndProcess用来初始化param参数必须是一个rvalue.这正是std::forward事情...std::move就是为了move操作而生,而std::forward,就是一个对象转发(或者说传递)给另外一个函数,同时保留此对象性或右性(lvalueness or rvalueness)

    1.7K21

    C++-->类

    1 数据抽象和封装 抽象是通过特定实例抽取共同特征以后形成概念过程。一个对象是现实世界中一个实体抽象,一个类是一组对象抽象。 封装是将相关概念组成一个单元,然后通过一个名称来引用它。...面向对象封装是数据和基于数据操作封装成一个整体对象,对数据访问或修改只能通过对象对外提供接口进行。...Peopel a1; Peopel a2 = a1; 当将该类对象递给函数函数返回该类对象时,隐式使用复制构造函数。...合成复制构造函数行为是,执行逐个成员初始化,对象初始化为原对象副本。 逐个成员初始化:合成复制构造函数直接复制内置类型成员,类类型成员使用该类复制构造函数进行复制。...例如,类有一个数据成员是指针,或者有成员表示在构造函数中分配其他资源。而另一些类在创建新对象时必须一些特定工作。这两种情况下,都必须定义自己复制构造函数

    74630

    Python学习笔记之函数参数传递 还是引用

    在学完Python函数那一章节时,很自然就会想到Python中函数参时呢?还是引用?或者都不是? ...二、可变对象与不可变对象 在Python基本数据类型中,我们知道numbers、strings和tuples是不可更改对象,而list、dict是可以修改对象。那么可变与不可变有什么区别呢?...然后函数中var = 2时,因为int对象不可改变,于是创建一个int对象为2)并且令var指向它。而a仍然指向原来为1int对象,所以函数没有改变变量a。 如下图: ?...因为list对象是可以改变函数中使用append在其末尾添加了一个元素,list对象内容发生了改变,但是b和var仍然是指向这一个list对象,所以变量b内容也发生了改变。 如下图: ?...那么Python中参数传递是,还是引用呢?准确回答:都不是。之所以不是,因为没有产生复制,而且函数拥有与调用者同样对象。而似乎更像是C++引用,但是有时却不能改变实参

    1.9K30

    C++如何禁止函数调用

    调用与后面两者区别在于调用在进入函数体之前,会在栈上建立一个实参副本,而引用和指针调用没有这个动作。建立副本操作是利用拷贝构造函数进行。...但是,这不是一个办法,应该在编译阶段就告诉程序员,不能使用该类拷贝构造函数。 1.不显示定义拷贝构造函数可行吗?...&,编译无法通过,出错信息如下:非法复制构造函数: 第一个参数不应是“A”。...原因是如果拷贝构造函数参数不是一个引用,即形如A(const A a),那么就相当于采用了方式(pass-by-value),而方式会调用该类拷贝构造函数,从而造成无穷递归地调用拷贝构造函数...显式或隐式地用同类型一个对象来初始化另外一个对象; b. 作为实参以传递方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回类型拷贝构造函数; d.

    2.4K30

    Python小知识点(5)--面向对象部分

    然后在类中__init__需要一个参数接受该对象,故选用self,self代表是当前对象引用,指向是同一块内存地址,所以不需要使用return返回。...在底层是通过----》类.方法(对象名)实现该过程。最终实现是谁调用这个方法,谁就把自己传递给该方法。...r.got_shot()======》实质为Role.got_shot(r) 3.在构造函数中初始化:在内存中开辟一块空间,然后一些进行存储。...总结:通过试验可以知道 我们通过实例修改类中同名变量,实质为是在该实例内存中新增了一个与类变量同名实例变量。其他实例来调用该类类变量时,其中类变量是没有发生变化。...需要注意是若变量是一个list则修改一个影响全部,这是由于他们共用是同一个内存地址。 实例变量是为了区别每个对象不同点,而类变量是该类所用实例对象共用

    50940

    《Effective C++》学习笔记

    ,则不会去生成赋值构造函数,因为无法修改引用对象和const,除非我们自己去定义赋值构造函数行为。...如果想调用父类构造函数一些事情,替换做法是:在子类调用父类构造函数时,向上传递一个给父类构造函数。...条款12:复制对象时勿忘其每一个成分 复制构造函数和赋值构造函数要确保复制对象所有成员变量和所有基类成分,这意味着你如果自定义以上构造函数,那么每增加成员变量,都要同步修改以上构造函数,且要调用基类相应构造函数...复制构造函数和赋值构造函数看似代码类似,但不要用一个调用另一个,好做法是建立一个private成员函数这件事,然后两个构造函数都调用该成员函数。...对于我们自己设计函数,往往想要提供强烈保证,即一旦发生异常,程序整个状态会回到执行函数状态,实现方法一般用复制一个副本然后执行操作,全部成功后再替换原对象方式来实现。

    1.1K20

    C++复习大全(各种知识点)

    RAII对象复制,会发生什么? ...这些拷贝复件都是通过调用拷贝构造函数产生,这样使得调用方式带来了很大时间开销和内存开销(当然,这是基于一个比较大对象来说)  - 每次给函数参,都会调用一次拷贝构造函数,同样,也会调用一次析构函数...比如一个color枚举类型,编译器是这样  enum color{  a++; //本质上这样是不对  }; //必须加上;  1.枚举隐式地从 color 强制转化为 int,然后递增该...当编译器需要创建一个对象又不知道任何细节时,默认构造函数就显得非常重要  - 当有构造函数而没有默认构造函数时,定义变量就会出现一个编译错误  - 因为由编译器生成构造函数应该可以一些智能化初始化工作...- 构造函数重载,当我们想要初始化对象中不同个数数据时,我们就可以同时在类中声明在类外定义多个构造函数

    1.1K20

    C++ 复制控制之复制构造函数

    所谓复制控制”即通过这三个成员函数控制对象复制过程。本篇文章介绍复制构造函数。...当定义一个对象并用一个同类型对象对它进行初始化时候,显式使用复制构造函数,如: BOOK book1; BOOK book2(book1);     当将该类对象递给函数或从函数返回该类对象时...作为传递实参传递给一个函数函数返回时复制一个对象。 初始化顺序容器中元素。...类类型:调用该类复制构造函数进行复制。 数组:这个比较特殊,因为我们知道一般不能复制数组,但在类中,复制数组时合成复制构造函数复制数组一个。...我们可以复制构造函数定义为private,不允许用户代码复制该类类型对象,若进行复制将在编译时发生错误。

    78530

    苏州同程旅游学长给我全面的面试知识库

    一个对象一个实例,通过它我们可以访问该类方法。“新建”关键字用于创建对象。在内存中创建对象包含有关该类方法,变量和行为信息。...7、定义构造函数 构造函数是与该类具有相同名称类中成员函数。每当创建对象类时,都会自动调用构造函数。它在初始化类时构造数据成员。 8、什么是锯齿状阵列? 具有数组类型元素数组称为锯齿数组。...“使用”块用于获取资源并对其进行处理,然后在执行完该块后自动将其丢弃。 11、什么是序列化? 当我们想通过网络传输对象时,我们必须将对象转换为字节流。将对象转换为字节流过程称为序列化。...如果我们强制密封类指定为基类,则会发生编译时错误。 18、什么是方法重载? 方法重载是在同一个类中创建多个具有相同名称且具有唯一签名方法。编译时,编译器使用重载解析来确定要调用特定方法。...当我修改字符串变量时,会将新内存分配给新,并释放先前内存分配。

    3K20

    前端高频面试题(二)(附答案)

    bind 绑定之后函数当作构造函数通过 new 操作符使用,则不绑定传入 this,而是 this 指向实例化出来对象 // 此时由于new操作符作用 this指向result实例对象...';复制代码通过原型链判断obj....__proto__ === Array.prototype;复制代码通过ES6Array.isArray()判断Array.isArrray(obj);复制代码通过instanceof判断obj...__proto__; }}复制代码map和foreach有什么区别foreach()方法会针对每一个元素执行提供得函数,该方法没有返回,是否会改变原数组取决与数组元素类型是基本类型还是引用类型...map()方法不会改变原数组,返回一个新数组,新数组中为原数组调用函数处理之后复制代码

    29030

    Python常见编程基础问题总结

    __init__ 方法并不是真正意义上构造函数, __new__ 方法才是(类构造函数是类一种特殊成员函数,它会在每次创建类对象时执行); __new__ 方法用于创建对象并返回对象,当返回对象时会自动调用...,它可以让其他函数或类在不需要做任何代码修改前提下增加额外功能,装饰器返回也是一个函数/类对象。...map 与 reduce 函数用法解释 1、map() 函数接收两个参数,一个函数一个是 Iterable,map 传入函数依次作用到序列每个元素,并将结果作为新 Iterator 返回,...意味着这些对象或包含可以被修改。但也有些对象是不可变,例如数值型 int、字符串型 str 和元组 tuple。...当浅复制是不可变对象(数值,字符串,元组)时和=“赋值”情况一样,对象 id 与浅复制原来相同。 2、复制可变数据类型: 直接赋值:其实就是对象引用(别名)。

    1K20

    React高频面试题(附答案)

    拿到这两个之后,我们就可以通过一些对比逻辑来决定是否有 re-render(重渲染)必要了。如果该函数返回为 false,则生命周期终止,反之继续;注意:此方法仅作为性能优化方式而存在。...构造函数主要用于两个目的:通过对象分配给this.state来初始化本地状态事件处理程序方法绑定到实例上所以,当在React class中需要设置state初始或者绑定事件时,需要加上构造函数,...this对象;子类必须在constructor方法中调用super方法;否则新建实例时会报错;因为子类没有自己this对象,而是继承父类this对象然后对其进行加工。...在调用setState 之后发生什么状态合并,触发调和: setState函数之后,会将传入参数对象与当前状态合并,然后出发调用过程根据新状态构建虚拟dom树 经过调和过程,react会高效根据新状态构建虚拟...增加,但这时会发现值不会发生任何变化,一直保持 props 进来

    1.5K21

    复制构造函数

    生成一个对象副本有两种途径——第一种途径是建立一个对象然后一个已有对象数据成员取出来,赋值给新对象。这样虽然可行 但是实在是太麻烦了。...前面我们已经向大家介绍了函数具有 引用传递 参方式——我们可以看到,复制构造函数使用就是引用参。 为什么这里要使用引用来参呢?...因为我们知道,传递就是当函数发生调用时候,给形参分配内存空间,然后用实参来初始化形参——如果参数是一个对象的话,那么对于传递来说,“初始化形参”这个过程就会造成很多额外时间开销,浪费系统资源...主要是以下三种情况: 当用类一个对象去初始化该类一个对象时候: Point a(1,2); Point b(a);//用对象a初始化对象b,复制构造函数被调用 Point c = b;//用对象...同样,对于复制构造函数来说,我们也可以自己实现一些有选择、有变化复制——例如下面的代码,可以把每一个复制构造得到Point对象,横坐标增加10: Point(Point &p){ x =

    83420

    12步轻松搞定Python装饰器

    在#2处我们调用进来函数:" ()代表着调用操作并且调用变量包含。 在#3处,你们也能看到传递函数并没有什么特殊语法。"函数名称只是很其他变量一样表标识符而已。...现在你说不定也可以写一个 itemgetter方法,接收一个索引来返回一个完美的函数,传递给排序函数参数 key。 不过,我们现在不会用闭包这么low事(⊙o⊙)…!...想象我们有一个库,这个库能够提供类似坐标的对象,也许它们仅仅是一些x和y坐标对。不过可惜是这些坐标对象不支持数学运算符,而且我们也不能对源代码进行修改,因此也就不能直接加入运算符支持。...def checker(a, b): 这个装饰器能想先前装饰器例子一样进行工作,返回一个经过修改函数,但是在这个例子中,它能够对函数输入参数和返回一些非常有用检查和格式化工作,负值 x和...显而易见,通过这样方式,我们代码变得更加简洁:边界检查逻辑隔离到单独方法中,然后通过装饰器包装方式应用到我们需要进行检查地方。

    86850
    领券