本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决。需要读者有较好的C++基础,熟悉引用,const的相关知识。
引言:
类作为C++语言的一种数据类型,是对C语言结构体的一种扩展。由于C++是面向过程与面向对象的混合语言,因此在使用面向对象思想解决现实问题模型时,设计好类是很重要的(跑题了)。关于类,这篇blog中有很好的介绍(链接http://blog.csdn.net/zqixiao_09/article/details/51474556)。我要介绍的是,关于创建一个空类,类体内都包含哪些成员函数呢?看下面例子 。
class MyClass { //创建一个空类MyClass }; void main() { MyClass c; //创建该类的对象c,此处会自动调用默认构造函数 MyClass d(c); //创建一个对象d,并且用已经存在的同类对象c去初始化d,此处调用了默认拷贝构造函数 MyClass e; //创建一个对象e e = c; //此处是对象赋值,调用了默认赋值运算符成员函数 }
那么我们来运行一下
可以看到是成功的。
以上实例说明,对于用户定义的空类,该类会自动包含六个成员函数,分别是:
l 默认构造函数 A(){//空函数体}
l 默认拷贝构造函数(本次讲解重点)A(const A & ){//简单的对象成员变量赋值操作}
l 默认析构函数 ~A(){//空函数体}
l 赋值运算符重载成员函数(本次讲解重点) A & operator =(const A &){//也是简单的对象成员变量赋值操作}
l 取地址操作符重载成员函数
l Const修饰的取地址操作符重载成员函数
前四个是本次讲解的内容,重点放在拷贝构造,赋值运算符重载这两个成员函数
拷贝构造函数:
拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。归结来说。有三个场合要用到拷贝构造函数:
l 对象作为函数的参数,以值传递的方式传给函数
l 对象作为函数的返回值,以值传递的方式从函数返回调用处
l 使用一个对象去初始化一个新建的对象
即有拷贝构造函数的调用一定会有新对象生成。
还有一点需要注意的是,拷贝构造函数必须以引用的方式传递参数。这是因为,在值传递的方式传递给一个函数的时候,会调用拷贝构造函数生成函数的实参。如果拷贝构造函数的参数仍然是以值的方式,就会无限循环的调用下去,直到函数的栈溢出。
例子:
#include<iostream.h>
#include<string.h>
class Person{
public :
Person(); //无参构造函数
Person(int age,char na[]); //重载一般构造函数
Person(const Person & p);//拷贝构造函数
~Person(); // 析构函数
void disp();
private :
int age;
char *name;
};
Person::Person(){
age=0;
name=new char[2];
strcpy(name,"