• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 详解C++中实现继承string类的MyString类的步骤

详解C++中实现继承string类的MyString类的步骤

作者:mifan88 字体:[增加 减小] 来源:互联网 时间:2017-05-28

mifan88 通过本文主要向大家介绍了mystring,mystring类,mystring什么意思,全面的mystring,class mystring等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

昨天师兄又出了道测试题,让我们实现类似于string类的没有MyString类,刚开始很头疼,可是真正在自己写代码的时候又很兴奋的发现,这个过程真的是个很宝贵的机会,让我又有机会可以很好的熟悉回顾C++的很多知识—类设计,构造析构函数,成员函数,友元函数,引用,重载,字符串操作,动态内存分布。。。。。于是昨天花了半天时间写了300多行代码,并认真的进行了相关测试、修改和总结。因为内容有点丰富,所以想分几次写出来,条理也清楚些。

类的空间分配:类给它的每个对象都分配了独立的空间去存储它的数据成员,所有的对象公共的访问类方法进行操作。同时在对象的独立空间中,不包括数据成员动态分配的空间,对象只是记录了动态分配空间的地址(所以在析构函数调用的时候只是删除了对像空间,同时需要用new来删除动态分配的地址)。

一、类声明—mystring.h:
1. 构造函数:
专门用于构建新对象,给成员数据分配必要的内存空间并将值赋给新对象的成员数据。
默认构造函数:
在未提供显式初始化值时,被用来创建对象的构造函数(所以它一般没有参数)

MyString();
</div>

复制构造函数:
用于将一个对象复制到新创建的对象中(当然这个被复制的对象必须已经存在)。

MyString(const MyString &str);
</div>

给定了一定初始化参数的构造函数:
参数列表中的值会一次赋给新创建对象的各个成员函数:

MyString(const char*str);
</div>

2.析构函数:
当对象过期时删除对象所占的内存空间,并且当对象创建时有用New请求的内存空时,在析构函数中同时要调用delete对原来分配的 内存空间进行释放,以防止内存泄露。
~MyString();

3.成员函数:
重载赋值成员函数:

MyString &operator=(const MyString &str);    //利用已有的string对象通过=给一个对象进行赋值
MyString &operator=(const char*str);       //直接用常量字符串进行赋值
</div>

一般赋值函数:

MyString &assign(const MyString&str);
MyString &assign(const char*sstr);
</div>

几个处理字符串的成员函数:

size_t getsize()const;                  //返回字符串大小
void clear();                      //把字符串清空
bool empty();                       //判断字符串是否为空
void swap(MyString &str);              //交换两个字符串
int compare(const MyString &str)const;      //比较2个字符串的大小
//第一个const说明显式调用的字符串不可更改,括号外面的const说明隐式调用的字符串不可更改,只读数据    
int compare(const char*str);           
</div>

追加函数:

MyString &operator+=(const MyString&str);
MyString &operator+=(const char*str);
MyString &append(const MyString&str);
MyString &append(const char *str);
</div>

生成字串:

MyString substr(size_t pos = 0,n=npos) const; 
生成字串,从第0个位置开始长度为n,若N超过长度,则为输出整个字符串的长度
</div>

4.友元函数(运算符重载):
友元函数一般都是在类得声明中进行定义,它不属于类得成员函数,但是它和类得成员函数一样同样的可以对类得所有数据成员进行访问。

friend bool operator==(const MyString &str1,const MyString &str2);
friend bool operator==(const char *str,const MyString &str2);
friend bool operator==(const MyString &str1,const MyString *str2);
friend bool operator>(const MyString &str1,const MyString &str2);
friend bool operator>(const char*str1,const MyString &str2);
friend bool operator>(const MyString &str1,const char*str2);
</div>

同样还有<等各种比较。

friend MyString operator+(const MyString &str1,const MyString &str2);
friend MyString operator+(const char*str1,const MyString &str2);      //两个字符串进行相加
friend MyString operator+(const MyString &str1,const char*str2);

friend ostream & operator<<(ostream &os,const MyString &str);       //输出命令符的重载

</div>

5.成员数据变量:

char *string;                     //指向字符串的指针
int length;                       //字符串的长度
static const int string_number = 0;      //计数创建的字符串的数目
</div>

二、实现.cpp文件:
1.构造函数和析构函数:

MyString::MyString() 
{ 
  length = 0; 
  string = new char; 
  char *s = "/0"; 
  memcpy(string,s,1); 
  ++string_number; 
} 
 
