字符串中运算符的重载问题

运算符的重载:

运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数。这个函数叫做运算符重载函数,通常为类的成员函数。

定义运算符重载函数的一般格式:
返回值类型 类名::operator重载的运算符(参数表){……}

在字符串中,运算符的重载问题在于字符串和字符串之间进行计算。

首先我们定义一个字符串的类,并为其写出构造函数、拷贝构造函数,析构函数、打印字符串函数。

class String
{private:char *str;String(char *p,int){if(p != NULL){str = p;}else{str = new char[1];*str = '\0';}}
public:String(const char *p = NULL)    //构造函数{if(NULL == p)    //避免字符串为空{str = new char[1];*str = '\0';}else{int n = strlen(p) + 1; str = new char[n];strcpy(str,p);}}String(const String &s)    //拷贝构造函数{int n = strlen(s.str) + 1;str = new char[n];strcpy(str,s.str);}~String()    //析构函数{delete []str;}void PrintString()    //打印字符串函数{cout<<str<<endl;}};

若没有显示地定义实现这些函数,编译器也会为类加上默认的这些函数,这叫做缺省函数。

关于字符串类的创建中的一些解释:

在构造函数中

String(const char *p = NULL)    //构造函数{if(NULL == p)    //避免字符串为空{str = new char[1];*str = '\0';}else{int n = strlen(p) + 1; str = new char[n];strcpy(str,p);}}

参数默认值为NULL,若字符串为空,则为其创建一字节空间,,并在其中输入’\0’。这样就避免了字符串为空造成的问题。

在拷贝构造函数中

 String(const String &s)    //拷贝构造函数{int n = strlen(s.str) + 1;str = new char[n];strcpy(str,s.str);}

首先定义n来获取原字符串的长度,然后动态开辟一个长度为n的新字符串,通过strcpy函数将原字符串中的内容拷贝的新字符串中。这种拷贝构造函数也叫做深拷贝。
这样避免了两个字符串指向同一空间造成二次释放问题。

1、 ‘=’ 运算符重载

 // void operator=(String * const this,const String &s)String & operator=(const String &s){if(this != &s)    //避免自己给自己赋值{delete []this->str;int n = strlen(s.str)+1;this->str = new char[n];strcpy(this->str,s.str);}return *this;}

首先判断是避免自己给自己赋值的情况。之后释放 ‘=’ 左边字符串指针指向的空间,定义n用来计算 ‘=’ 右边字符串长度,给左边字符串开辟一个和右边大小相同空间,最后将右边字符串的内容拷贝到左边字符串中。
这样避免了两个字符串指向同一空间造成二次释放问题。

关于函数名的说明
函数返回类型是String,且是 ‘&’ 引用。这样可以进行连续赋值,例如s3=s2=s1,先将s1赋值给s2,再将s2赋值给s3(其函数形式:
s3.operator=(s2.operator=(s1))
operator=(&s3,operator=(&s2,s1))
)
使用引用返回,可以避免产生临时量。(注:对象生存周期不受函数影响,就可以使用引用返回)

2、 ‘+’ 运算符重载

 // String & operator+(const String * const this,const String &s)String  operator+(const String &s) const{int len = strlen(this->str) + strlen(s.str) + 1;char *sp = new char[len];strcpy(sp,this->str);strcat(sp,s.str);String tmp(sp,0)return tmp;}

使用值返回,是因为产生的临时量,临时量在函数结束是已经被析构了,所以不能使用引用返回。

在private中加入一个构造函数如下(在参数中加一个int,是为了和public中的构造函数区别)。

String(char *p,int){if(p != NULL){str = p;}else{str = new char[1];*str = '\0';}}

这样就解决了函数中内存泄漏问题。

补充:内存泄漏
(1)开辟的空间丢失地址。
(2)堆空间被用尽了。

3、 ‘+’ 运算符重载(对象和字符串)

// String operator+(const String * const this,const char *sp);String operator+(const char *sp) const{return *this + String(sp);}

4、 ‘+’ 运算符重载(字符串和对象)

String operator+(const char *sp,const String &s)
{return String(sp) + s;
}

注:因为类的成员默认有参数this指针,所以该函数要作为全局函数。

5、 ‘+’ 运算符重载(下标运算符重载)

 char & operator[](int index){return str[index];}
 const char & operator[](int index) const    //常引用{return str[index];}

【C++】字符串中运算符的重载问题相关推荐

