对象的赋值

如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象。这里所指的对象的值是指对象中所有数据成员的值。

对象之间的赋值也是通过赋值运算符“=”进行的。本来赋值运算符“=”只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的。

实际上这个过程是通过成员复制来实现的,即将一个对象的成员值一一复制给另外一个对象的成员。

对象赋值的一般形式:

对象名1=对象名2;

注意,对象1和对象2必须是属于同一个类

=========示例代码1.1===============

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Student
  5. {
  6. public:
  7. Student(int nu=0,string na="NULL",int=0);//构造函数
  8. void show();
  9. private:
  10. int num;
  11. string name;
  12. int score;
  13. };
  14. Student::Student(int nu,string na,int sc)
  15. {
  16. num=nu;
  17. name=na;
  18. score=sc;
  19. }
  20. void Student::show()
  21. {
  22. cout<<"date:"<<endl;
  23. cout<<"num:"<<num<<"\tname:"<<name<<"\tscore:"<<score<<endl;
  24. }
  25. int main()
  26. {
  27. Student s1(1,"qianshou",99);
  28. s1.show();
  29. Student s2;
  30. s2=s1;
  31. s2.show();
  32. return 0;
  33. }

运行界面:

说明:

(1)对象的赋值值对其中的数据成员赋值,而不对成员函数赋值。

数据成员是占存储空间的,不同的对象的数据成员占有不同的存储空间,赋值过程是将一个对象的数据成员在存储空间的状态复制给另一对象的数据成员的存储空间。

而不同对象的成员函数是同一个函数代码段,既不需要也没法向它们赋值。

(2)类的数据成员中,不能包括动态分配的数据。

对象的复制

有时我们需要用到多个完全相同的对象,并进行相同的初始化。或者有时候,我们需要将对象在某一瞬间的状态保留下来。
为了处理这种情况,C++提供了对象的复制机制,用一个以后的对象快速的复制出多个完全相同的对象。
其一般形式为

类名 对象2(对象1)

用对象1复制出对象2.
  1. Student s2(s1);

可以看到:它与前面介绍的定义对象的方式类似,但是括号中给出的参数不是一般的变来那个,而是对象。
在建立一个新对象时,调用一个特殊的构造函数——复制构造函数。

这个函数是这样的
  1. Student::Student(const Student &b)
  2. {
  3. num=b.num;
  4. name=b.name;
  5. score=b.score;
  6. }

复制构造函数也是构造函数,但它只有一个参数,这个参数时本类的对象,而且采用对象的引用形式(一般约定加const声明,使参数值不能改变,以免在调用函数时因不慎而使对象值被修改)。此复制构造函数的作用就是将实参对象的各数据成员的值一一赋给新的对象中的成员的值。

对于语句
  1. Student s2(s1);

这实际上也是建立对象的语句,建立一个新对象s2。由于在括号内给定的实参是对象,编译系统就调用复制构造函数,实参s1的值传给形参b(b是s1的引用)。


C++还提供另外一种方便用户的复制形式,用赋值号代替括号
其一般形式是:
类名    对象名1        =        对象名2;
  1. Student s2=s1;

还可以在一个语句中进行多个对象的赋值。
  1. Student s2=s1,s3=s2,s4=s3;

对象的复制和赋值的区别

对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行赋值。而对象的复制则是一个从无到有地建立一个新的对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Student
  5. {
  6. public:
  7. Student(int nu=0,string na="NULL",int=0);//构造函数
  8. void show();
  9. void reset();
  10. private:
  11. int num;
  12. string name;
  13. int score;
  14. };
  15. Student::Student(int nu,string na,int sc)
  16. {
  17. num=nu;
  18. name=na;
  19. score=sc;
  20. }
  21. void Student::reset()
  22. {
  23. num=0;
  24. name="reset";
  25. score=0;
  26. }
  27. void Student::show()
  28. {
  29. cout<<"date:"<<endl;
  30. cout<<"num:"<<num<<"\tname:"<<name<<"\tscore:"<<score<<endl;
  31. }
  32. int main()
  33. {
  34. Student s1(1,"qianshou",99);//实例化一个对象s1
  35. Student s2;//声明一个对象s2
  36. s2=s1;//进行对象的赋值,将对象s1的值赋给s2
  37. s2.show();
  38. Student s3(s2);// 进行对象的复制操作
  39. s3.show();
  40. s3.reset();//s3中的数据成员发生了改变
  41. Student s4=s3;//将改变之后的s3复制为s4
  42. s4.show();
  43. return 0;
  44. }

运行结果:



