如何理解String(const char *c=" "); //默认构造+转换构造函数 *c=""是什么意思,char*()是什么意思
时间: 2024-04-26 19:20:05 浏览: 115
这是一个带有默认参数值的构造函数,它可以用来构造一个字符串对象。参数 `const char *c` 表示传入一个指向字符数组的指针,即一个 C 风格的字符串。而 `= " "` 表示如果没有传入任何参数,则默认为一个空格字符串。
`*c=""` 的意思是将指针 `c` 所指向的字符数组的第一个元素设置为空字符,即表示一个空的字符串。而 `char*()` 是一个类型转换操作符,它可以将一个对象转换为指向字符数组的指针,这样就可以将一个字符串对象转换为 C 风格的字符串。
需要注意的是,这里的字符串对象是指 C++ 标准库中的 `std::string` 类型。
相关问题
成员函数(访问权限定义为public): •默认构造函数:初始化成一个空串 Stringu); •带参数的构造函数:根据参数内容初始化字符串 String(constchar * content); •拷贝构造函数:初始化宇符串 String(constString& cstr); •析构函数:释放堆空间 ~string(); •重载赋值运算符 = (只能作为类成员函数重载) String & operator=(constString & cstr); String& operator=(constchar* cstr); •重载下标运算符1,实现获取字符串中某个指定位置的字符(只能作为 类成员函数重载) char& operator[](int index); •重载类型转换运算符char* ,实现将字符串类强制转换成字符指针(只能 作为类成员函数重载) operator char" ( ); 要求:将类的定义与类成员两数的实现分开。 全局运算符重载函数(以类的友员函数形式重载) •重载加法运算符+,实现两个字符串的拼接 Stringoperatort(constString & cstr1, constString & cstr2); •重载加法运算符+,实现字符串和字符指针的拼接 Stringoperatort(constString& cstr1, constchar* cstr2); Stringoperator + (constchar * cstrl, constString & cstr2); •重载白增运算符++,实现将字符串中的小写字母转换成大写字母 SString& operatort + (String & cstr);//前置自增 Stringoperatort + (String & cstr, int); 1 / 后置自增 注意:在类中对运算符重载函数进行友元函数声明!!
以下是字符串类的定义和类成员函数的实现:
```c++
class String {
private:
char* str; // 存放字符串的字符数组
int length; // 字符串的长度
public:
String(); // 默认构造函数
String(const char* content); // 带参数的构造函数
String(const String& cstr); // 拷贝构造函数
~String(); // 析构函数
String& operator=(const String& cstr); // 重载赋值运算符
String& operator=(const char* cstr);
char& operator[](int index); // 重载下标运算符
operator char*(); // 重载类型转换运算符
friend String operator+(const String& cstr1, const String& cstr2); // 友元函数重载加法运算符
friend String operator+(const String& cstr1, const char* cstr2);
friend String operator+(const char* cstr1, const String& cstr2);
friend String& operator++(String& cstr); // 友元函数重载前置自增运算符
friend String operator++(String& cstr, int); // 友元函数重载后置自增运算符
};
String::String() {
length = 0;
str = new char[1];
str[0] = '\0';
}
String::String(const char* content) {
length = strlen(content);
str = new char[length + 1];
strcpy(str, content);
}
String::String(const String& cstr) {
length = cstr.length;
str = new char[length + 1];
strcpy(str, cstr.str);
}
String::~String() {
delete[] str;
}
String& String::operator=(const String& cstr) {
if (this != &cstr) {
delete[] str;
length = cstr.length;
str = new char[length + 1];
strcpy(str, cstr.str);
}
return *this;
}
String& String::operator=(const char* cstr) {
delete[] str;
length = strlen(cstr);
str = new char[length + 1];
strcpy(str, cstr);
return *this;
}
char& String::operator[](int index) {
return str[index];
}
String::operator char*() {
return str;
}
String operator+(const String& cstr1, const String& cstr2) {
String result;
result.length = cstr1.length + cstr2.length;
result.str = new char[result.length + 1];
strcpy(result.str, cstr1.str);
strcat(result.str, cstr2.str);
return result;
}
String operator+(const String& cstr1, const char* cstr2) {
String result;
result.length = cstr1.length + strlen(cstr2);
result.str = new char[result.length + 1];
strcpy(result.str, cstr1.str);
strcat(result.str, cstr2);
return result;
}
String operator+(const char* cstr1, const String& cstr2) {
String result;
result.length = strlen(cstr1) + cstr2.length;
result.str = new char[result.length + 1];
strcpy(result.str, cstr1);
strcat(result.str, cstr2.str);
return result;
}
String& operator++(String& cstr) {
for (int i = 0; i < cstr.length; i++) {
if (cstr.str[i] >= 'a' && cstr.str[i] <= 'z') {
cstr.str[i] -= 32;
}
}
return cstr;
}
String operator++(String& cstr, int) {
String temp(cstr);
++cstr;
return temp;
}
```
在MyString类的基础上完成一下功能: 重载运算符:+、+=、=、[]、>、<、>=、<=、== class MyString{ private: char *m_data; public: MyString(const char *str = 0); MyString(const MyString& rhs); ~MyString(); };C++,完整代码加中文注释
以下是基于MyString类完成的代码,包括了重载运算符:+、+=、=、[]、>、<、>=、<=、==:
```c++
#include <iostream>
#include <cstring>
using namespace std;
class MyString{
private:
char *m_data;
public:
MyString(const char *str = 0); // 构造函数
MyString(const MyString& rhs); // 拷贝构造函数
~MyString(); // 析构函数
MyString& operator=(const MyString& rhs); // 重载=运算符
MyString operator+(const MyString& rhs); // 重载+运算符
MyString& operator+=(const MyString& rhs); // 重载+=运算符
char& operator[](const int index); // 重载[]运算符
friend bool operator>(const MyString& lhs, const MyString& rhs); // 重载>运算符
friend bool operator<(const MyString& lhs, const MyString& rhs); // 重载<运算符
friend bool operator>=(const MyString& lhs, const MyString& rhs); // 重载>=运算符
friend bool operator<=(const MyString& lhs, const MyString& rhs); // 重载<=运算符
friend bool operator==(const MyString& lhs, const MyString& rhs); // 重载==运算符
friend ostream& operator<<(ostream& os, const MyString& str); // 重载<<运算符
};
// 构造函数
MyString::MyString(const char *str){
if (str == NULL){
m_data = new char[1];
*m_data = '\0';
} else {
int length = strlen(str);
m_data = new char[length + 1];
strcpy(m_data, str);
}
}
// 拷贝构造函数
MyString::MyString(const MyString& rhs){
int length = strlen(rhs.m_data);
m_data = new char[length + 1];
strcpy(m_data, rhs.m_data);
}
// 析构函数
MyString::~MyString(){
delete[] m_data;
}
// 重载=运算符
MyString& MyString::operator=(const MyString& rhs){
if (this == &rhs) return *this;
delete[] m_data;
int length = strlen(rhs.m_data);
m_data = new char[length + 1];
strcpy(m_data, rhs.m_data);
return *this;
}
// 重载+运算符
MyString MyString::operator+(const MyString& rhs){
MyString newString;
int length = strlen(m_data) + strlen(rhs.m_data);
newString.m_data = new char[length + 1];
strcpy(newString.m_data, m_data);
strcat(newString.m_data, rhs.m_data);
return newString;
}
// 重载+=运算符
MyString& MyString::operator+=(const MyString& rhs){
int length = strlen(m_data) + strlen(rhs.m_data);
char *temp = new char[length + 1];
strcpy(temp, m_data);
strcat(temp, rhs.m_data);
delete[] m_data;
m_data = temp;
return *this;
}
// 重载[]运算符
char& MyString::operator[](const int index){
return m_data[index];
}
// 重载>运算符
bool operator>(const MyString& lhs, const MyString& rhs){
return strcmp(lhs.m_data, rhs.m_data) > 0;
}
// 重载<运算符
bool operator<(const MyString& lhs, const MyString& rhs){
return strcmp(lhs.m_data, rhs.m_data) < 0;
}
// 重载>=运算符
bool operator>=(const MyString& lhs, const MyString& rhs){
return strcmp(lhs.m_data, rhs.m_data) >= 0;
}
// 重载<=运算符
bool operator<=(const MyString& lhs, const MyString& rhs){
return strcmp(lhs.m_data, rhs.m_data) <= 0;
}
// 重载==运算符
bool operator==(const MyString& lhs, const MyString& rhs){
return strcmp(lhs.m_data, rhs.m_data) == 0;
}
// 重载<<运算符
ostream& operator<<(ostream& os, const MyString& str){
os << str.m_data;
return os;
}
int main(){
MyString str1("Hello");
MyString str2("World");
MyString str3 = str1 + str2;
cout << str3 << endl;
str3 += str1;
cout << str3 << endl;
cout << str3[2] << endl;
cout << (str1 > str2) << endl;
cout << (str1 < str2) << endl;
cout << (str1 >= str2) << endl;
cout << (str1 <= str2) << endl;
cout << (str1 == str2) << endl;
MyString str4 = "Hello";
cout << str4 << endl;
return 0;
}
```
以上代码中,重载运算符的实现方式与普通函数是不同的。对于成员函数的运算符重载,需要在函数名前加上`operator`关键字,例如重载+运算符的函数名为`operator+`。对于非成员函数的运算符重载,需要在参数前加上对应的类名,例如重载>运算符的函数名为`operator>(const MyString& lhs, const MyString& rhs)`。
阅读全文
相关推荐















