随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

String类的实现

1、在类中可以访问private成员包括两层含义:可以访问this指针的private成员;可以访问同类对象的private成员。

2、这里的String可以认为是个资源管理类,内部有个char指针,在堆上分配对象,而且对于String应该是深复制,不是复制指针,而是要复制指针指向的内容。

String类的定义(头文件):

复制代码
 1 #ifndef String_H_
 2 #define String_H_
 3 class String
 4 {
 5 public:
 6  String(const char* src);
 7  String(const String& rhs);
 8  String& operator=(const String& rhs);
 9  ~String();
10 private:
11  char* _data;
12 };
13 #endif
复制代码

String类的实现(cpp文件):

复制代码
 1 #include "String.h"
 2 #include <iostream>
 3 String::String(const char* src)
 4 {
 5  if(src==NULL)
 6  {
 7   _data = new char[1];
 8   _data[0]='\0';
 9  }
10  else
11  {
12   _data = new char[strlen(src)+1];
13   strcpy(_data,src);
14  }
15 }
16 
17 String::String(const String& rhs)
18 {
19  _data = new char[strlen(rhs._data)+1];
20  strcpy(_data,rhs._data);
21 }
22 
23 String& String::operator=(const String& rhs)
24 {
25  if(this == &rhs)
26  {
27   return *this;
28  }
29  delete[]_data;
30  _data = new char[strlen(rhs._data)+1];
31  strcpy(_data,rhs._data);
32  return *this;
33 }
34 
35 String::~String()
36 {
37  delete []_data;
38 }
复制代码

上面的String实现,使用了new char在堆上分配内存,当然也可以使用malloc,需要注意的是,这种情况下,要使用free释放内存。而且,要注意的是,new和delete是关键字,而malloc和free是方法。

复制代码
 1 #include "String.h"
 2 #include <iostream>
 3 String::String(const char* src)
 4 {
 5  if(src==NULL)
 6  {
 7   _data = (char*)malloc(1);
 8   _data[0]='\0';
 9  }
10  else
11  {
12   _data = (char*)malloc(strlen(src)+1);
13   strcpy(_data,src);
14  }
15 }
16 
17 String::String(const String& rhs)
18 {
19  _data = (char*)malloc(strlen(rhs._data)+1);
20  strcpy(_data,rhs._data);
21 }
22 
23 String& String::operator=(const String& rhs)
24 {
25  if(this == &rhs)
26  {
27   return *this;
28  }
29  free(_data);
30  _data = (char*)malloc(strlen(rhs._data)+1);
31  strcpy(_data,rhs._data);
32  return *this;
33 }
34 
35 String::~String()
36 {
37  free(_data);
38 }
复制代码

 

posted on   Andy Niu  阅读(374)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示