#include "stdafx.h" #include <iostream> #include <string> using namespace std; class String { public: String(const char* str = NULL); // 构造函数 String(const String& another); // 拷贝构造函数 ~String(); // 析构函数 String& operator = (const String& str); // 赋值函数 friend ostream& operator<<(ostream& os, const String& str); // 重载输入输出流 void swap(String& str){ std::swap(this->m_data,str.m_data); } private: char* m_data; }; String::String(const char*str) { if(str == NULL) { m_data = new char[1]; m_data[0] = '/0'; return; } size_t len = strlen(str); m_data = new char[len+1]; strcpy(m_data,str); } String::String(const String& another) { size_t len = strlen(another.m_data); this->m_data = new char[len+1]; strcpy(this->m_data, another.m_data); } String::~String() { delete[] m_data; } String& String::operator =(const String& str) { // 一般的实现方式 /*size_t len = strlen(str.m_data); char* temp = new char[len+1]; strcpy(temp, str.m_data); delete[] this->m_data; this->m_data = temp; return *this;*/ // 异常安全的实现方式 String temp(str); swap(temp); return *this; } ostream& operator<<(ostream& os, const String& str) { os<< str.m_data; return os; } void main() { { String a = "abc"; String b = "123456789"; String c(a); a = b; cout<<"a = "<<a<<endl; cout<<"c = "<<c<<endl; } getchar(); } Answer: a = 123456789 c = abc