C++中对象的赋值拷贝构造函数
目录
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++中对象的赋值拷贝构造函数相关推荐
- JS 中对象的深浅拷贝(ES3、ES5、ES6不同方法底层实现,一文搞清楚深浅拷贝面试常问题)
JS 中对象的深浅拷贝 拷贝我们都知道这个词的意思,我们经常做过复制.粘贴的操作,其中的复制就是拷贝,那么在拷贝的时候,如果我们复制出来的内容和原内容是完全的分开,各自不相影响,那么这就属于深拷贝 ...
- python中对象的赋值、浅拷贝和深拷贝
1. 赋值:简单的对象引用 在python中,变量赋值实际上是简单的对象引用.在创建一个对象后,再把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是简单地拷贝了这个对象的引用. (1)原 ...
- C++中对象初始化赋值是否需要调用operator=函数
一般对于初始化类变量有两种方式: A a; A b = a; 另一种方式是: A a ; A b; a =b; 对于第一种方式,编译器相当于在b的初始化的时候,用a的引用作为复制构造函数的参数进行操作 ...
- java里使用等号对象赋值_在Java中对象可以赋值, 只要使用赋值号(等号)即可, 相当于生成了一个各属性与赋值对象相同的新对象。...
本可文件_文的副的_库中以存重要件中放在数据,中只值号值对中公文管理. 对自严格件要求较然条,对象等号当于不属物的下列于经济作是(,对象等号当于化生宜于专门集中进行产,物定经途的有某农作指具种特济用, ...
- Java中数组的赋值拷贝
在Java中,基本数据类型的赋值和拷贝如下: 例如 int num = 1; int pum = num; pum = 3; 此时输出sum的值还是1,而pum的值则为3. 对于数组来说,该操作为引用 ...
- 构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...
- C++——拷贝构造函数和赋值函数的注意点
每个类只有一个赋值函数,由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视. 1.如果不主动编写拷贝构造函数和赋值函数,编译器将以"位拷贝"的方式自动 ...
- 拷贝构造函数和赋值构造函数声明为私有的作用
转贴地址:http://blog.csdn.net/winer632/archive/2009/01/12/3762292.aspx 每个类只有一个赋值函数. 由于并非所有的对象都会使用拷贝构造函数和 ...
- 网易游戏笔试题:编写string类的构造函数、拷贝构造函数、赋值构造函数和析构函数
题目: class MyString { public: MyString(const char *str);//构造函数 MyString(const MyString& strClass) ...
最新文章
- mysql的配置文件几个_mysql多实例(多个配置文件方式)
- RxSwift之UI控件UIGestureRecognizer扩展的使用
- NodeJS使用ES6
- 深度学习背后的数学_深度学习背后的简单数学
- 百度产品经理vs 腾讯产品经理:技术大牛与小白
- JS弹窗确认Ajax封装方法
- 排序----在线性时间内排序
- 读书笔记《推荐系统实践》- 个性化推荐系统总结
- 阿里巴巴菜鸟网络面试经历
- wps文字表格制作拼音田字格模板_WPS文字怎么制作田字格 WPS文字制作田字格的方法...
- matlab中如何保存脚本,matlab保存fig文件,matlab如何保存fig
- 项目UML设计--日不落战队
- 入手评测华为nova10和vivoS15pro选哪个
- 转载自www.dezai.cn 常用sql统计
- access_stratum_release version
- 关于Invalid bound statement (not found)出现原因和解决方法
- 机器学习算法(二):决策树理论与python实现+经典应用(预测隐形眼镜类型)
- 建立私有CA实现证书申请颁发
- 本人在上海,做java3年了,最近在找工作,一言难尽
- Java-九九加法表