需要说明的是,赋值构造函数和复制构造函数的调用都是由系统自动完成的。程序员可以自己定义复制构造函数,如果没有定义构造函数,则编译系统会自动提供一个默认的够函数,其作用只是简单的复制类中的数据成员。
我们可以自定义一个复制构造函数,以便查看效果:
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Student
  5. {
  6. public:
  7. Student(int nu=0,string na="NULL",int=0);//构造函数
  8. Student(const Student &s);
  9. void show();
  10. void reset();
  11. private:
  12. int num;
  13. string name;
  14. int score;
  15. };
  16. Student::Student(int nu,string na,int sc)
  17. {
  18. num=nu;
  19. name=na;
  20. score=sc;
  21. }
  22. Student::Student(const Student &s)
  23. {
  24. num=s.num;
  25. name=s.name;
  26. score=s.score;
  27. cout<<"复制构造函数执行完毕"<<endl;
  28. }
  29. void Student::reset()
  30. {
  31. num=0;
  32. name="reset";
  33. score=0;
  34. }
  35. void Student::show()
  36. {
  37. cout<<"date:"<<endl;
  38. cout<<"num:"<<num<<"\tname:"<<name<<"\tscore:"<<score<<endl;
  39. }
  40. int main()
  41. {
  42. Student s1(1,"qianshou",99);//实例化一个对象s1
  43. Student s2;//声明一个对象s2
  44. s2=s1;//进行对象的赋值,将对象s1的值赋给s2
  45. s2.show();
  46. Student s3(s2);// 进行对象的复制操作
  47. s3.show();
  48. s3.reset();//s3中的数据成员发生了改变
  49. Student s4=s3;//将改变之后的s3复制为s4
  50. s4.show();
  51. return 0;
  52. }





C++中的对象的赋值和复制的更多相关文章

  1. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

  2. C++:对象的赋值和复制

    3.6.1 对象赋值语句 如同基本类型赋值语句一样,同类型的对象之间也可以进行赋值,即一个对象的值可以赋给另一个对象.这里所指的对象的赋值是指对其中的数据成员赋值,而不对成员函数赋值.例如:A和B是同 ...

  3. C++ 对象的赋值和复制 基本的

    对象的赋值 如果对一个类定义了两个或多个对象,则这些对象之间是可以进行赋值,或者说,一个对象的值可以赋值给另一个同类的对象.这里所指的值是指对象中所有数       据的成员的值.对象之间进行赋值是“ ...

  4. C++,对象的 =赋值 以及 复制构造函数赋值

    1. C++默认实现了 = 号赋值:operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可. 2. C++默认实现了复制构造函数:同样,只要将一个对象的内容的内容逐位复制给另外一个对象 ...

  5. python中拷贝对象的区别

    一.赋值.引用 在python中赋值语句总是建立对象的引用值,而不是复制对象.因此,python变量更像是指针,而不是数据存储区域 这点和大多数语音类似吧,比如C++.Java等 1.先看个例子: v ...

  6. java数组对象的浅层复制与深层复制

    实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.

  7. python中的浅拷贝与赋值不同

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  8. JavaScript 中的对象深度复制(Object Deep Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...

  9. 【转】JavaScript中的对象复制(Object Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...

随机推荐

  1. [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. 【DP】最长不下降子序列问题(二分)

    Description 给你一个长度为n的整数序列,按从左往右的顺序选择尽量多的数字并且满足这些数字不下降. Thinking 朴素dp算法:F[i]表示到第i位为止的最长不下降子序列长度 F[i]= ...

  3. SDUT 1048 Digital Roots

    Digital Roots Time Limit: 1000ms   Memory limit: 65536K 题目描述 The digital root of a positive integer ...

  4. SrpingCloud 之SrpingCloud config分布式配置中心

    Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...

  5. Linux Shell文件差集

    file1-file2 => file3file1=/data/aaafile2=/data/bbbfile3=/data/cccsort -m <(sort $file1 | uniq) ...

  6. Ogre的Singleton实现-模版实现,便于重用-(详细分析)以及笔者的改进

    转自:http://www.cppblog.com/sandy/archive/2005/11/30/1436.html ;Root g_root;//must declare once only / ...

  7. HDU 4714 Tree2cycle:贪心

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 题意: 给你一棵树,添加和删除一条边的代价都是1.问你将这棵树变成一个环的最小代价. 题解: 贪 ...

  8. Linux课程---2、Linux下最常用命令(查看帮助命令)

    Linux课程---2.Linux下最常用命令(查看帮助命令) 一.总结 一句话总结: man 1.显示文件? ls:ls带其它参数详情可以man ls man ls:比如 ls -a显示隐藏文件,l ...

  9. TXLSReadWriteII2版本导出Excel文件:

    //TXLSReadWriteII2版本导出Excel文件: procedure TForm1.N1Click(Sender: TObject); var i: Integer; aSaveDialo ...

  10. WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Console应用为宿主】

    前言: 由于最近的项目 中需要用到WCF,所以又回头翻了翻,阅读了大量园中大神的博文,故而做个总结. 谬误之处,万望不吝指教! 闲话不叙! 一.寄宿(Host)WCF服务  1)一种是为一组WCF服务 ...