这次代码的内容是通过模拟C++的string类,来数字拷贝构造函数和赋值运算符重载
#include <iostream>
#include <cstring>
using namespace std;
// char str[20];
// 缺点1:字符串大于数组大小放不下。
// 缺点2:字符串远小于数组大小就会空间浪费。
// char*与动态分配内存结合的方式来存取字符串,解决上面两个问题。
// 缺点:需要手动释放申请的动态内存,如果忘记就会内存泄露。
// 使用类的析构函数自动释放动态内存的方式,解决上面的缺点
class String{
private:
char* m_str;
public:
String(const char* str = NULL){
if(NULL == str){
m_str = new char[1];
m_str[0] = '\0';
}else{
m_str = new char[strlen(str)+1];
strcpy(m_str,str);
}
}
//拷贝构造函数
String(const String& s){
m_str = new char[strlen(s.m_str)+1];
strcpy(m_str,s.m_str);
}
//赋值运算符重载
String& operator=(const String& s){
if(this != &s){
//释放旧内存
delete [] m_str;
//分配新内存
m_str = new char[strlen(s.m_str)+1];
strcpy(m_str,s.m_str);
}
return *this;
}
~String(){
delete [] m_str;
m_str = NULL;
}
int size()const{
return strlen(m_str);
}
const char* c_str()const{
return m_str;
}
};
void Func1(String s){
cout << s.c_str() << endl;
}
String Func2(){
String s("return");
return s;
}
int main(){
// const int n = 10;
//n = 11;
//++n;
const String s("Hello");
cout << s.c_str() << endl; // const对象只能访问const成员函数
cout << s.size() << endl;
// 拷贝构造
String s1 = s;
cout << s1.c_str() << endl;
cout << s1.size() << endl;
// 赋值
String s2;
s2 = s;
cout << s2.c_str() << endl;
cout << s2.size() << endl;
// 对象值传递
Func1(s);
// 对象值返回
String s3 = Func2();
cout << s3.c_str() << endl;