在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符。

[]运算符重载

+运算符重载

+=运算符重载

<<运算符重载
>>运算符重载

 C++ Code 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

 
#ifndef _STRING_H_


#define _STRING_H_


#include <iostream>


using 
namespace std;

class String

{


public:

    String(
const 
char *str = 
"");

    String(
const String &other);

    String &
operator=(
const String &other);

    String &
operator=(
const 
char *str);

bool 
operator!() 
const;

    
char &
operator[](
unsigned 
int index);

    
const 
char &
operator[](
unsigned 
int index) 
const;

friend String 
operator+(
const String &s1, 
const String &s2);

    String &
operator+=(
const String &other);

friend ostream &
operator<<(ostream &os, 
const String &str);

    
friend istream &
operator>>(istream &is, String &str);

    ~String(
void);

void Display() 
const;

private:

    String &Assign(
const 
char *str);

    
char *AllocAndCpy(
const 
char *str);

    
char *str_;

};

#endif 
// _STRING_H_

 C++ Code 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

 
#pragma warning(disable:
)


#include 
"String.h"


#include <string.h>


//#include <iostream>
//using namespace std;

String::String(
const 
char *str)

{

    str_ = AllocAndCpy(str);

}

String::String(
const String &other)

{

    str_ = AllocAndCpy(other.str_);

}

String &String::
operator=(
const String &other)

{

    
if (
this == &other)

        
return *
this;

return Assign(other.str_);

}

String &String::
operator=(
const 
char *str)

{

    
return Assign(str);

}

String &String::Assign(
const 
char *str)

{

    
delete[] str_;

    str_ = AllocAndCpy(str);

    
return *
this;

}

bool String::
operator!() 
const

{

    
return strlen(str_) != 
;

}

char &String::
operator[](
unsigned 
int index)

{

    
//return str_[index];
    
//non const 版本调用 const版本

return 
const_cast<
char &>(
static_cast<
const String &>(*
this)[index]);

}

const 
char &String::
operator[](
unsigned 
int index) 
const

{

    
return str_[index];

}

String::~String()

{

    
delete[] str_;

}

char *String::AllocAndCpy(
const 
char *str)

{

    
int len = strlen(str) + 
;

    
char *newstr = 
new 
char[len];

    memset(newstr, 
, len);

    strcpy(newstr, str);

return newstr;

}

void String::Display() 
const

{

    cout << str_ << endl;

}

String 
operator+(
const String &s1, 
const String &s2)

{

    
//int len = strlen(s1.str_) + strlen(s2.str_) + 1;
    
//char* newstr = new char[len];
    
//memset(newstr, 0, len);
    
//strcpy(newstr, s1.str_);
    
//strcat(newstr, s2.str_);
    
//
    
//String tmp(newstr);
    
//delete newstr;
    
//return tmp;
    String str = s1;

    str += s2;

    
return str;

}

String &String::
operator+=(
const String &other)

{

    
int len = strlen(str_) + strlen(other.str_) + 
;

    
char *newstr = 
new 
char[len];

    memset(newstr, 
, len);

    strcpy(newstr, str_);

    strcat(newstr, other.str_);

delete[] str_;

str_ = newstr;

    
return *
this;

}

ostream &
operator<<(ostream &os, 
const String &str)

{

    os << str.str_;

    
return os;

}

istream &
operator>>(istream &is, String &str)

{

    
char tmp[
];

    is >> tmp;

    str = tmp;

    
return is;

}

 C++ Code 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

 
#include 
"String.h"


#include <iostream>


using 
namespace std;

int main(
void)

