//_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;只有这样,长对象才可以找到自己变量。