在前面文章中使用过几次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. 手机web下拉加载

    //需要 zepto.js支持 var page=0;//当前页 var pages=1;//总页数 var ajax=!1;//是否加载中 Zepto(function($){ $(window). ...

  2. MPEG-DASH on IIS Practice in Action-attach

    1. 准备  IIS Media Service已经安装准备好(如上),注意需要在2008上安装,2003安装不了,或者就算能安装也很麻烦 一个或多个码率的媒体文件如MP4已经准备好 DASH MPD ...

  3. Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by

    配置php网站的时候,经常会在页首出现Warning: session_start() [function.session-start]: Cannot send session cache limi ...

  4. IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统

    原文:IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统 asp.net 网站有三种常用的发布方式:分别是拷贝开发机上发布好的 ...

  5. ViewPaper实现轮播广告条

    使用V4包中的viewPaper组件自己定义轮播广告条效果. 实现viewpaper的滑动切换和定时自己主动切换效果. 上效果图 布局文件 <RelativeLayout xmlns:andro ...

  6. Android学习小Demo(21)ListView的联动选择

    在日常的App开发中,尤其是在开发生活服务的应用上,非常多时候,我们会须要联动地展现省市区的数据等,需求大概例如以下: 1)展现全部省份 2)当点击某省份的时候,在二级菜单上展现此省份以下所属的城市列 ...

  7. [探索]点点轻博客搬家到WordPress(一)

    摘要:点点博客备份XML通过DiandianToWordpress-beta.sh(文末给出)搬家到Wordpress博客 本人曾使用过点点轻博客,也深知像点点博客,Lofter博客导出的XML文件不 ...

  8. SSIS如何引用外部DLL

    原文:SSIS如何引用外部DLL 当SSIS引用外部的DLL时,外部的DLL须满足以下条件: 1. DLL是强命名. 2. 加入到GAC (C:\WINDOWS\assembly),直接把DLL拉进目 ...

  9. ftoa浮法成字符串

    #include <stdio.h> bool ftos(float num,char *s,int n) {     int temp; float t=num; int pn=0; b ...

  10. Mysql基础之字符集与乱码

    原文:Mysql基础之字符集与乱码 Mysql的字符集设置非常灵活 可以设置服务器默认字符集 数据库默认字符集 表默认字符集 列字符集 如果某一个级别没有指定字符集,则继承上一级. 以表声明utf8为 ...