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 ...
随机推荐
- svn清除已保存的用户名和密码
在项目中使用SVN是必须的,我们一般将用户名和密码进行保存处理,这样做的好处在于每次都不用输入了,方便快捷.但是当我们想用另外一个svn账号时,这时候该怎么办呢,看下图,让提示框重新出来. 找到这个页 ...
- PHP读写大“二进制”文件,不必申请很大内存(fopen、fread、fwrite、fclose)
<?php /** * 读写大二进制文件,不必申请很大内存 * 只有读取到内容才创建文件 * 保证目录可写 * * @param string $srcPath 源文件路径 * @param s ...
- Linux启动新进程的几种方法汇总
有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些 ...
- T-SQL实用查询之常用SQL语句
删除数据库所有的表: declare @sql varchar() begin SELECT @sql='drop table ' + name FROM sysobjects WHERE (type ...
- Linux 架构
(转)作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! http://www.cnblogs.com/vamei/archive/2 ...
- 页面位置 top、postop、scrolltop、offsetTop、scrollHeight、offsetHeight、clientHe
1.top 此属性仅仅在对象的定位(position)属性被设置时可用.否则,此属性设置会被忽略. 代码如下: <div style=" position:absolute; widt ...
- Android笔记:调试android程序
1.Debug 第一步: 添加断点 第二步: 右击项目→Debug As→Android Application //之后一个对话框出现,一会自动消失 第三步: 执行手机端操作,Eclipse 就会 ...
- 各大就业网站对web前端的就业要求
今日与女神有约,在[web前端学习部落22群]有直播公开课,喜欢的朋友赶紧加入吧!随着高等教育的普及,高校毕业生的人数每年都以极快的速度增长,数据显示,2016年,高校毕业生多达765万人,比2015 ...
- php面试题2
php面试题及答案(原创)收藏 基础题: 1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2 ...
- js验证输入的金钱格式
<html> <head> <title>js验证输入的金钱格式</title> <script type="text/javascri ...