myString操作符重载
写在前面的话:
重载是C++的重要内容,在自定义一个类的时候,需要对类中的方法进行重载,才能方便的实现相应的功能,比如一些运算符,构造,析构函数,一些功能函数等等,而C++语言自带的这些东西只使用于基本数据类型。另外,在自定义类中有指针的属性,注意一下深拷贝和浅拷贝的问题。
下面是自己的实现过程,已测试,可用。
注意:
1、内存泄露问题
2、*a++的含义(想想后置++的重载)
不使用库函数,自定义自己的string类,其中只有一个指针属性(注意重载operator=(),防止浅拷贝问题)
首先,实现myStrlen和myStrcpy这两个常用的函数。
然后,依次实现:
无参构造函数myString():
有参构造函数myString(const char* str):
拷贝构造函数myString(const myString& copyObj):
析构函数~myString(void):
int myStrlen(const char* str):
char* myStrcpy(char* des, const char* src):
operator=()(const myString& obj):
const char* myAppend(const char* str):
const char* toLow():
int myCompareCaseInsensitive(const char* str):
1.辅助函数
int myString::myStrlen(const char* str)
{
assert(NULL != str);
const char* end= str;
while ('\0' != *end++);
return end - str;
} char* myString::myStrcpy(char* des, const char* src)
{
assert(NULL != des && NULL != src); char* ret = des;
const char* retSrc = src;
while ((*ret++ = *retSrc++) != '\0');
return des;
}
2.无参构造函数,有参构造函数,拷贝构造函数,目标对象尚未存在,直接申请空间,赋值即可。
myString::myString()
{
myData = new char[];
if (NULL != myData)
myStrcpy(myData, "");
} myString::myString(const char* str )
{
if (NULL == str) //对于空串儿,将myData初始化为'\0'
{
myData = new char[];
if (NULL != myData)
myStrcpy(myData, "");
}
else if (NULL != str)
{
myData = new char[myStrlen(str) + ];
if (NULL != myData)
myStrcpy(myData, str);
} } myString::myString(const myString& copyObj) //const(只读) 引用(若用元素会死循环)
{
myData = new char[myStrlen(copyObj.myData) + ];
if (NULL != myData)
myStrcpy(myData, copyObj.myData);
} myString::~myString(void)
{
if (NULL != myData)
{
delete []myData;
myData = NULL;
}
}
3. operator=(const myString& obj)
myString& myString::operator =(const myString& obj)
{
if (this == &obj) //自身返回 1.*this和obj是自定义数据类型,没有重载==会报错;
return *this; //2.this和&obj是指针,可以使用==;
//3.不使用myData==obj.myData是因为自定义类中不一定只有myData一个属性(比如,加一个len)
if (NULL != myData)
{
delete[] myData;
myData = NULL;
} myData = new char[myStrlen(obj.myData) + ]; if (NULL != myData)
myStrcpy(myData, obj.myData); return *this;
}
4. const char* myAppend(const char* str)
const char* myString::myAppend(const char* str)
{ assert(NULL != myData && NULL != str); char* temp_myData = myData;
char*head_myData = myData;
const char* temp_str = str; int n = ;
n = myStrlen(myData) + myStrlen(str) + ;
char* ret = new char[n + ];
myData = ret; while ((*ret++=*temp_myData++) != '\0') ;
ret--;
while ((*ret++ = *temp_str++) != '\0'); delete[] head_myData; //释放原有内存
head_myData = NULL; return myData; }
5.转换大小写
const char* myString::toLow()
{
if (NULL == myData)
return NULL;
char* ret = myData; while ('\0' != *ret)
{
if (*ret >= 'A' && *ret <= 'Z')
*ret += ;
++ret;
}
return myData; }
6. 比较函数,不区分大小写
int myString::myCompareCaseInsensitive(const char* str)
{
unsigned char* src = (unsigned char*)str; //强制类型转换
int ret = ;
char* temData = myData;
while ('\0' != *src && '\0' != *temData &&
( == (*temData - *src) || == (*temData - *src) || == (*src - *temData)))
{
++temData;
++src;
}
ret = *temData - *src;
if ( == ret || == ret || - == ret || ('\0' == *src && '\0' == *temData))
ret = ;
if ((ret > && ret != ) || ('\0' == *src && '\0' != *temData))
{
ret = ;
}
if ((ret < && ret != -) || ('\0' == *temData && '\0' != *src))
{
ret = -;
} return ret;
}
myString操作符重载的更多相关文章
- c++之旅:操作符重载
操作符重载 操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类 那些操作符可以重载 除了下面几个操作符不能重载外,其它的操作符都能重载 . :: .* ?: sizeof 操作符重载的本 ...
- C++操作符重载总结operator(小结 更新ing)
操作符重载一个原则是:被操作的数据类型中 至少有一个是自定义的类型(使用class定义类),如果被操作的变量都是基本类型,那么就不能定义操作符重载. 1.如果重载了new,则必须重载delete,因为 ...
- kotlin之操作符重载
一元操作符 表达式 对应的函数 +a a.unaryPlus() -a a.unaryMinus() !a a.not() a++ a.inc() a-- a.dec() fun main(arg: ...
- c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...
- paip.操作符重载的缺失 Java 的一个大缺点
paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如 java代码会直接移植到 ...
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 操作符重载.xml
pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- C++一些注意点之操作符重载
重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...
随机推荐
- 微信电脑版-微信for windows客户端发布
12月份微信Windows版客户端1.0 Alpha推出,昨天微信for windows 1.0客户端(测试版)发布更新,超过三亿人使用的聊天应用,现在登录Windows桌面.你可以在Windows上 ...
- Shell入门教程:流程控制(6)while 循环
while循环的语法: while 条件测试 do 命令区域 done 举例: #!/bin/bash declare -i i=1 declare -i sum=0 while ((i< ...
- fetch 资源请求
简介:fetch() 方法用于发起获取资源的请求.它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象. 为了更好的体验,可点击这里阅读 ...
- 上个项目的一些反思 I
最近一直在反思之前的项目,发现了很多问题.比如数据安全... 虽然项目需求是只展示最新的数据,所以几乎没用什么本地存储.除了通讯录和用户的Token. 用户通讯录另表,今天反思下用户的Token的存储 ...
- edghasdz
匹配2016年10月8日19时51分50秒匹配 可以使用
- gdbsever 使用说明
gdbsever 使用说明 在新塘N3292x平台下 编译 gdbsever ./configure --target=arm-linux --host=arm-linux arm-linux-gdb ...
- jstl 小总结 以及 jstl fn
1.1.1 JSTL的使用 JSTL是JSP标准标签库.结合EL替换传统页面的<%%> * JSTL如果不会用.也是可以使用<%%>.但是一般在大公司使用JSTL.进入小公司. ...
- iOS10 SiriKit QQ适配详解
原文连接 1. 概述 苹果在 iOS10 开放了 SiriKit 接口给第三方应用.目前,QQ已经率先适配了 Siri 的发消息和打电话功能.这意味着在 iOS10 中你可以直接告诉 Siri 让它帮 ...
- 为 placeholder 自定义样式
textarea::-webkit-input-placeholder{ padding: 1em; } textarea::-moz-placeholder{ padding: 1em; } 同理, ...
- 51nod1079(中国剩余定理)
题目链接: http://www.51nod.com/onlineJudge/user.html#!userId=21687 题意: 中文题诶~ 思路: 本题就是个中国剩余定理模板题,不过模拟也可以过 ...