写一个简单String类

来源:互联网 发布:物业app软件取名 编辑:程序博客网 时间:2024/06/08 14:20

先列举一些会用到的知识点

  1. strcpy, strcat等字符串操作函数。
  2. new和delete对于内存的操作符。
  3. 对于类的基本概念,拷贝构造,成员运算符的重载。

对于这篇博客我只做简单的介绍。

关于strcpy函数。

函数原型char * strcpy(char *dest, char *src)
作用是将src所指向的内容拷贝到dest所指向的内存中。
需要注意的点
1. src是以NULL结束的字符串。
2. src 和dest所指向的内存不能重叠(具体原因可以去看strcpy的实现,简单的说就是,内存如果重叠可以会将NULL覆盖导致内存溢出。)
3. dest必须有足够的空间。

关于strcat函数

函数原型char* strcat(char *dest, char *src)
作用是将src所指向的内容连接到dest后。
dest和src都需以NULL结尾,且dest中需要有足够的空间。

关于new和delete

在c++中我们用new和delete在对内存进行动态的分配。
new[] 与delete []配合使用。

关于成员函数

1.成员函数可以调用class中所有成员。包括形参中的private成员,这里的形参当然是指自己的类型,比如class String中一个成员函数是,String(const String &str) 形参String类型就是本类的类型,可以直接调用该类的private成员。

这里直接粘源码。

#include <iostream>
#include <cstring>
`
using namespace std;
class String{
public:
String()=default; //默认构造函数
String(const char *str); //构造函数
String(const String &str); //复制构造函数
String& operator=(const String &str); //重载赋值运算符
// String operator+(const String &str1, const String &str2); //重载加号运算符
/*用成员方式重载运算符, 不能改变参数的个数
二元运算符用成员重载时, 只需要一个参数, 另一个参数由this指针传入
所以, 像
rmb::operator+(rmb&, rmb&)
都要改成
rmb::operator+(rmb&)
第一个参数由this指针自动传入到函数中去的.

两个参数可以做成友元函数。*/
friend String operator+(const String &str1, const String &str2); //重载加号运算符
~String() {delete []data;}
private:
char *data;
};
//构造函数
String::String(const char *str)
{
if(str)
{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
else
{
data = new char[1];
*data = ‘\0’;
}
}
//复制构造函数
String::String(const String &str)
{
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
}
//重载赋值运算符
String& String::operator=(const String &str)
{
if(this == &str)
return *this;
else
{//赋值的过程先抹去内存中的内容在进行赋值
delete []data;
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
return *this;
}
}
//重载加号运算符
//String String::operator+(const String &str1, const String &str2)
String operator+(const String &str1, const String &str2)
{
String tmp;
delete tmp.data;
tmp.data = new char[strlen(str1.data) + strlen(str2.data) + 1];
strcpy(tmp.data, str1.data);
strcat(tmp.data, str2.data);
return tmp;
}
int main()
{
cout << “Hello world!” << endl;
String a(“hello”), b(” world”);
String c = a + b;
//cout << c << endl;
char tmp[4] = {‘a’, ‘b’, ‘c’, ‘d’};
cout << tmp << endl;
return 0;
}
`

0 0
原创粉丝点击