目录

1.对象与对象之间的赋值。

下面给出代码说明赋值语句

对象赋值的限制和特点

2.拷贝构造函数

拷贝构造函数的特点

自定义的拷贝构造函数的代码及运行结果

默认拷贝构造函数

调用拷贝构造函数的3种情况

结束!


1.对象与对象之间的赋值。

 同类型的对象之间可以进行赋值操作,即一个对象的值可以赋给另一个对象的。所指的对象的赋值是指对其中的数据成员赋值,而不是对成员函数赋值。

下面给出代码说明赋值语句

#include<iostream>using namespace std;class Object
{int va;int vb;
public:Object(int x = 0, int y = 0) :va(x), vb(y){}void Print(){cout << va << "   " << vb << endl;}
};int main()
{Object obj1(12, 23);Object obj2;cout << "before assignment:" << endl;cout << "obj1:";obj1.Print();cout << "obj2:";obj2.Print();cout << "after assignment:" << endl;//将对象obj1的值赋给obj2obj2 = obj1;//等价于Obj2.va = obj1.va;obj2.vb = obj1.vb;cout << "obj1:";obj1.Print();cout << "obj2:";obj2.Print();return 0;
}

对象赋值的限制和特点

  • (1)在使用对象赋值语句进行对象赋值时,两个对象的类型必须相同,如果对象的类型不相同,编译时就会出错。
  • (2)两个对象之间的赋值,仅仅使这些对象中数据成员相同,而两个对象仍然是分离的。也就是说,在上面给出的代码中,obj1的va1,va2改变不会影响obj2的va,vb的改变。
  • (3)对象赋值是通过默认赋值运算符函数实现的(以后会介绍到)。
  • (4)将一个对象的值赋给另一个对象时,在大多数情况下都是成功的,但是当类中存在指针时,可能会产生错误。

2.拷贝构造函数

拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。拷贝构造函数的作用是:在建立一个新对象时,使用一个已经存在的对象去初始化这个新对象。

拷贝构造函数的特点

  • (1)该函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回值类型。
  • (2)该函数只有一个参数,并且是同类对象的引用。
  • (3)每个类都必须有一个拷贝构造函数。我们可以自定义拷贝构造函数,用于按照需要初始化新对象。如果我们没有定义类的拷贝构造函数,系统就会自动生成产生一个默认拷贝构造函数,用于复制出数据成员值完全相同的新对象。

自定义的拷贝构造函数的代码及运行结果

#include<iostream>using namespace std;class Object
{int va;int vb;
public:Object(int x = 0, int y = 0) :va(x), vb(y)//构造函数{}Object(const Object& obj)//自定义的拷贝构造函数{va = 2 * obj.va;vb = 2 * obj.vb;}void Print(){cout << va << "   " << vb << endl;}
};int main()
{Object obj1(12, 23);//定义对象obj1,调用了构造函数Object obj2(obj1);//代入法调用拷贝构造函数,用于初始化对象obj2cout << "obj1:";obj1.Print();cout << "obj2:";obj2.Print();Object obj3 = obj1;//赋值法调用拷贝构造函数//虽然看起来是将对象obj1赋值给了对象obj3,但是实际上调用的是拷贝构造函数,运行结果没有发生变化//利用此方法可以在一个语句中进行多个对象的复制,Object obj3 = obj1,obj3 = obj2;cout << "obj3:";obj3.Print();return 0;
}

在程序中,用一个对象去初始化另一个对象,或者说,用一个对象去复制另一个对象,可以有选择、有变化地复制,类似于用复印机复印文件一样,可大可小,也可以复印其中的一部分。

默认拷贝构造函数

系统自动生成的一个默认拷贝构造函数,用于赋值出安全相同的新对象。

这里给出代码说明:

#include<iostream>using namespace std;class Object
{int va;int vb;
public:Object(int x = 0, int y = 0) :va(x), vb(y)//构造函数{}void Print(){cout << va << "   " << vb << endl;}
};int main()
{Object obj1(12, 23);//定义对象obj1,调用了构造函数Object obj2(obj1);//代入法调用拷贝构造函数,用于初始化对象obj2cout << "obj1:";obj1.Print();cout << "obj2:";obj2.Print();return 0;
}

在通常情况下,默认拷贝构造函数是能够胜任工作的,但是如果类中有指针类型时,调用默认拷贝构造函数有时会产生错误,在使用时一定要给与注意。

调用拷贝构造函数的3种情况

  • (1)当用类的一个对象去初始化该类的另一个对象时,拷贝构造函数将会被调用。
  • (2)当函数的形参是类的对象,在调用函数进行形参和实参结合时,拷贝构造函数将会被调用。
  • (3)当函数的返回值是类的对象时,在函数调用完成后将返回值(对象)带回函数调用处时。此时就会调用拷贝构造函数,将此对象复制给一个临时对象并传到该函数的调用处。执行完调用语句后,临时对象的使命也就完成了,该临时对象就自动消失了

这里给出代码说明以上3种情况:

