C++拷貝建構函式和運算子過載(VC實現)
阿新 • • 發佈:2018-12-14
String.h檔案:
#ifndef STRING_H #define STRING_H #include <ostream> using namespace std; class String { public: String(){ m_pStr = nullptr; } String(const char* pStr); String(const String& str);//拷貝建構函式 ~String() { if (m_pStr != nullptr) { delete m_pStr; m_pStr = nullptr; } } String& operator=(const String& str);//這裡其實可以不返回物件的,但是表示式一般都具有返回值。 String& operator=(const char* pStr); friend ostream& operator<<(ostream& output, const String& str);//只能將流運算子過載為友元函式,因為要返回流物件以供連續輸出。 int GetLength() { if (m_pStr == nullptr) return 0; else return strlen(m_pStr); } private: char* m_pStr; }; #endif
String.cpp檔案:
#define _CRT_SECURE_NO_WARNINGS #include "String.h" #include <stdio.h> String::String(const char* pStr) { if (pStr != nullptr) { int len = strlen(pStr); m_pStr = new char[len + 1]; m_pStr[len] = 0; strcpy(m_pStr, pStr); } else m_pStr = nullptr; } //拷貝建構函式,將物件作為引數或返回物件時都會呼叫 String::String(const String& str) { if (str.m_pStr != nullptr) { char* pStr = str.m_pStr; int len = strlen(pStr); m_pStr = new char[len + 1]; m_pStr[len] = 0; strcpy(m_pStr, pStr); } else m_pStr = nullptr; } String& String::operator = (const String& str) { m_pStr = str.m_pStr; return *this; } String& String::operator=(const char* pStr) { if (pStr != nullptr) { int len = strlen(pStr); m_pStr = new char[len + 1]; m_pStr[len] = 0; strcpy(m_pStr, pStr); } else m_pStr = nullptr; return *this; } ostream& operator<<(ostream& output, const String& str) { if (str.m_pStr != nullptr) printf("%s", str.m_pStr); return output; }
測試檔案(main.cpp):
#include <iostream> using namespace std; #include "String.h" int main() { String s1("Hello"); cout << s1 << endl<<"你好啊"<<endl; String s2 = s1;//呼叫拷貝建構函式 cout << s2 << endl; String s3; s3 = s1;//呼叫運算子過載函式 cout << s3 << endl; String s4 = "haha";//呼叫了無參建構函式,而非呼叫=號運算子過載函式 cout << s4 << endl; getchar(); return 0; }