08-修订后的默认构造函数
12.2.1 修订后的默认构造函数
请注意新的默认构造函数,它与下面类似:
String::String()
{
len = 0;
str = new char[1];
str[0] = '\0'; // default string
}
您可能会问,为什么代码为:
str = new char[1];
而不是:
str = new char;
上面两种方式分配的内存量相同,区别在于前者与类析构函数兼容,而后者不兼容。析构函数中包含如下代码:
delete [] str;
delete[]与使用new[]初始化的指针和空指针都兼容。因此对于下述代码:
str = new char[1];
str[0] = '\0'; // default string
可修改为:
str = 0; // sets str to the null pointer
对于以其他方式初始化的指针,使用delete [ ]时,结果将是不确定的:
char words[15] = "bad idea";
char * p1= words;
char * p2 = new char;
char * p3;
delete [] p1; // undefined, so don't do it
delete [] p2; // undefined, so don't do it
delete [] p3; // undefined, so don't do it
C++11空指针
在C++98中,字面值0有两个含义:可以表示数字值零,也可以表示空指针,这使得阅读程序的人和编译器难以区分。有些程序员使用(void *)0来标识空指针(空指针本身的内部表示可能不是零),还有些程序员使用NULL,这是一个表示空指针的C语言宏。C++11提供了更好的解决方案:引入新关键字nullptr,用于表示空指针。您仍可像以前一样使用0——否则大量现有的代码将非法,但建议您使用nullptr:
str = nullptr; // C++11 null pointer notation