本文最后更新于:2020年4月23日 中午
概览:C++面向对象练习:string类型的构造、析构函数实现。
代码全部运行于VS2019
博客后续会持续更新补充。
题目
已知 类String的原型为:
1 2 3 4 5 6 7 8 9 10
| class String { public: String(const char *str = NULL); String(const String &other); ~String(void); String & operate =(const String &other); private: char *m_data; };
|
请编写String的上述4个函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| String::String(const char* str) { cout << "默认构造函数" << endl; if (str == NULL) this->m_data = new char['\0']; else { int length = strlen(str); this->m_data = new char[length + 1]; strcpy_s(this->m_data, length+1, str); } }
String::String(const String& other) { cout << "拷贝构造函数" << endl; int length = strlen(other.m_data); this->m_data = new char[length + 1]; strcpy_s(this->m_data, length + 1, other.m_data); }
String::~String() { cout << "析构函数" << endl; delete[] m_data; m_data = nullptr; }
String& String::operator=(const String& other) { cout << "重载=赋值" << endl; if (this == &other) return *this;
if (this->m_data) delete[] this->m_data;
int length = strlen(other.m_data); this->m_data = new char[length + 1]; strcpy_s(this->m_data, length + 1, other.m_data); return *this; }
|
执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void String::print() { cout << this->m_data << endl; }
int main() { String a("hello"); a.print();
String b(a); b.print();
String c; c = a; c.print();
return 0; }
|
执行结果
1 2 3 4 5 6 7 8 9 10
| 默认构造函数 hello 拷贝构造函数 hello 默认构造函数 重载=赋值 hello 析构函数 析构函数 析构函数
|
- 当函数参数有默认值的时候,并且函数的声明与定义分开的时候,默认参数只能出现在其中的一个地方。参考链接·:C++函数默认参数
- 使用strlen(const char* str)求得字符串长度是从头截至到
\0
结束字符,但是不包括\0
。
- 而在给字符串开辟空间时要注意额外加上
\0
的空间!
参考链接:
C++笔试题 String类的实现
C++笔试题之String类的实现