{

    String s1(
"abcdefg");

char ch = s1[
];

    cout << ch << endl;

s1[
] = 
'A';

    s1.Display();

const String s2(
"xyzabc");

    ch = s2[
];

    
//s2[2] = 'M'; Error
    s2.Display();

String s3 = 
"xxx";

    String s4 = 
"yyy";

String s5 = s3 + s4;

    s5.Display();

String s6 = 
"aaa" + s3 + 
"sdfadfa" + 
"xxxx";

    s6.Display();

s3 += s4;

    s3.Display();

cout << s3 << endl;

String s7;

    cin >> s7;

    cout << s7 << endl;

return 
;

}

需要注意的是,不能将String类的构造函数声明为explicit,否则    String s3 = "xxx"; 编译出错;operator[] 的non const 版本调用了const 版本的实现,其中使用了static_cast和 const_cast 两种类型转换操作符,可以参考这里;operator+ 调用了operator+= 的实现;只能将流类运算符重载为友元函数,因为第一个参数是流类引用,不是String 类。

从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载的更多相关文章

  1. 完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载

    在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符. []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重 ...

  2. 【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物

    原文:[高德地图API]从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 摘要:覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在 ...

  3. 从零开始学 Web 之 JavaScript(三)函数

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  4. 从零开始学 Web 之 Ajax(三)Ajax 概述,快速上手

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  5. 从零开始学 Web 之 ES6(三)ES6基础语法一

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  6. 从零开始学 Web 之 CSS(三)链接伪类、背景、行高、盒子模型、浮动

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  7. 从零开始学 Web 之 HTML(三)表单

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  8. 从零开始学 Web 之 BOM(三)offset,scroll,变速动画函数

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  9. 从零开始学 Web 之 jQuery(三)元素操作,链式编程,动画方法

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

随机推荐

  1. HTML静态分页(形如:首页,上一页,下一页,尾页)

    在HTML中有时候我们会用到静态分页,一次拿回一定量的数据结果条目,我们会以形如:第2页,共12页  首页 上一页 下一页 尾页 的方式进行静态分页,以下是该种静态分页的代码,供兄弟姐妹们参考. &l ...

  2. JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

    说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...

  3. 日志之再说Log4J

    网上关于LOG4J的使用文章太多了,写这篇文章的目的一方面是为了回顾LOG4J的用法,一方面针对配置的使用自动将日志插入数据库,自动发送邮件,还有就是自定义输入实现.后续文章会总结下从LOG4J到LO ...

  4. VMware安装CentOS 图文教程

    VMware安装CentOS 图文教程 VMware 下安装CentOS6.2 取消 Easy install模式(此模式不好,很多软件没有安装) http://jingyan.baidu.com/a ...

  5. 【转】Android Application 对象介绍

    What is Application Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application ...

  6. Visual Studio 当前不会命中断点的问题

    这个问题一般有两个版本 1.当前不会命中断点,还没有为该文档加载任何符号. 2.当前不会命中断点,源代码与原始版本不同. 要解决第一个问题,就要了解一种文件格式“PDB(Program DataBas ...

  7. 简单的php和apache的安装

    今天刚刚接触到PHP  要想深入学习一门语言  首先我们先从安装开始   对于php和apache这两个程序是比较难以安装的  好了  下面我们开始正式安装: 首先我们得准备好  apache  以及 ...

  8. C#函数式程序设计之泛型

    Intellij修改archetype Plugin配置 2014-03-16 09:26 by 破狼, 204 阅读, 0 评论,收藏, 编辑 Maven archetype plugin为我们提供 ...

  9. 一个小团队TDD游戏及实践

    介绍的这个游戏是自己根据目前带的团队的实际情况来制定的, 在游戏实践过程中,收到了较好的效果,故打算把这个游戏分享出来,一是分享一下实践,而是集思广益,不断完善,更好的利用游戏来锻炼队伍.下面就将游戏 ...

  10. HTML初学者的三十条最佳

    颜海镜 专注web前端,分享html,css,javascript等相关知识…… 给HTML初学者的三十条最佳实践 Nettuts +运营最困难的方面是为很多技能水平不同的用户提供服务.如果我们发布太 ...