C++中的对象的赋值和复制
对象的赋值
如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象。这里所指的对象的值是指对象中所有数据成员的值。
对象之间的赋值也是通过赋值运算符“=”进行的。本来赋值运算符“=”只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的。
实际上这个过程是通过成员复制来实现的,即将一个对象的成员值一一复制给另外一个对象的成员。
对象赋值的一般形式:
对象名1=对象名2;
注意,对象1和对象2必须是属于同一个类
=========示例代码1.1===============
- #include<iostream>
- #include<string>
- using namespace std;
- class Student
- {
- public:
- Student(int nu=0,string na="NULL",int=0);//构造函数
- void show();
- private:
- int num;
- string name;
- int score;
- };
- Student::Student(int nu,string na,int sc)
- {
- num=nu;
- name=na;
- score=sc;
- }
- void Student::show()
- {
- cout<<"date:"<<endl;
- cout<<"num:"<<num<<"\tname:"<<name<<"\tscore:"<<score<<endl;
- }
- int main()
- {
- Student s1(1,"qianshou",99);
- s1.show();
- Student s2;
- s2=s1;
- s2.show();
- return 0;
- }
运行界面:
说明:
(1)对象的赋值值对其中的数据成员赋值,而不对成员函数赋值。
数据成员是占存储空间的,不同的对象的数据成员占有不同的存储空间,赋值过程是将一个对象的数据成员在存储空间的状态复制给另一对象的数据成员的存储空间。
而不同对象的成员函数是同一个函数代码段,既不需要也没法向它们赋值。
(2)类的数据成员中,不能包括动态分配的数据。
对象的复制
- Student s2(s1);
- Student::Student(const Student &b)
- {
- num=b.num;
- name=b.name;
- score=b.score;
- }
复制构造函数也是构造函数,但它只有一个参数,这个参数时本类的对象,而且采用对象的引用形式(一般约定加const声明,使参数值不能改变,以免在调用函数时因不慎而使对象值被修改)。此复制构造函数的作用就是将实参对象的各数据成员的值一一赋给新的对象中的成员的值。
- Student s2(s1);
这实际上也是建立对象的语句,建立一个新对象s2。由于在括号内给定的实参是对象,编译系统就调用复制构造函数,实参s1的值传给形参b(b是s1的引用)。
- Student s2=s1;
- Student s2=s1,s3=s2,s4=s3;
对象的复制和赋值的区别
- #include<iostream>
- #include<string>
- using namespace std;
- class Student
- {
- public:
- Student(int nu=0,string na="NULL",int=0);//构造函数
- void show();
- void reset();
- private:
- int num;
- string name;
- int score;
- };
- Student::Student(int nu,string na,int sc)
- {
- num=nu;
- name=na;
- score=sc;
- }
- void Student::reset()
- {
- num=0;
- name="reset";
- score=0;
- }
- void Student::show()
- {
- cout<<"date:"<<endl;
- cout<<"num:"<<num<<"\tname:"<<name<<"\tscore:"<<score<<endl;
- }
- int main()
- {
- Student s1(1,"qianshou",99);//实例化一个对象s1
- Student s2;//声明一个对象s2
- s2=s1;//进行对象的赋值,将对象s1的值赋给s2
- s2.show();
- Student s3(s2);// 进行对象的复制操作
- s3.show();
- s3.reset();//s3中的数据成员发生了改变
- Student s4=s3;//将改变之后的s3复制为s4
- s4.show();
- return 0;
- }
运行结果:
- #include<iostream>
- #include<string>
- using namespace std;
- class Student
- {
- public:
- Student(int nu=0,string na="NULL",int=0);//构造函数
- Student(const Student &s);
- void show();
- void reset();
- private:
- int num;
- string name;
- int score;
- };
- Student::Student(int nu,string na,int sc)
- {
- num=nu;
- name=na;
- score=sc;
- }
- Student::Student(const Student &s)
- {
- num=s.num;
- name=s.name;
- score=s.score;
- cout<<"复制构造函数执行完毕"<<endl;
- }
- void Student::reset()
- {
- num=0;
- name="reset";
- score=0;
- }
- void Student::show()
- {
- cout<<"date:"<<endl;
- cout<<"num:"<<num<<"\tname:"<<name<<"\tscore:"<<score<<endl;
- }
- int main()
- {
- Student s1(1,"qianshou",99);//实例化一个对象s1
- Student s2;//声明一个对象s2
- s2=s1;//进行对象的赋值,将对象s1的值赋给s2
- s2.show();
- Student s3(s2);// 进行对象的复制操作
- s3.show();
- s3.reset();//s3中的数据成员发生了改变
- Student s4=s3;//将改变之后的s3复制为s4
- s4.show();
- return 0;
- }
C++中的对象的赋值和复制的更多相关文章
- 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板
[源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...
- C++:对象的赋值和复制
3.6.1 对象赋值语句 如同基本类型赋值语句一样,同类型的对象之间也可以进行赋值,即一个对象的值可以赋给另一个对象.这里所指的对象的赋值是指对其中的数据成员赋值,而不对成员函数赋值.例如:A和B是同 ...
- C++ 对象的赋值和复制 基本的
对象的赋值 如果对一个类定义了两个或多个对象,则这些对象之间是可以进行赋值,或者说,一个对象的值可以赋值给另一个同类的对象.这里所指的值是指对象中所有数 据的成员的值.对象之间进行赋值是“ ...
- C++,对象的 =赋值 以及 复制构造函数赋值
1. C++默认实现了 = 号赋值:operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可. 2. C++默认实现了复制构造函数:同样,只要将一个对象的内容的内容逐位复制给另外一个对象 ...
- python中拷贝对象的区别
一.赋值.引用 在python中赋值语句总是建立对象的引用值,而不是复制对象.因此,python变量更像是指针,而不是数据存储区域 这点和大多数语音类似吧,比如C++.Java等 1.先看个例子: v ...
- java数组对象的浅层复制与深层复制
实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.
- python中的浅拷贝与赋值不同
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- JavaScript 中的对象深度复制(Object Deep Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...
- 【转】JavaScript中的对象复制(Object Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...
随机推荐
- [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 【DP】最长不下降子序列问题(二分)
Description 给你一个长度为n的整数序列,按从左往右的顺序选择尽量多的数字并且满足这些数字不下降. Thinking 朴素dp算法:F[i]表示到第i位为止的最长不下降子序列长度 F[i]= ...
- SDUT 1048 Digital Roots
Digital Roots Time Limit: 1000ms Memory limit: 65536K 题目描述 The digital root of a positive integer ...
- SrpingCloud 之SrpingCloud config分布式配置中心
Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...
- Linux Shell文件差集
file1-file2 => file3file1=/data/aaafile2=/data/bbbfile3=/data/cccsort -m <(sort $file1 | uniq) ...
- Ogre的Singleton实现-模版实现,便于重用-(详细分析)以及笔者的改进
转自:http://www.cppblog.com/sandy/archive/2005/11/30/1436.html ;Root g_root;//must declare once only / ...
- HDU 4714 Tree2cycle:贪心
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 题意: 给你一棵树,添加和删除一条边的代价都是1.问你将这棵树变成一个环的最小代价. 题解: 贪 ...
- Linux课程---2、Linux下最常用命令(查看帮助命令)
Linux课程---2.Linux下最常用命令(查看帮助命令) 一.总结 一句话总结: man 1.显示文件? ls:ls带其它参数详情可以man ls man ls:比如 ls -a显示隐藏文件,l ...
- TXLSReadWriteII2版本导出Excel文件:
//TXLSReadWriteII2版本导出Excel文件: procedure TForm1.N1Click(Sender: TObject); var i: Integer; aSaveDialo ...
- WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Console应用为宿主】
前言: 由于最近的项目 中需要用到WCF,所以又回头翻了翻,阅读了大量园中大神的博文,故而做个总结. 谬误之处,万望不吝指教! 闲话不叙! 一.寄宿(Host)WCF服务 1)一种是为一组WCF服务 ...