写在前面的话:

重载是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操作符重载的更多相关文章

  1. c++之旅:操作符重载

    操作符重载 操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类 那些操作符可以重载 除了下面几个操作符不能重载外,其它的操作符都能重载 . :: .* ?: sizeof 操作符重载的本 ...

  2. C++操作符重载总结operator(小结 更新ing)

    操作符重载一个原则是:被操作的数据类型中 至少有一个是自定义的类型(使用class定义类),如果被操作的变量都是基本类型,那么就不能定义操作符重载. 1.如果重载了new,则必须重载delete,因为 ...

  3. kotlin之操作符重载

    一元操作符 表达式 对应的函数 +a a.unaryPlus() -a a.unaryMinus() !a a.not() a++ a.inc() a-- a.dec() fun main(arg: ...

  4. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  5. paip.操作符重载的缺失 Java 的一个大缺点

    paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如   java代码会直接移植到 ...

  6. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  7. 操作符重载.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...

  8. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  9. C++一些注意点之操作符重载

    重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...

随机推荐

  1. 微信电脑版-微信for windows客户端发布

    12月份微信Windows版客户端1.0 Alpha推出,昨天微信for windows 1.0客户端(测试版)发布更新,超过三亿人使用的聊天应用,现在登录Windows桌面.你可以在Windows上 ...

  2. Shell入门教程:流程控制(6)while 循环

    while循环的语法: while 条件测试 do     命令区域 done 举例: #!/bin/bash declare -i i=1 declare -i sum=0 while ((i< ...

  3. fetch 资源请求

    简介:fetch() 方法用于发起获取资源的请求.它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象. 为了更好的体验,可点击这里阅读 ...

  4. 上个项目的一些反思 I

    最近一直在反思之前的项目,发现了很多问题.比如数据安全... 虽然项目需求是只展示最新的数据,所以几乎没用什么本地存储.除了通讯录和用户的Token. 用户通讯录另表,今天反思下用户的Token的存储 ...

  5. edghasdz

    匹配2016年10月8日19时51分50秒匹配 可以使用

  6. gdbsever 使用说明

    gdbsever 使用说明 在新塘N3292x平台下 编译 gdbsever ./configure --target=arm-linux --host=arm-linux arm-linux-gdb ...

  7. jstl 小总结 以及 jstl fn

    1.1.1 JSTL的使用 JSTL是JSP标准标签库.结合EL替换传统页面的<%%> * JSTL如果不会用.也是可以使用<%%>.但是一般在大公司使用JSTL.进入小公司. ...

  8. iOS10 SiriKit QQ适配详解

    原文连接 1. 概述 苹果在 iOS10 开放了 SiriKit 接口给第三方应用.目前,QQ已经率先适配了 Siri 的发消息和打电话功能.这意味着在 iOS10 中你可以直接告诉 Siri 让它帮 ...

  9. 为 placeholder 自定义样式

    textarea::-webkit-input-placeholder{ padding: 1em; } textarea::-moz-placeholder{ padding: 1em; } 同理, ...

  10. 51nod1079(中国剩余定理)

    题目链接: http://www.51nod.com/onlineJudge/user.html#!userId=21687 题意: 中文题诶~ 思路: 本题就是个中国剩余定理模板题,不过模拟也可以过 ...