const char * 和const void * 无法构成重载嘛
时间: 2023-12-20 17:06:11 浏览: 176
const char * 和 const void * 可以构成重载,但是需要注意的是,它们的参数列表不同。const char * 的参数是一个指向字符数组的指针,而 const void * 的参数是一个指向任意类型的指针。因此,如果您使用 const char * 和 const void * 作为函数参数,则需要确保它们在函数内部被正确地处理。
相关问题
定义一个字符串类 String 数据成员(访问权限定义为protected): 指向存放字符串内容的字符指针(char *str) 成员函数(访问权限定义为public): 默认构造函数:初始化成一个空串 String( ); 带参数的构造函数:根据参数内容初始化字符串 String(const char *content); 拷贝构造函数:初始化字符串 String(const String &cstr); 析构函数:释放堆空间 ~String( ); 设置字符串内容 void set(const char *content); 获取字符串长度(定义为const成员函数)int length() const; 打印字符串内容(定义为const成员函数)void print() const; 重载赋值运算符= (只能作为类成员函数重载) String& operator=(const String &cstr); String& operator=(const char *cstr); 重载下标运算符[ ],实现获取字符串中某个指定位置的字符 (只能作为类成员函数重载) char& operator[](int index); 重载类型转换运算符 char *,实现将字符串类强制转换成字符指针(只能作为类成员函数重载) operator char*( ); 要求:将类的定义与类成员函数的实现分开。
类定义如下:
class String {
protected:
char* str; // 存储字符串内容的字符指针
public:
String(); // 默认构造函数
String(const char* content); // 带参数的构造函数
String(const String& cstr); // 拷贝构造函数
~String(); // 析构函数
void set(const char* content); // 设置字符串内容
int length() const; // 获取字符串长度
void print() const; // 打印字符串内容
String& operator=(const String& cstr); // 重载赋值运算符=
String& operator=(const char* cstr); // 重载赋值运算符=
char& operator[](int index); // 重载下标运算符[]
operator char*(); // 重载类型转换运算符
};
类成员函数的实现如下:
// 默认构造函数
String::String() {
str = new char[1];
str[0] = '\0';
}
// 带参数的构造函数
String::String(const char* content) {
int len = strlen(content);
str = new char[len + 1];
strcpy(str, content);
}
// 拷贝构造函数
String::String(const String& cstr) {
int len = strlen(cstr.str);
str = new char[len + 1];
strcpy(str, cstr.str);
}
// 析构函数
String::~String() {
delete[] str;
}
// 设置字符串内容
void String::set(const char* content) {
delete[] str;
int len = strlen(content);
str = new char[len + 1];
strcpy(str, content);
}
// 获取字符串长度
int String::length() const {
return strlen(str);
}
// 打印字符串内容
void String::print() const {
printf("%s", str);
}
// 重载赋值运算符=
String& String::operator=(const String& cstr) {
if (this == &cstr) return *this; // 自我赋值
delete[] str;
int len = strlen(cstr.str);
str = new char[len + 1];
strcpy(str, cstr.str);
return *this;
}
String& String::operator=(const char* cstr) {
delete[] str;
int len = strlen(cstr);
str = new char[len + 1];
strcpy(str, cstr);
return *this;
}
// 重载下标运算符[]
char& String::operator[](int index) {
return str[index];
}
// 重载类型转换运算符
String::operator char*() {
return str;
}
完成下列的 String 类,并在主函数 main( )中测试它。 class String { public: String(const char *str = NULL); // constructor String(const String &other); // copy constructor ~ String(void); // destructor String & operate =(char *str); String & operate =(const String &other);// 重载=运算符 int operator==(String &other); // 重载==运算符 int operator==(char *str); private: char *m_data; // used for storing the string int length; };
下面是 String 类的实现:
#include <cstring>
class String {
public:
String(const char* str = NULL);
String(const String& other);
~String();
String& operator=(const char* str);
String& operator=(const String& other);
int operator==(String& other);
int operator==(const char* str);
private:
char* m_data;
int length;
};
String::String(const char* str) {
if (str == NULL) {
length = 0;
m_data = new char[1];
m_data[0] = '\0';
}
else {
length = strlen(str);
m_data = new char[length + 1];
strcpy(m_data, str);
}
}
String::String(const String& other) {
length = other.length;
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
}
String::~String() {
delete[] m_data;
}
String& String::operator=(const char* str) {
if (m_data == str) {
return *this;
}
delete[] m_data;
if (str == NULL) {
length = 0;
m_data = new char[1];
m_data[0] = '\0';
}
else {
length = strlen(str);
m_data = new char[length + 1];
strcpy(m_data, str);
}
return *this;
}
String& String::operator=(const String& other) {
if (m_data == other.m_data) {
return *this;
}
delete[] m_data;
length = other.length;
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
return *this;
}
int String::operator==(String& other) {
return strcmp(m_data, other.m_data) == 0;
}
int String::operator==(const char* str) {
return strcmp(m_data, str) == 0;
}
在主函数中可以这样测试:
#include <iostream>
int main() {
String str1("hello");
String str2("world");
String str3(str1);
std::cout << "str1 = " << str1 << std::endl;
std::cout << "str2 = " << str2 << std::endl;
std::cout << "str3 = " << str3 << std::endl;
str2 = str1;
std::cout << "After str2 = str1, str2 = " << str2 << std::endl;
if (str1 == str2) {
std::cout << "str1 is equal to str2" << std::endl;
}
else {
std::cout << "str1 is not equal to str2" << std::endl;
}
if (str1 == "hello") {
std::cout << "str1 is equal to \"hello\"" << std::endl;
}
else {
std::cout << "str1 is not equal to \"hello\"" << std::endl;
}
return 0;
}