MyString::MyString(const char*str) 
{ 
  length = strlen(str); 
  string = new char(length+1); 
  memcpy(string,s,length); 
  ++string_number; 
} 
MyString::MyString(MyString &str) 
{ 
  length = str.length; 
  string = str.string; 
  ++string_number; 
} 
 
MyString::~MyString() 
{   
  delete[]string; 
  --string_number; 
} 
</div>

几个注意的问题:
1)构造函数中必须给所有的数据成员进行初始化。
2)注意在给指向字符串的指针赋值时,左右类型的对应。
char *s代表一个指向字符串的指针,所有右边必须是一个字符串常量“/0”,而不能是‘/0'.
3)一个指针只能指向一个地址,不能同时指向两个。
在给string分配了地址之后,下一步我们肯定是确定分配的地址中存放的具体内容,那么这个时候我们都是使用strcpy()或者是
memcpy()把对应的字符串存入地址中。
如果原来我们成这样实现:

   MyString::MyString()
  {
    length = 0;
    string = new char;
    string = "/0";
    ++string_number;
  }
</div>

那么我们在编译和实现的时候都不会发现有什么错,但是析构函数使用delete【】释放内存使执行结果会出现乱码,因为string=“/0”
让它指向了一个字符串,并没有分配内存空间,所以在释放的时候就会出现错误。
4)析构函数中的重要语句 delete【】不要忘
析构函数在使用的时候只会释放为对象分配的空间,但是对象的空间中只是存储了数据成员分配内存的地址,所以并没有释放数据成员
的内存空间,必须使用delete[]来进行释放,防止内存泄露 
2.重载运算符的成员函数:

MyString &MyString::operator+=(const MyString&str) 
{ 
   char *dest; 
   dest = new char[str.length+length+1]; 
   memcpy(dest,string,length); 
   memcpy(dest+length,str.string,str.length+1); 
   delete[]string; 
   length = length+str.length; 
   string = dest; 
   return*this; 
} 
MyString &MyString::operator+=(const char*str) 
{ 
   char *dest; 
   dest = new char[strlen(str)+length+1]; 
   memcpy(dest,string,length); 
   memcpy(dest+length,str,strlen(str)+1); 
   delete[]string; 
   string = dest; 
   return *this; 
} 
 
 //字符串赋值 
MyString &MyString::operator=(const MyString&str) 
{ 
  if(&str == this) 
    return *this; 
  delete[]string; 
  string = new char[str.length]; 
  memcpy(string,str.string,str.length); 
  length = str.length; 
  return *this; 
} 
</div>

 
注意的幾個問題:
1)+=运算中,调用函数的对象最终字符串长度肯定大于其原来的长度,所以在这个函数调用过程中,我们必须给字符串重新分配一块
两个字符串长度和大小的内存区域。但是因为函数返回值又必须是原调用对象的引用,所以我们要定义一个中间变量指针来存储2个
字符串合并结果,最后释放string指针原来的内存区域后,再让它指向合并字符串。
2)“=”赋值运算肯定和构造函数的初始化不一样。
在使用这个方法以前,那么对象肯定至少已经通过调用构造函数数据成员有了一定的值。所以这个时候我们首先判断两个对象是否
相等

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解C++中实现继承string类的MyString类的步骤

相关文章

  • 2017-05-28浅析STL中的常用算法
  • 2017-05-28C语言中交换int型变量的值及转换为字符数组的方法
  • 2017-05-28C++中四种加密算法之AES源代码
  • 2017-05-28VC++中进程与多进程管理的方法详解
  • 2017-05-28C/C++获取目录下的文件列表信息
  • 2017-05-28使用单链表实现多项式计算示例
  • 2017-05-28从汇编看c++中变量类型的深入分析
  • 2017-05-28C语言中获取文件状态的相关函数小结
  • 2017-05-28关于函数调用方式__stdcall和__cdecl详解
  • 2017-05-28浅谈Windows系统下C语言编程中Glib库的使用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 关于C语言多线程pthread库的相关函数说明
    • 浅谈stringstream 的.str()正确用法和清空操作
    • 深入理解C/C++混合编程
    • 浅析C++中的虚函数
    • c++友元函数与友元类的深入解析
    • floyd算法实现思路及实例代码
    • 深入探讨POJ 2312 Battle City 优先队列+BFS
    • c语言全盘搜索指定文件的实例代码
    • C 语言基础教程(一)颜色加亮
    • static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有