|
需要注意的问题:
1、浅拷贝和深拷贝的区别
2、拷贝复制函数中检测自我赋值(self assignment)的作用
头文件
#ifndef PROJECT3_MYSTRING_H
#define PROJECT3_MYSTRING_H
class String
{
//Big Three ,三个特殊函数:拷贝构造(copy ctor)、拷贝赋值(copy op=)、析构函数
public:
String(const char* cstr = 0);//构造函数
String(const String& str); // 拷贝构造
String& operator = (const String& str);//拷贝赋值
~String(); //析构函数,死亡的时候,析构函数就会被调动起来
char* get_c_str() const { return m_data;} //成员函数
private:
char* m_data;
};
// 构造函数和析构函数成对出现,构造函数动态分配内存,如果没有去掉,就发生内存泄漏,这个函数在死去之前,用析构函数,把里面的变量给删除掉;
// 构造函数
inline
String::String(const char *cstr) {
if(cstr){
m_data = new char[strlen(cstr) + 1];
strcpy(m_data,cstr);
// std::cout<<m_data<<std::endl;
}
else{
m_data = new char[1];
*m_data = '\0';
}
}
// 拷贝构造函数
inline
String::String(const String& str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
//拷贝复制函数
inline
String& String::operator = (const String& str)
{
if (this == &str) //检测自我赋值(self assignment):(1)效率高,(2)如果左右指针相同,自我赋值,则会出现问题
return *this;
delete[] m_data;
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
//#include<iostream>
//ostream& operator<<(ostream& os, const String& str)
//{
// os << str.get_c_str();
// return os;
//}
// 析构函数
inline
String::~String() {
delete[] m_data;
}
#endif //PROJECT3_MYSTRING_H
主函数
#include <iostream>
#include <string>
#include "mystring.h"
using namespace std;
int main()
{
String a("hello111");//构造函数
String b("world");
String c(a); //拷贝构造
b = a;//拷贝赋值函数
cout<<a.get_c_str();
// String* p = new String("hello");
// delete p;
// String s3(s1); //拷贝构造
// cout << c <<endl;
// s3 = s2; //拷贝赋值
return 0;
}
|