C++面向对象基础(2)-String class(带指针)
基本结构
#ifndef _MYSTRING_ // 防卫式声明
#define _MYSTRING_
class String
{
...
}
String::function (...) ...
Global-function (...) ...
要完成的功能:
1、无参构造和有参构造
2、拷贝构造和拷贝赋值
3、操作符<<重载
注意:编译器自己默认的拷贝按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。
big three 三个特殊函数
接口设计
class String
{
public:
String (const char* cstr = 0) ;
String (const String& str) ; // 拷贝构造
String& operator = (const String& str) ; // 拷贝赋值
~String () ; // 析构函数
char* get_c_str () const { return m_data; } //成员函数名后+const表示只读函数,不能修改函数里的类数据成员的值
private:
char* m_data;
}
函数设计
// 构造函数----动态分配内存
inline
String::String (const char* cstr = 0)
{
if (cstr) { // 判断指针是否为0
m_data = new char[ctrlen(cstr)+1];
strcpy(m_data, cstr);
}
else { // 未指定初值
m_data = new char[1];
*m_data = '\0';
}
}
// 析构函数----释放分配的内存,避免内存泄漏
inline
String::~String()
{
delete[] m_data;
}
如果是带指针的类,就一定要有拷贝构造和拷贝赋值
// 拷贝构造
inline
String::String(const String& str)
{
m_data = new char[ strlen(str.m_data) + 1 ];
strcpy(m_data, str.m_data);
}
// 拷贝赋值
inline
String& String::operator=(const String& str)
{
if (this == &str) // 自我检测(,必须要有,非常重要)
return *this;
detele[] m_data;
m_data = new char[ strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
操作符<<重载,必须为全局函数
#include <iostream.h>
ostream& operator<<(ostream& os, const String& str)
{
os << str.get_c_str();
return os;
}
浙公网安备 33010602011771号