编写高质量代码——重载operator=的标准三步走

CString& CString::operator=(const CString& str){

  if(this == &str)       //1.自赋值检查

      return *this;       

  if(pChar!=NULL)       //2.释放原有空间

    delete[]  pCahr;

  pChar = new char[strlen(str.pChar)+1]; //
2.申请新空间

  strcpy(pChar, str.pChar);  //2.数据复制    (不要忘记对基类的赋值)

  return *this;   //3.返回对象的引用

}

█不要让编译器帮你重载赋值运算符(浅拷贝、POD对象、堆内存)

█一定要检查自赋值

1)效率,特别是具有内存分配操作。

2)如果目标对象pChar不为NULL,会将目标对象pChar指向的内存首先释放。又因为自赋值,原对象pChar与目标对象pChar指向通过目标对象 pChar 释放掉的空内存空间。后续操作的危险性不言而喻。

【自赋值操作】

█赋值运算符重载需返回 *this 的应用(链式赋值【内置数据类型支持】)

例如:

class CString{ };

CString str1("Hello C++");

CString str2, str3;

str3 = str2 =str1;

相当于:str3.operator=(str2.operator=(str1));//赋值运算符具有右结合性

返回值应为“引用”:

1)效率(避免返回对象构造、析构的过程)

2)存在括号改变赋值的顺序:

class CString{ };

CString str1("Hello C++");

CString str2, str3;

(str3 = str2) =str1; //如果非引用,将返回临时对象,临时对象不允许调用成员函数

█赋值运算符重载函数不能重载  //虽然没有显式地为派生类声明赋值运算符重载函数,但是不要忘记编译器悄悄做的事!基类 operator= 被隐藏。

█派生类中 operator= 重载函数应为对象中的所有数据成员进行一一赋值,最重要的是:基类部分最简单的方式,即直接调用基类的
operator=

编写高质量代码——重载operator=的标准三步走

时间: 2024-10-15 02:21:59

编写高质量代码——重载operator=的标准三步走的相关文章

编写高质量代码——运算符重载,是成员函数还是友元函数

一.运算符重载的四项基本原则: ▍不可臆造运算符. ▍运算符原有操作数的个数.优先级和结合性不能改变. ▍操作数中至少一个是自定义类型. ▍保持运算符的自然含义. ============================== 二.运算符重载的两种形式: ▍成员函数形式(隐含一个参数 this 指针): 1)双目运算符:参数一个 2)单目运算符:不能显示的声明参数 ▍友元函数形式(不存在隐含的参数 this 指针) 1)双目运算符:两个参数 2)单目运算符:一个参数 ===============

编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符

建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; 而不是用下面的语法来完成一样的事情: int x = 1; int y = 2; int total = int.Add(x, y); 同理,在构建自己的类型时,我们应该始终考虑该类型是否可以用于运算符重载.如果考虑类型Salary,下面的这段代码看起来就不是那么舒服了: Salary mikeIn

编写高质量代码改善C#程序的157个建议——建议41:实现标准的事件模型

建议41:实现标准的事件模型 上一建议中,我们实现了一个带事件通知的文件传输类FileUploader.虽然已经满足需求,但却不符合C#的编码规范,查看EventHandler的原型声明: public delegate void EventHandler(object sender, EventArgs e); 我们应该知道微软为事件模型定义的几个规范: 委托类型的名称已EventHandler结束: 委托原型返回值为void: 委托原型具有两个参数:sender表示事件触发者,e表示事件参数

编写高质量代码——“零星”总结(续2)

newdelete与new[]delete[]必须配对使用 //注意,由于内置数据类型没有构造.析构函数,所以针对内置数据类型时,释放和内存使用delete或delete[]的效果是一样的. 例如: int *pArray = new int[10]; ...//processing code delete pArray;  //等同于delete[] pArray; 虽然针对内置类型,delete和delete[]都能正确地释放所申请的内存空间,但是如果申请的是一个数组,建议还是使用delet

转载-------编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)

阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法              The reasonable man adapts himself to the world; The unreasonable one persists in trying to adapt the world himself. 明白事理的人使自己适应世界:不明事理的人想让世

编写高质量代码——“零星”总结

不要让main函数返回void //在C++中绝对没有出现过 void main(){  }这样的函数定义,在C语言中也是. //两种 main 的定义方式:int main( void ); //                     int main( int argc, char** argv ) //第一版的C语言中只有 int 一种数据类型,为了兼容 需要,不明确标明返回值的,默认为 int //在main函数中,return 语句的作用在于离开main函数(析构掉所有具有动态生存时

编写高质量代码——“零星”总结(续3)

明白在C++中如何使用C C++中使用C的程序库,实现C++和C的混合编程:extern "C" { /* code */ }一定要加在C++的代码文件中才能起作用. //C编译器编译函数时不带函数的类型信息,只包含函数符号名字:而C++编译器为了实现函数重载,在编译时会带上函数的类型信息.extern "C"的作用:告诉C++链接器寻找调用函数的符号时,采用C的方式. =================================== 使用memcpy()系列

编写高质量代码之改善C++程序语法篇2<从C到C++需要做的改变>

偶然发现网络读书频道,http://book.51cto.com/art/201202/317549.htm,挺不错的希望CSDN也有,可能已经有了... 阅读<编写高质量代码--改善C++程序的150个建议>,总结归纳: 此文用以加深记忆,督促学习的目的 0  在C++中如何使用C的代码 如:int func( int a, char b); c编译函数时不带函数的类型信息,上面的函数被编译成类似_Func的符号 c++为了实现重载,在编译时会加上函数的参数类型,上面的函数会被编译成类似_F

编写高质量代码,改善C++程序的150个建议:指针、初始化和运算符

建议0:不要让main函数返回void 首先C++ 标准中从没有出现过void main(){}这样的函数定义. 标准的主函数定义有两种: int main() int main(int argc,char * argv[]) 在main函数中,return 语句的作用在于离开main函数(析构掉所有具有动态生存时间的对象),并将其返回值作为参数来调用exit函数.如果函数执行到结尾儿没有遇到return 语句,其效果就等于执行了return 0. 建议1:区分0 的四种面孔 1)整形0.作为一