Welcome

首页 / 软件开发 / C++ / C++空类的默认成员函数总结

C++空类的默认成员函数总结2010-05-16 csdn AtlasZhaoclass 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()
{

delete [] 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指向的地址数据会是什么?很明显将会出现不可预料的结果。