在前面文章中使用过几次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. Entity Framework 处理并发

    Entity Framework 处理并发 在以前的两个教程你对关联数据进行了操作.本教程展示如何处理并发性.您将创建工作与各Department实体的 web 页和页,编辑和删除Department ...

  2. Ios 从无到有项目 MVVM模式(两)

    1.该项目昨天,我认为未来,有三个部分,第一部分是基于一个在线数据查询对聚合,第二部分是xmpp聊天功能,第三部分是很多其他功能. 2.在线咨询,使用的主要技术,它是get要求或post要求,该网上查 ...

  3. PHP 7: PHP 变量和常量的定义

    原文:PHP 7: PHP 变量和常量的定义 本章说说变量的定义.如果对于变量和常量的定义,你会注意几个方面呢?你可能会想到: 如何定义变量,它和C# 等语言有什么不同呢? 变量区分大小写吗? PHP ...

  4. valid number 判断字符串是否为有效数字

    RT,面试题,给定一个字符串判断是否为科学计数法的有效数字.此题各种繁琐考虑.今天终于学会了用有限状态机来处理.理解之后简洁易懂.在此分享我的理解推导思路,大有收获啊. 网上有解法说先记录每个状态代表 ...

  5. HTML 5 在Web SQL 使用演示样本

    Web sql 这是一个模拟数据库浏览器.可以使用JS操作SQL完成数据读取和写入,但是这件事情并不多,现在支持的浏览器,而其W3C规格已经停止支持.外形似它的前景不是很亮. W3C 规范:http: ...

  6. Web Api 自动生成帮助文档

    Web Api 自动生成帮助文档   新建Web Api项目之后,会在首页有API的导航菜单,点击即可看到API帮助文档,不过很遗憾,Description 是没有内容的. 怎么办呢? 第一步: 如果 ...

  7. shell脚本中执行另一个shell脚本

    分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量   注意,圆点后面有 ...

  8. 【工作笔记三】非常全面的讲解Hosts文件

    原文:http://www.cnblogs.com/zgx/archive/2009/03/10/1408017.html 很奇怪有很多人不知道Hosts是什么东西.在网络病毒日渐盛行的今天,认识Ho ...

  9. JS定时跳转URL并输出剩余秒数

    1. [代码][JavaScript]代码 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 <scrip ...

  10. Gitlab,Github与Bitbucket

    这段时间开始做毕设,决定使用git来管理代码和相关的文档. 同时希望有一个远程托管,决定在github.bitbucket,以及我自己搭建的gitlab服务器中间选一个,最终决定使用bitbuckt. ...