<More Effective C++>笔记--运算符

来源:互联网 发布:ubuntu改变系统语言 编辑:程序博客网 时间:2024/06/09 16:55

2 运算符
~~~~~~~~~

2.1 谨慎定义类型转换函数
=========================
   1. 有两种函数允许编译器进行隐式类型转换:
      * 单参数构造函数(包括除了第一个参数,所有参数都有缺省值得情况)
      * 隐式类型转换运算符
        隐式类型转换运算符只是一个样子奇怪的成员函数:operator 关键字,其后跟一个类型符号。你不用定义函数的返回类型,因为返回类型就是这个函数的名字。
   2. explicit关键字,只会拒绝隐式类型转换而调用构造函数。显式类型转换依然合法。
   3. 隐式类型转换只会转换一次,即不会A转成B再转成C
 

  1. struct B 
  2.     B(int){}; 
  3. }; 
  4. struct D2 
  5.     D2(B ){}; 
  6. }; 
  7. void test(D2) 
  8.     cout<<"D2 created"<<endl; 
  9. int main() 
  10.     test(1);  //编译出错,不能int->B->D2 



2.2 区别自增和自减operator的前置和后置形式
===========================================
   1. 前置operator不带参数,而后置operator带一个int参数,在调用时,编译器自动赋值为0
   2. 前置返回一个reference,而后置返回一个const对象(主要是为了防止i++++能够编译通过,而且i只增加一次,不合逻辑)
   3. 后置式operator的实现应该以前置式operator为基础。

2.3 千万不要重载&&,||和,操作符(因为你永远无法模拟它们)
==========================================================
   1. C++对&&和||采取“骤死式”的评估方式。
      然而当重定义这些运算符时,“函数调用语义”会取代“骤死式语义”。
      “函数调用语义”意味着:所有参数都必须评估完成,各参数评估的次序未知
   2. C++对,的评估方式为:逗号左边会先评估,然后逗号的右边再被评估,最后整个逗号表达式的结果以逗号右边的值为代表。

2.4 了解不同意义的new和delete
==============================
   1. new operator(也叫new表达式)和operator new是不同的
      A* a = new A(),这里的new是new operator,它是C++内置的,你不能改变它的意义(无法重载),它总是先分配足够内存然后调用构造函数初始化内存中的对象。
      new operator调用operator new来完成第一部分内存的分配步骤,operator new能够被重载
   2. 当调用new operator来分配数组时,就不是调用operator new来分配内存,而是调用operator new[]来分配内存
   3. operator new通常声明为void* operator new(size_t size);这里返回类型为void*因为函数返回的是一个未初始化内存的指针。
      你能够增加额外的参数重载函数operator new,但是第一个参数类型必须是size_t
   4. delete operator和operator delete也是类似的不同。
 

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1162476

0 0