- 在构造函数中使用new初始化指针成员后,应在析构函数中使用delete;
- new和delete必须相互兼容,new对应于delete,new []对应于delete [];
- 如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号[],要么都不带,因为只有一个析构函数,因此所有的构造函数都必须与它兼容。另外,可以在一个构造函数中使用new初始化指针(可以带中括号,也可以不带),在另外一个构造函数中将指针初始化为空(NULL或0),因为delete可以用于空指针;
NULL还是0:空指针可以用0或NULL来表示,在许多头文件中,NULL是一个被定义为0的符号常量。C程序员通常使用NULL而不是0,因为这样易知它是一个指针值(就像使用"\0"而不是0来表示空字符串一样)。不过C++传统上更喜欢用简单的0,而不是等价的NULL。
- 在构造函数中使用new的一些情形:
(1)《C++中string类的简介》文章中MyClassString类的复制构造函数:
cpp
MyClassString::MyClassString(const MyClassString& st)
{
len = st.len;
str = new char[len + 1];
strcpy(str, st.str);
}
通过深度复制将一个对象初始化为另一个对象。此时,复制构造函数应分配足够的空间来存储复制的数据,而不仅仅是数据的地址。
(2)《C++中string类的简介》文章中MyClassString类的赋值操作符重载函数,也需要通过深度复制将一个对象的数据复制给另一个对象。
cpp
MyClassString& MyClassString::operator=(const MyClassString& s)
{
if (this == &s)
{
return *this;
}
delete[]str;
len = s.len;
str = new char[len + 1];
strcpy(str,s.str);
return *this;
}