自己的_String类实现
来源:互联网 发布:mac安装win8后无线 编辑:程序博客网 时间:2024/04/28 13:46
//_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==str2hello worldhello world
问题集合:
1.内联函数是定义型,也就是声明部分不加inline,定义部分才加;
2.友元函数是声明型,也就是声明部分加friend,定义不加;
3.最开始使用内联函数定义_String类函数时,使用VS2012编译不通过,报错说是“不可识别符号”,去掉inline就可以了,具体原因不详。。。
4.常对象只能调用常成员函数,所以就有:char* c_str() const;只有这样,长对象才可以找到自己变量。
0 0
- 自己的_String类实现
- _String类
- 黑马程序员_String类的常用功能
- 黑马程序员_String类的学习
- 黑马程序员_String类的介绍
- 黑马程序员_String类的一些总结
- 常见对象_String类的概述
- 常见对象_String类的构造方法
- 常见对象_String类的判断功能
- 常见对象_String类的获取功能
- 常见对象_String类的转换功能
- 常见对象_String类的其他功能
- 大数运算_string类的简单应用
- Lua内置库的实现(一)_string模块
- 自定义类_string类
- 黑马程序员_String类
- 黑马程序员_String类
- 黑马程序员_String类
- ADAPT-PT v8.0(房屋与停车场结构里的梁、板、楼板系统之先进后拉预力软件)
- Parcelable接口
- B2 Spice A/D v4.1.2.0 Pro
- json包含单双引号问题解决方案
- 【Java心得总结一】Java基本类型和包装类型解析
- 自己的_String类实现
- oracle 导入dump时出现表领域不足的解决
- Python中peewee模块(二)
- OSI七层模型详解
- Reflex.XTR-ISO 1CD(模型模拟飞行器)
- js 字符串转化成数字 .
- 申请域名后添加A记录
- poj 1050 to the max
- Oracle EBS R12启用HTTPS安全链接(SSL)