C 空类的默认成员函数总结计算机等级考试
文章作者 100test 发表时间 2009:07:07 23:25:25
来源 100Test.Com百考试题网
编辑特别推荐:
全国计算机等级考试(等考)指定教材
全国计算机等级考试学习视频
全国计算机等级考试网上辅导招生
全国计算机等级考试时间及科目预告
百考试题教育全国计算机等级考试在线测试平台
全国计算机等级考试资料下载
全国计算机等级考试论坛
class Empty
{
public:
Empty(). // 缺省构造函数
Empty(const Empty&.). // 拷贝构造函数
~Empty(). // 析构函数
Empty&. operator=(const Empty&.). // 赋值运算符
Empty* operator&.(). // 取值运算符
const Empty* operator&.() const. // 取值运算符
}.
例如有以下class:
class StringBad
{
private :
char * str.
int len.
public :
StringBad( const char * s).
StringBad().
~ StringBad().
} .
在构造函数和析构函数定义当中有如下定义:
StringBad::StringBad( const char * s)
{
len = std::strlen(s).
str = new char [len 1 ].
}
StringBad::StringBad()
{
len = 4 .
str = new char [ 4 ].
}
StringBad:: ~ StringBad()
{
0delete [] str.
}
那么在程序当中如果有以下代码:
StringBad sports( " Spinach Leaves Bow1 for bollars " );
StringBad sailor = sports;
以上的第二条初始化语句将会调用什么构造函数?记住,这种形式的初始化等效于下面的语句:
StringBad sailor = StringBad(sports);
因为sports的类型为StringBad,因此相应的构造函数原型应该如下:
StringBad( const StringBad &. );
当我们使用一个对象来初始化另一个对象时,编译器将自动生成上述构造函数(称为复制构造函数,因为它创建对象的一个副本)。
现在我们来看看我们没有定义复制构造函数的情况下调用隐式复制构造函数将会出现什么情况。
从构造函数定义的代码片断可以看到,当中使用new操作符初始化了一个指针str,而隐式的复制构造函数是按值进行复制的,那么对于指针str,将会进行如下复制:
sailor.str = sports.str;
这里复制的不是字符串,而是一个指向字符串的指针!也就是说,我们将得到两个指向同一个字符串的指针!由此会产生的问题将不言而喻。当其中一个对象调用了析构函数之后,其str指向的内存将被释放,这个时候我们如果调用另一个对象,其str指向的地址数据会是什么?很明显将会出现不可预料的结果。
所以由此可见,如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。因为默认的浅复制(或成为成员复制)仅浅浅的赋值指针信息。
我们再看以下代码片断,我们稍做修改:
StringBad headline1( " Celery Stalks at Midnight " );
StringBad knot;
knot = headline1;