写在前面的话:

重载是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. Shell标准输出、标准错误 >/dev/null 2>&1

    Shell中可能经常能看到:>/dev/null  2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...

  2. css3径向渐变详解-遁地龙卷风

    (-1)写在前面 我用的是chrome49,如果你用的不是.可以尝试换下浏览器前缀.IE在这方面的实现又特例独行了.不想提及-,这篇是为后续做准备. (0)快速使用 background-image: ...

  3. windows7下php5.4成功安装imageMagick,及解决php imagick常见错误问题。(phpinfo中显示不出来是因为:1.imagick软件本身、php本身、php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个文件放到/php/目录下面)

    windows7下   php5.4成功安装imageMagick . (phpinfo中显示不出来是因为:1.软件本身.php本身.php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个 ...

  4. 使用jvisualvm.exe 的Btrace插件介绍/使用教程

    一.背景        在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打 ...

  5. 前端 js 发送验证码

    1. 代码如下: <html> <head> <meta charset="utf-8"> <title></title> ...

  6. .NET LINQ 限定符操作

    限定符操作      限定符运算返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表 ...

  7. 使用MultipartEntity进行post请求的默认MIME类型

    MultipartEntity .FileBody的默认MIME类型:application/octet-stream

  8. LeetCode之383. Ransom Note

    -------------------------------------------- 思路就是进行频率统计. 统计一下第二个字符串字符出现次数++统计一下第一个字符串中字符出现次数--如果出现负数 ...

  9. Logging vs NoLogging

    You Asked My Prod environments is like this. Three Node RAC, Active Data guard enabled. There is a p ...

  10. RAC出现CRS-4535: Cannot communicate with Cluster Ready Services 时排查问题步骤

    crsctl check crs 发现第二行报错: CRS-4638: Oracle High Availability Services is onlineCRS-4535: Cannot comm ...