当前位置:嗨网首页>书籍在线阅读

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