C++中char*类型成员的默认构造函数应如何赋值?
关于String类默认构造函数的正确实现
你当前写的默认构造函数name = new char[0];虽然语法合法,但存在隐患:这块长度为0的内存里没有字符串结束符'\0',后续调用strlen、strcpy这类依赖C风格字符串规则的函数时,会触发未定义行为。
正确的实现要保证默认构造出的是一个合法的空C风格字符串,推荐两种方式:
方式一:直接分配内存并初始化结束符
String(){ // 分配1字节内存,专门存放'\0' name = new char[1]; name[0] = '\0'; }
方式二:委托已有的带参构造函数(更简洁)
利用C++的构造函数委托特性,复用带参构造逻辑,避免重复代码:
// 先修改带参构造的参数为const char*,符合常量正确性 String(const char* str){ name = new char[strlen(str) + 1]; strcpy(name, str); } // 委托带参构造函数传入空字符串 String() : String("") {}
额外注意事项
- 带参构造函数的参数建议改为
const char*,因为传入的字符串常量不可修改,加const更安全。 - 析构函数必须释放动态分配的内存,避免泄漏:
~String(){ delete[] name; } - 拷贝构造和
operator=要严格实现深拷贝,防止多个对象共享同一块内存导致重复释放的问题。
内容的提问来源于stack exchange,提问作者zaraboy
相关产品推荐
相关产品推荐