#include<iostream>using namespace std;class Object
{int va;int vb;
public:Object(int x = 0, int y = 0) :va(x), vb(y)//构造函数{cout << "normal construcor:" << endl;}Object(const Object& obj)//自定义的拷贝构造函数{va = 2 * obj.va;vb = 2 * obj.vb;cout << "copy construcor:" << endl;}void Print(){cout << va << "  " << vb << endl;}
};void fun(Object obj)
{obj.Print();
}
Object fun2()
{Object obj5(100, 200);return obj5;
}
int main()
{Object obj1(12, 23);obj1.Print();Object obj2(obj1);//(1)obj2.Print();fun(obj1);//(2)obj1 = fun2();//(3)obj1.Print();return 0;
}

结束!

对象与对象之间的赋值;拷贝构造函数及其特点、调用就说完了,后续有补充的话我会再写到这里!

C++中对象的赋值拷贝构造函数相关推荐

  1. JS 中对象的深浅拷贝(ES3、ES5、ES6不同方法底层实现,一文搞清楚深浅拷贝面试常问题)

    JS 中对象的深浅拷贝   拷贝我们都知道这个词的意思,我们经常做过复制.粘贴的操作,其中的复制就是拷贝,那么在拷贝的时候,如果我们复制出来的内容和原内容是完全的分开,各自不相影响,那么这就属于深拷贝 ...

  2. python中对象的赋值、浅拷贝和深拷贝

    1. 赋值:简单的对象引用 在python中,变量赋值实际上是简单的对象引用.在创建一个对象后,再把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是简单地拷贝了这个对象的引用. (1)原 ...

  3. C++中对象初始化赋值是否需要调用operator=函数

    一般对于初始化类变量有两种方式: A a; A b = a; 另一种方式是: A a ; A b; a =b; 对于第一种方式,编译器相当于在b的初始化的时候,用a的引用作为复制构造函数的参数进行操作 ...

  4. java里使用等号对象赋值_在Java中对象可以赋值, 只要使用赋值号(等号)即可, 相当于生成了一个各属性与赋值对象相同的新对象。...

    本可文件_文的副的_库中以存重要件中放在数据,中只值号值对中公文管理. 对自严格件要求较然条,对象等号当于不属物的下列于经济作是(,对象等号当于化生宜于专门集中进行产,物定经途的有某农作指具种特济用, ...

  5. Java中数组的赋值拷贝

    在Java中,基本数据类型的赋值和拷贝如下: 例如 int num = 1; int pum = num; pum = 3; 此时输出sum的值还是1,而pum的值则为3. 对于数组来说,该操作为引用 ...

  6. 构造函数,拷贝构造函数,赋值函数

        C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...

  7. C++——拷贝构造函数和赋值函数的注意点

    每个类只有一个赋值函数,由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视. 1.如果不主动编写拷贝构造函数和赋值函数,编译器将以"位拷贝"的方式自动 ...

  8. 拷贝构造函数和赋值构造函数声明为私有的作用

    转贴地址:http://blog.csdn.net/winer632/archive/2009/01/12/3762292.aspx 每个类只有一个赋值函数. 由于并非所有的对象都会使用拷贝构造函数和 ...

  9. 网易游戏笔试题:编写string类的构造函数、拷贝构造函数、赋值构造函数和析构函数

    题目: class MyString { public: MyString(const char *str);//构造函数 MyString(const MyString& strClass) ...

最新文章

  1. mysql的配置文件几个_mysql多实例(多个配置文件方式)
  2. RxSwift之UI控件UIGestureRecognizer扩展的使用
  3. NodeJS使用ES6
  4. 深度学习背后的数学_深度学习背后的简单数学
  5. 百度产品经理vs 腾讯产品经理:技术大牛与小白
  6. JS弹窗确认Ajax封装方法
  7. 排序----在线性时间内排序
  8. 读书笔记《推荐系统实践》- 个性化推荐系统总结
  9. 阿里巴巴菜鸟网络面试经历
  10. wps文字表格制作拼音田字格模板_WPS文字怎么制作田字格 WPS文字制作田字格的方法...
  11. matlab中如何保存脚本,matlab保存fig文件,matlab如何保存fig
  12. 项目UML设计--日不落战队
  13. 入手评测华为nova10和vivoS15pro选哪个
  14. 转载自www.dezai.cn 常用sql统计
  15. access_stratum_release version
  16. 关于Invalid bound statement (not found)出现原因和解决方法
  17. 机器学习算法(二):决策树理论与python实现+经典应用(预测隐形眼镜类型)
  18. 建立私有CA实现证书申请颁发
  19. 本人在上海,做java3年了,最近在找工作,一言难尽
  20. Java-九九加法表

热门文章

  1. redisTemplate清除缓存
  2. AD的常用快捷键——PCB部分
  3. 基于java的人事管理系统|人力请假考勤工资人事奖惩
  4. JavaScript_函数_this
  5. 2021-2022半导体行业投资策略:矛盾与破局.pdf.
  6. python 实现多任务协程下载斗鱼平台图片
  7. js-农历-生肖查找
  8. 为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案
  9. 使用OFFSET函数完成二级城市菜单
  10. python创建画布的函数_使用Python的turtle(海龟)模块画图