理论教育 面向对象程序设计|拷贝构造函数的用法

面向对象程序设计|拷贝构造函数的用法

时间:2023-10-25 理论教育 版权反馈
【摘要】:拷贝构造函数可以根据已存对象创建新对象,在程序中一般有以下三种情况会使用拷贝构造函数。拷贝构造函数是特殊的构造函数,它也是系统自动调用的,在使用时,系统会根据情况自动调用拷贝构造函数,不需要显式调用。在例3.1的main函数中,语句“Student s2=s1;”表示创建s2对象,并用s1的值初始化s2对象。对于拷贝构造函数我们也可以这样使用“Student s2;”更加直接表明是用s1对象做参数创建新对象s2。

面向对象程序设计|拷贝构造函数的用法

拷贝构造函数可以根据已存对象创建新对象,在程序中一般有以下三种情况会使用拷贝构造函数。(1)在创建新对象时,用已存的对象初始化新对象;(2)在函数参数传递时,把对象作为函数的值参数传递;(3)在函数返回值时,对象作为值返回被调用程序。当以上三种情况之一发生时,系统会自动调用拷贝构造函数来创建新对象。

拷贝构造函数是特殊的构造函数,它也是系统自动调用的,在使用时,系统会根据情况自动调用拷贝构造函数,不需要显式调用。

【例3.1】定义学生类,数据成员有学号、姓名、成绩,其中学号和姓名数据类型为字符指针,成绩为整型,成员函数有构造函数、拷贝构造函数、析构函数、打印学生信息。在main函数中,创建学生对象,并用已存在对象创建一个新对象。

在例3.1的main函数中,语句“Student s2=s1;”表示创建s2对象,并用s1的值初始化s2对象。对于拷贝构造函数我们也可以这样使用“Student s2(s1);”更加直接表明是用s1对象做参数创建新对象s2。在C++中,在给普通变量初始化时,也可以使用这样的方式,例如:语句“int n=100;int m(n);”,它的效果与“int n=100;int m=n;”相同,同时“int m=100;”与语句“int m(100);”效果相同。此种方式只能用在对变量声明并初始化时。

语句“Student s2=s1;”与语句组“Student s2;s2=s1;”不一样,后者表示创建对象s2,然后对s2赋值,此处的等号是赋值运算,前者的等号是表示初始化。(www.daowen.com)

在例3.1的基础上,增加一个签到函数,要求把学生对象传递给函数,在函数内输出学生信息。修改后的main.cpp文件内容如下。

从程序的运行结果可以看出,在调用check In函数时,传递学生对象,使用了拷贝构造函数,输出结果行“拷贝构造了新学生对象: 学号:20160101001 姓名:新张鹏成绩:99”,创建了新的局部对象,对象的姓名为“新张鹏”,在函数结束时,拷贝构造出的局部对象析构,返回主函数。

在对象作为函数的返回值时,也会发生拷贝构造,需要把对象的值拷贝一份返回给主调函数。在例3.1的基础上,增加一个表扬函数,若学生的分数在90分以上,返回学生对象,否则创建一个新的分数为0的对象返回,修改main.cpp文件代码如下。

程序在运行到函数PraiseStudent(),在返回对象时,拷贝创建了一个新的对象返回给main函数,在main函数中输出对象的信息。语句“PraiseStudent(s1).print();”表示PraiseStudent(s1)函数返回一个对象,然后调用对象的print()函数,也可以写为“Student s3=PraiseStudent(s1);s3.print();”,这样多一个局部对象s3。在此程序中,若s1对象的成绩为80(小于90分),那么结果,读者可以自行实验一下,查看运行结果。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