//_String .h
#include <string.h>
#include <iostream>
using namespace std;
class _String
{
private:
char *m_data;
public:
_String(const char* str);
_String(const _String &other);
_String& operator=(const _String &other);
_String operator+(const _String &other) const;
char& operator[](unsigned int index);
bool operator==(const _String &other);
void c_append(char *str);
char* c_str() const;
friend std::istream& operator>>(std::istream& is, _String& str);
friend std::ostream& operator<<(std::ostream& os, _String& str);
~_String(void);
};
上面是頭文件,注意標準輸入輸出聲明爲友元函數:
//_String.cpp
#include "stdafx.h"
#include "_String.h"
_String::_String(const char* str=NULL) {
if(!str) m_data = 0;
else {
int i, len = strlen(str)+1;
m_data = new char[len];
for(i=0; i<len-1; i++)
m_data[i] = str[i];
m_data[i] = '\0';
}
}
_String::_String(const _String &other) {
if(!other.c_str()) m_data = 0;
else {
char *ostr = other.c_str();
int i, len = strlen(ostr)+1;
delete[] m_data;
m_data = new char[len];
for(i=0; i<len-1; i++)
m_data[i] = ostr[i];
m_data[i] = '\0';
}
}
_String& _String::operator=(const _String &other) {
if (this != &other) {
delete[] m_data;
if(!other.c_str()) m_data = 0;
else {
char *ostr = other.c_str();
int i, len = strlen(ostr)+1;
delete[] m_data;
m_data = new char[len];
for(i=0; i<len-1; i++)
m_data[i] = ostr[i];
m_data[i] = '\0';
}
}
return *this;
}
_String _String::operator+(const _String &other) const {
if(!m_data)
return other;
else if (!other.c_str())
return *this;
else {
_String newString;
newString.c_append(m_data);
newString.c_append(other.c_str());
return newString;
}
}
char& _String::operator[](unsigned int index) {
if(index>=strlen(m_data))
return *m_data;
return *(m_data+index);
}
bool _String::operator==(const _String &other) {
if (0 == strcmp(m_data, other.c_str()))
return true;
return false;
}
char* _String::c_str() const {return m_data;}
_String::~_String(void) {delete []m_data;}
void _String::c_append(char *str) {
if(str) {
int i ;
int len;
if(!m_data) {
len = strlen(str)+1;
m_data = new char[len];
for(i=0; i<len-1; i++)
m_data[i] = str[i];
m_data[i] = '\0';
}
else {
int m_len = strlen(m_data);
int o_len = strlen(str);
len = m_len + o_len + 1;
char *temp = new char[len];
for (i=0; i<m_len; i++)
temp[i] = m_data[i];
for (i=0; i<o_len; i++)
temp[i+m_len] = str[i];
delete[] m_data;
m_data = temp;
}
}
}
std::istream& operator>>(std::istream& is, _String& str) {
is>>str.m_data;
return is;
}
std::ostream& operator<<(std::ostream& os, _String& str) {
os<<str.m_data;
return os;
}
主程序:
//main.cpp
#include "stdafx.h"
#include "_String.h"
int _tmain(int argc, _TCHAR* argv[])
{
_String str1 = "hello world";
_String str2(str1);
if (str1 == str2)
cout<<"str1==str2"<<endl;
_String str3 = str1 + str2;
cout<<str3<<endl;
system("pause");
return 0;
}
輸出結果:
str1==str2
hello worldhello world
問題集合:
1.內聯函數是定義型,也就是聲明部分不加inline,定義部分才加;
2.友元函數是聲明型,也就是聲明部分加friend,定義不加;
3.最開始使用內聯函數定義_String類函數時,使用VS2012編譯不通過,報錯說是“不可識別符號”,去掉inline就可以了,具體原因不詳。。。
4.常對象只能調用常成員函數,所以就有:char* c_str() const;只有這樣,長對象纔可以找到自己變量。