<b>C++空类的默许成员函数总结</b>[VC/C++编程]
本文“<b>C++空类的默许成员函数总结</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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()
{
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指向的地址数据会是什么?很明显将会呈现不可意料的后果.
以上是“<b>C++空类的默许成员函数总结</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |