分类: C/C++
2017-04-23 23:54:46
1.编写类String的拷贝构造函数和赋值函数等(可以调用C++/C的字符串库函数)(10分)。
已知类String的原型为:
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operator =(const String &other); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
请编写String的上述4个函数。
我们都知道,构造函数、析构函数与赋值函数是每个类最基本的函数。每个类只有一个析构函数和赋值函数,但可以有多个构造函数(包括一个拷贝构造函数,其他的称为普通构造函数)。对于任意一个类A,如果不编写上述函数,C++编译器将会自动为A产生4个缺省的函数,如:
A(void);//缺省的无参数构造函数
A(const A &a);//缺省的拷贝构造函数
~A(void);//缺省的析构函数
A & operator=(const A &a);//缺省的赋值函数
所以很多人都有疑惑,既然能自动生成函数,为什么还要程序员编写?原因是:
①如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会;
②“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。
根据题目要求,要我们自己编写普通构造函数、拷贝构造函数、析构函数和赋值函数。
构造函数:其功能是在创建一个新的对象的时候给数据成员赋初值,也就是给对象做初始化。
析构函数:其功能则是用来释放一个对象,在对象删除之前用它来做一些内存释放等的清理工作,与构造函数的功能相反。
类的构造函数和析构函数的典型应用:在构造函数中用new来为指针成员开辟一个独立的动态内存空间,而在析构函数中用delete来释放它。
那什么是拷贝构造函数呢?
首先对普通类型的对象来说,它们之间的复制很简单的:
int a = 100;
int b = a;
而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。所以就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。它是一种特殊的构造函数,函数名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。
拷贝构造函数与赋值函数的区别?
(1)首先在看到“=”操作符为对象赋值的时候,
如果在对象定义时(Test B = (Test)c),此时调用拷贝构造函数;
如果不是在对象定义赋值时(B = c),此时调用赋值函数。
注:构造函数、拷贝构造函数,带有构造两个字,顾名思义,就是在对象声明或定义时才会使用。
(2)内存空间角度:
①拷贝构造函数的使用,是在建立对象时;当时对象没有占有内存,故不需要释放内存,不重新建立内存空间。
②赋值函数的使用,是 在对象建立后,当时对象已经占有内存,故需要释放先前内存,然后重新获取内存空间。
经调试好的代码如下:
点击(此处)折叠或打开