【面试题001-补充】C++ MyString类的封装

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 09:12   26   0

【面试题001-补充】C++ MyString类的封装

一,C++ MyString类的封装

String.h:

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
#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_



String.cpp:

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
#pragma warning(disable: 4996)
#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_) != 0;
}

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) + 1;
char *newstr = new char[len];
memset(newstr, 0, 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;
String str = s1;
str += s2;
return str;
}

String &String:: operator+=( const String &other)
{
int len = strlen(str_) + strlen(other.str_) + 1;
char *newstr = new char[len];
memset(newstr, 0, 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[ 1024];
cin >> tmp;
str = tmp;
return is;
}

main.cpp:

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
#include "String.h"
#include <iostream>
using namespace std;

int main( void)
{
String s1( "abcdefg");

char ch = s1[ 2];
cout << ch << endl;

s1[ 2] = 'A';
s1.Display();

const String s2( "xyzabc");
ch = s2[ 2];
//s2[2] = 'M';
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 0;
}

Makefile:

1
2
3
4
5
6
7
8
9
10
11
12
.PHONY:clean
CPP=g++
CFLAGS=-Wall -g
BIN=test
OBJS=main.o String.o
LIBS=
$(BIN):$(OBJS)
$(CPP) $(CFLAGS) $^ -o $@ $(LIBS)
%.o:%.cpp
$(CPP) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o $(BIN)

运行结果:

1
2
3
4
5
6
7
8
9
c
abAdefg
xyzabc
xxxyyy
aaaxxxsdfadfaxxxx
xxxyyy
xxxyyy
adf
adf

转载于:https://www.cnblogs.com/codemylife/p/3653382.html

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP