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