  1. C语言字符串中运算符,c语言字符串中找到一个运算符,怎样实现运算

    1.一个字符串里面包含运算符,要转成正常运算的运算符,可以用 宏指令.相当于直接执行语句.宏指令在不同语言中执行方式不同的. 2.例程: //基本的堆栈思想 #include #include typ ...

  2. C++中运算符重载需要遵循的规则

    一.C++中运算符重载需要遵循的规则 1.并不是所有的运算符都可以重载.能够重载的运算符包括: + - * / % ^ & | ~ ! = < > += -= *= /= %= ^ ...

  3. C++知识点40——运算符的重载概念与分数类实现(中)

    接上篇文章https://blog.csdn.net/Master_Cui/article/details/109515376,继续实现分数类和相关运算符的重载 3.重载算术运算符和复合赋值运算符 算 ...

  4. python中的模运算符_Python中的字符串模运算符与format函数

    如果你在网上搜索Python中如何进行字符串插值(string interpolation),那么你很可能会发现一些留言和旧文档中说字符串模运算符(%)以后会被废弃,并移除出标准库.但是这完全是杞人忧 ...

  5. c++中运算符重载方式中你易遗漏的小细节

    运算符重载函数相当于类来说有两种存在方式: 1.重载为类的成员函数. 2.重载为类的友元函数. 重载为类的成员函数. 如果把运算符重载为类的成员函数,则该函数么须通过对象调用,该对象就是运算符的其中一 ...

  6. c++中运算符重载(加号运算,左移运算,前置后置++运算符,赋值运算,关系运算,函数运算)

    运算符重载注意 重载的运算符要易读 内置的数据类型的表达式的运算符是不可以改变的 不要重载&& 和 | | 运算符 =,[]和->运算符只能通过成员函数进行重载 << ...

  7. 详解C++中的函数调用和下标以及成员访问运算符的重载

    http://www.jb51.net/article/78436.htm 这篇文章主要介绍了详解C++中的函数调用和下标以及成员访问运算符,讲到了这些二元运算符使用的语法及重载,需要的朋友可以参考下 ...

  8. stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串

    stl取出字符串中的字符 字符串作为数据类型 (String as datatype) In C, we know string basically a character array termina ...

  9. java:去除字符串中空格 、 oracle (+) 、 mysql中数值运算符和函数

    java:去除字符串中空格 http://www.cnblogs.com/LiuChunfu/p/5661810.html oracle:oracle (+) https://zhidao.baidu ...

最新文章

  1. 国家的重视让少儿编程越来越火爆!
  2. cordova降低版本10.0.0为8.1.2
  3. [网络流24题] 航空路线问题 (费用流)
  4. 如何在 Asp.Net Core 中 管理敏感数据
  5. linux运维中的中间件,linux中间件Nginx的安装过程
  6. Java comparator接口源码解读
  7. 据所有独立的c文件生成相应执行文件通用Makefile
  8. 一文了解地理数据和三维地理信息系统
  9. matlab 色温图,LED色温图谱详解
  10. mysql5.8安装
  11. mingw不能安装_C语言/C++初学——Visual Studio环境的安装配置与使用
  12. 《多多自走棋》、《全民超神》均停服:盘点那些凉得最快的游戏
  13. 腾讯视频获取 MP4格式源并下载
  14. 怎么删除或者彻底卸载输入法
  15. 以网易云为例,使用审查元素(开发者选项)获取音乐资源
  16. 网络wifi测试软件app,WIFI检测精灵
  17. 通过配置光猫路由器实现家用主机远程桌面连接
  18. 5年前, 以太坊大脑送给V神一份神秘大礼; 今天, V神将它给了你...
  19. 锚伪类link、hover、active、visited
  20. 基于数据挖掘的入侵检测系统实验

热门文章

  1. 年方二八,人生的路口之上
  2. 远程安装Oracle Server
  3. 使用httpHandlers进行url rewrite时,提示http 404 error 错误
  4. 查找linux所有目录中包含字符,Linux查找目录下包含有某字符串的全部文件
  5. 【数据结构与算法】之栈与队列的应用和操作
  6. 2013\National _C_C++_C\1.好好学习
  7. 编写你的第一个 Django 应用,第 7 部分
  8. 中国大学MOOC 人工智能导论第三章测试
  9. centos build-essential 报错
  10. 深度学习——02、深度学习入门——经典卷积神经网络架构实例——AlexNet