写在前面的话:

重载是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. Problem to be sovled

    Given an array A of N integers, we draw N discs in a 2D plane such that the I-th disc is centered on ...

  2. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  3. MySQL 的 find_in_set 函数使用方法

    举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文...1,12,13 等等 . 现在有篇文章他既是 头条,又是热点,还是图文, type中以 1, ...

  4. javascript数据结构-介绍

    github博客地址 名词解释 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率.数据结构 ...

  5. jquery.print.js 打印插件

    <script language="javascript" src="jquery-1.4.4.min.js"></script> &l ...

  6. 为 MySQL 设置默认字符集(UTF-8)避免产生乱码

    环境:Windows 7+Wamp Server+MySQL 5.7.9 查看MySQL默认编码: SHOW VARIABLES LIKE 'character%' character_set_cli ...

  7. dex文件格式一

    一.生成dex文件 我们可以通过java文件来生成一个简单的dex文件 编译过程: 首先编写java代码如下: (1) 编译成 java class 文件 执行命令 : javac Hello.jav ...

  8. 未备案域名打开国内服务器上的网站(绑定国外空间并判断url后跳转引用)

    场景:由于域名没备案不能绑定国内服务器,通过先绑定国外空间,在空间着陆页判断当前url,打开不同的页面.页面上通过iframe引用国内服务器上的目标网站. 实现:未备案域名打开国内服务器上的网站. 国 ...

  9. Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  10. iOS9 新功能:Support Universal Links

    先看官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalL ...