为何编译器无法实现字符数组与自定义String类的类型转换?
问题原因及解决方法
一、字符串字面量传入char*参数报错的原因
C中字符串字面量(比如"Yousef")的类型是const char*,它指向只读的内存区域。你的Employee构造函数参数是char*(非const指针),而C禁止将const char*隐式转换为char*——这是为了避免通过非const指针修改只读的字符串字面量,防止出现未定义行为。因此直接传字符串字面量时,类型不匹配,编译器报错。
二、自定义String对象无法转换为C字符串的原因
你的String类只实现了从const char*到String的构造函数(支持把C字符串隐式转成String对象),但没有提供从String到const char*的反向转换机制。编译器不知道如何将自定义String对象转换成C字符串,因此调用Employee构造函数时类型不匹配,报错。
修正方案
方案1:修改Employee构造函数的参数类型
把构造函数的char*参数改为const char*(姓名、地址这类数据通常不需要修改,用const更安全),同时修正拼写错误fisrtName→firstName:
Employee::Employee(const char* firstName, const char* lastName, const char* address, long salary): itsFirstName(firstName), itsLastName(lastName), itsAddress(address), itsSalary(salary) {}
修改后可以直接传入字符串字面量,后续配合String类的转换函数也能兼容。
方案2:给自定义String类添加转换运算符
为了让String对象能隐式转换为C字符串,需要添加operator const char*()成员函数:
class String { // 已有的成员变量:itsLen、itsString public: // 新增转换运算符 operator const char*() const { return itsString; // 返回内部存储的C字符串指针 } // 已有的构造函数 String(const char* const cString); // 建议添加析构函数释放内存,避免泄漏 ~String() { delete[] itsString; } };
添加后,编译器会自动将String对象转换成const char*,配合方案1的Employee构造函数,Employee Edie(str, str, str, 500);就能正常编译。
内容的提问来源于stack exchange,提问作者Issac Howard
相关产品推荐
相关产品推荐

