C++复制控制之复制构造函数
作者:网络转载 发布时间:[ 2012/11/21 9:45:56 ] 推荐标签:
只有单个形参,而且该形参是本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。与默认的构造函数一样,复制构造函数由编译器隐式调用。
如果我们没有定义复制构造函数,编译器会为我们合成一个。与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数,合成复制构造函数将逐个成员初始化。
下面是代码:Student.h头文件
#if !defined(AFX_STUDENT_H__334531D3_6CD2_48F8_BDE2_98A82D166466__INCLUDED_)
#define AFX_STUDENT_H__334531D3_6CD2_48F8_BDE2_98A82D166466__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <string>
class Student
{
public:
Student();
Student(Student&);
virtual ~Student();
std::string name;
unsigned int no;
};
#endif
Student.cpp源文件:
#include "Student.h"
Student::Student()
{
}
Student::~Student()
{
}
Student::Student(Student& s)
{
this->name=s.name;
this->no=s.no;
}
Main.cpp源文件中包含main函数:
#include <iostream>
#include "Student.h"
using namespace std;
int main()
{
Student s;
s.name="zhy_cheng";
s.no=32;
Student liu(s); //这里默认调用复制构造函数
cout<<liu.name<<endl<<liu.no<<endl;
return 0;
}
当自己定义了一个复制构造函数的时候,编译器不再提供默认的复制构造函数。
我们可以在复制构造函数中做自己的操作,如给某个成员定义默认的值。我键复制构造函数改成下面的样子:
Student::Student(Student& s)
{
this->name="临江仙";
this->no=s.no;
}
打印出下面的值:
临江仙
32
禁止复制
如果需要禁止复制的话,必须要显示的声明其复制构造函数为private类型,因为如果不声明复制构造函数,编译器会提供一个默认的复制构造函数。如果复制构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。
然而,类的成员和友元仍然可以进行复制。如果连友元和类成员中的复制也要禁止,可以声明一个private类型的复制构造函数,但不对其定义。声明而不定义成员函数是合法的,但是,使用未定义成员的任何尝试将导致连接失败。通过声明但不定义private复制构造函数,可以禁止任何复制类类型对象的尝试:用户代码中的复制尝试将在编译时标记为错误,而成员函数和友元中的复制尝试将在链接时导致错误。
大多数类应定义复制构造函数和默认构造函数
不定义复制构造函数和/或默认构造函数,会严重局限内的使用。不允许复制的类的对象只能作为引用传递给函数或从函数返回,他们也不能用作容器的函数。如果定义了复制构造函数,也必须定义默认构造函数。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11