关闭

C++构造函数和拷贝构造函数详解

发表于:2012-2-06 09:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:sdtarena    来源:51Testing软件测试网采编

  构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。

  每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。

  对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如:

  A(void); // 缺省的无参数构造函数

  A(const A &a); // 缺省的拷贝构造函数

  ~A(void); // 缺省的析构函数

  A & operate =(const A &a); // 缺省的赋值函数

  这不禁让人疑惑,既然能自动生成函数,为什么还要程序员编写?原因如下:

  <1> 如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,C++发明人Stroustrup 的好心好意白费了。

  <2> “缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

  C++ 默认构造函数 :

  1、每个类必须有一个构造函数,否则没法创建对象;2、若 程序员没有提供任何构造函数,则 C++提供一个默认的构造函数,该默认构造函数是无参构造函数,它仅负责创建对象,不做任何初始化的工作;3、只要 programer 定义了一个构造函数(不管是无参还是有参构造),C++就不再提供默认的默认构造函数。即如果为类定义了一个带参的构造函数,还想要无参构造函数,就必须自己定义;4、与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为 0,否则,对象值是随机的。

  C++默认拷贝构造函数:

  1、默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造。

  2、拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作。

  3、如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数。

  4、如果数据成员是一个数组,对数组的每一个执行按位拷贝。

  5、如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值。

  请看下面代码:

view plain //============================================================================ // Name        : main.cpp // Author      : ShiGuang // Version     :// Copyright   :sg131971@qq.com// Description : Hello World in C++, Ansi-style //============================================================================
#include <iostream> #include <string> using namespace std;
class Student { public:Student()
{ cout << "构造函数1" << endl;} Student(int k)
{ cout << "构造函数2" << endl;i = k;} Student(Student const &m)
{ cout << "拷贝构造函数" << endl;i = m.i * (-1);}
void p()
{ cout << i << endl;} ~Student()
{ cout << "析构函数" << endl;} protected:int i;};
int main(int argc, char **argv)
{ Student s(9818);// 调用构造函数2 s.p();
Student t(s);// 调用拷贝构造函数t.p();
Student k = s;// 调用拷贝构造函数k.p();
Student *p = new Student(s);// 调用拷贝构造函数p->p();
Student m;// 调用构造函数1 m = s;// 赋值运算m.p();
return 0;}

  运行结果:view plain构造函数2 9818拷贝构造函数-9818拷贝构造函数-9818拷贝构造函数-9818构造函数1 9818析构函数下面我们来讨论一下关于浅拷贝和深拷贝的问题。

  深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候(复制指针所指向的值),这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源(只复制了指针所指的地址)的情况视为浅拷贝。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号