22-考虑以操作符复合形式(op=)取代其独身形式(op)
Created|Updated|计算机编程语言1-EffectiveC++_35个改善条款_学习笔记
|Post Views:
第四章,效率
22-考虑以操作符复合形式(op=)取代其独身形式(op)
复合形式(op=)当对于独身形式(op)效率更高,因为不用返回一个临时对象,设计上都需要提供的话,就应该在独身形式(op)内部调用复合形式(op=),并以返回计算表达式,以协助返回值优化,避免临时对象的产生;且这样只需维护复合形式(op=)
//技巧:在全局结合template定义operator独身形式,省去单独编写类型独身形式(op)的函数 |
Author: LYJ
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles
2025-10-15
01-区别指针和引用
第一章,基础议题条款1 仔细区别Pointers和References指向指定的对象,且之后不切换指向其他对象,且操作符重写需要时使用References,反之使用Pointers,且使用References不需要检测是否为null ...
2025-10-16
02-最好使用C++转型操作符
第一章,基础议题条款2 最好使用C++转型操作符强制转换带来的问题: (1)直接将任意类型转为其他任意类型,意图不明确且显得拙劣,如:将基类类型转为派生类类型,或者将常量类型转为非常量类型,但仅仅通过小括号强转并不能很好的表明意图 (2)强转使用小括号来实现,但小括号在编码中使用到的地方很多,很难直接一眼看出有哪些是类型转换,哪些又是函数调用等使用到小括号的地方,这显得很不专业 使用C++转型操作符: 为解决强转带来的问题,C++导入了4个新的转型操作符: (1)static_cast (2)const_cast (3)dynamic_cast (4)reinterpret_cast 与C强制转换的比较C++转型操作符基本拥有强转一样的威力和意义,以及相同的限制,如: 不能将double转为pointer,或者将struct转为int; static_cast不能移除常量性,因为专门有const_cast来负责 C++转型操作符的使用: (1)C++转型操作符更加集中他们自己负责的转型内容,const_cast只负责将类型转为常量或者非常量,其他的并不关注,如果被用于这个场景之外...
2025-10-19
05-对定制的“类型转换”函数保持警惕
第二章,操作符条款5 对定制的“类型转换”函数保持警惕描述自定义隐式类型转换函数,易导致代码行为异常、编译歧义,非必要不使用,使用时需严格限制。 一、两类隐式类型转换的来源1、转换运算符格式:operator 目标类型() const;,将类对象隐式转为目标类型。 class Rational {public: int n, d; operator double() const { return (double)n/d; } // Rational→double};Rational r(1,2);double x = r * 2.0; // 自动转换为double运算 2、单参数构造函数含默认参数的多参构造也归为此类,允许参数类型隐式转为类对象。 class Rational {public: Rational(int n, int d=1) : n(n), d(d) {} // int→Rational};Rational r1(1,2);Rational r2 = r1 + 5...
2025-10-17
03-不要以多态方式处理数组
第一章,基础议题条款3 不要以多态方式处理数组问题场景描述(1):在C++中,可以通过指向基类的指针来操作派生类对象,这个指针就好像有多重类型一样,原著笔者在这里称将其也称为多态,这种多态操作方式应该避免数组操作,概括一下是因为基类和派生类的成员很可能是不一样的,这也就意味着他们的对象大小是不一样的,而数组arr[i]的调用就相当于*(arr+i*sizeof(object)),这个i的步进值取决于元素的大小,因此会引发“未定义”错误 class BST{...};class BalancedBST : public BST{...};void printBSTArray(ostream& s, const BST array[],int numElements){ for(int i = 0; i < numElements; i++) s << array[i];}BST BSTArray[10];printBSTArray(BSTArray);//All Right!Bala...
2025-10-18
04-非必要不提供 default constructor
第一章,基础议题条款4 非必要不提供 default constructor描述凡是可以“合理无中生有”的对象类型应该有默认构造,反之如果存在没有外来信息就无法正常初始化的对象,就应该禁止默认构造; 一、没有默认构造的使用限制_1: 由于没有默认构造函数,将无法产生对应类型对象构成的数组 class EquipmentPiece{public: EquipmentPiece(int IDNumber);//定义了构造函数,编译器将不再生成默认构造函数 ...}EquipmentPiece bestPieces[10];// 错误,无法调用EquipmentPiece的构造函数EquipmentPiece *bestPieces = new EquipmentPiece[10];// 错误 有3个方法可以解决无默认构造无法产生数组的问题: 1、使用non-heap 数组,于是便能够在定义数组时提供必要的自变量:int ID1,ID2,ID3,...,ID10;...EquipmentPiece bestPieces[] = { Equipm...
2025-10-20
06-区别increment与decrement操作符的前置和后置形式
第二章,操作符条款6 区别increment与decrement操作符的前置和后置形式描述重载操作符++和- -有前置式和后置式,主要通过后置式在参数中写有int自变量来做区分 class UPInt{public: UPInt& operator++(); //前置 ++ const UPInt operator++(int);//后置 ++ UPInt& operator--(); //前置 -- const UPInt operator--(int); //后置 -- UPInt& operator+=(int);// +=操作符,结合UPInts和ints};UPInt i;++i; //i.operator++();i++; //i.operator++(0);--i; //i.operator--();i--; //i.operator--(0); 前置式与后置式重载的实现前置式的意义:increment and fetch 累加然后取出; 后置式的意义: fetch and increment...
Announcement
This is Seagull Blog
Contents
Post Series
