天天看點

轉換構造函數和隐式構造函數

// converthiddenconstructor.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

class String
{
public:
	// brief : 構造函數
	// param : nil
	String()
	{
		m_str = new char[0];
		m_len = 0;
	}

	// brief : 構造函數
	// param : len 字元數
	String(int len)
	{
		m_len = len + 1;
		m_str = new char[m_len];
	}

	// brief : 構造函數
	// param : str 字元串
	String(const char *str)
	{
		m_len = strlen(str) + 1;
		m_str = new char[m_len];
		memcpy_s(m_str, sizeof(char) * m_len, str, sizeof(char) * m_len);
	}

	// brief : 構造函數
	// param : str 字元串
	//         len 字元數
	String(const char *str, int len)
	{
		m_len = len + 1;
		m_str = new char[m_len];
		memcpy_s(m_str, sizeof(char) * m_len, str, sizeof(char) * m_len);
	}
	
	// brief : 拷貝構造函數
	// param : nil
	String(const String &s)
	{
		m_str = new char[s.m_len];
		m_len = s.m_len;
		memcpy_s(m_str, sizeof(char) * s.m_len, s.m_str, sizeof(char) * s.m_len);
	}

	// brief : 析構函數
	// param : nil
	~String()
	{
		if(m_str)
			delete m_str;
		m_str = NULL;
		m_len = 0;
	}

	// brief : 指派
	// param : s 字元串
	//         return 目前執行個體的引用
	String &operator= (const String &s)
	{
		if(this->m_str == s.m_str)
			return *this;
		realloc(s.m_len);
		memcpy_s(m_str, sizeof(char) * s.m_len, s.m_str, sizeof(char) * s.m_len);
		return *this;
	}

	// brief : 調整記憶體
	// param : d 需求的字元數
	// remark : 如果記憶體足夠則隻重設字元數,記憶體不足則重新配置設定記憶體然後重設字元數
	void realloc(int l)
	{
		if(m_len < l)
		{
			if(m_str)
				delete m_str;
			m_str = new char[l];
		}
		m_len = l;
	}

public:
	char *m_str;	// 字元串
	int m_len;		// 字元數
};

// 隻有傳值能夠進行隐式類型轉換,傳引用不能進行隐式類型轉換
void Print(String str)
{
	printf("%s\n", str.m_str);
}

void RefPrint(String &str)
{
	printf("%s\n", str.m_str);
}

int _tmain(int argc, _TCHAR* argv[])
{
	// 應用構造函數進行類型轉換
	String str = String("some text.");// 此時的構造函數稱為“轉換構造函數”

	// 應用構造函數進行隐式類型轉換,作為傳值函數實參
	Print("auto print.");// 此時的構造函數稱為“隐式構造函數”

	// 應用構造函數進行類型轉換,作為傳引用函數實參
	char autoprint[] = "auto print.";
	RefPrint(String(autoprint));

	return 0;
}
           

繼續閱讀