// 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;
}
转换构造函数和隐式构造函数
最新推荐文章于 2025-01-25 23:18:20 发布