1. 程式人生 > >C++拷貝建構函式和運算子過載(VC實現)

C++拷貝建構函式和運算子過載(VC實現)

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;
}