对象的赋值

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

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

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

对象赋值的一般形式:

对象名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)类的数据成员中,不能包括动态分配的数据。

对象的复制

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

类名 对象2(对象1)

用对象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的引用)。


C++还提供另外一种方便用户的复制形式,用赋值号代替括号
其一般形式是:
类名    对象名1        =        对象名2;
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++中的对象的赋值和复制的更多相关文章

  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. Chrome Extension 扩展程序 小白入门

    Chrome Extension 扩展程序 前请说明:本文适用于之前从来没有接触过chrome extension扩展程序的同学~ 编写demo 创建项目文件夹chrome_ext_demo,在项目根 ...

  2. windows下SecureCRT无法使用backspace(空格键)和上下左右键

    在使用SecureCRT登陆liunx(我的为CenterOS)系统,发现删除(backspace)键.和上下左右键不起作用,郁闷了很久没有找到解决办法, 今天终于看到了一篇有用的文章,在此记录一下! ...

  3. HTML 5 本地存储

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  4. 每天一个Linux命令(34)grep命令

          grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  5. 从性能角度分析一下String,List,Map

    使用String.subString()方法的时候注意内存溢出的问题 public static void testH() { List<String> strings = new Arr ...

  6. 第十二、模块二、调用中国天气网和qqOnline及TrainTimeWebService接口来突出Json方法

    一. 浏览网页的时候,发送的请求.服务器反回来的永远是字符串,由于服务器后台使用的语言不通,所以就需要用工具反解,这里用到了json json方法一 json.loads()将字符串转化为python ...

  7. 斐波那契 (Fibonacci)数列

    尾递归会将本次方法的结果计算出来,直接传递给下个方法.效率很快. 一般的递归,在本次方法结果还没出来的时候,就调用了下次的递归, 而程序就要将部分的结果保存在内存中,直到后面的方法结束,再返回来计算. ...

  8. 算法(Algorithms)第4版 练习 1.3.37

    package com.qiusongde.creative; import com.qiusongde.Queue; import edu.princeton.cs.algs4.StdOut; pu ...

  9. F1 score,micro F1score,macro F1score 的定义

    F1 score,micro F1score,macro F1score 的定义 2018年09月28日 19:30:08 wanglei_1996 阅读数 976   本篇博客可能会继续更新 最近在 ...

  10. 在javascript中使用replace

    javascript中使用replace功能很强大,不仅可以替换为字符串,还可以利用正则表达式,对匹配到的字符串为所欲为的进行操作,首先我们来了解一下replace的基本语法 定义和用法 replac ...