<More Effective C++>笔记--运算符
2015-05-26 07:29
337 查看
2 运算符
~~~~~~~~~
2.1 谨慎定义类型转换函数
=========================
1. 有两种函数允许编译器进行隐式类型转换:
* 单参数构造函数(包括除了第一个参数,所有参数都有缺省值得情况)
* 隐式类型转换运算符
隐式类型转换运算符只是一个样子奇怪的成员函数:operator 关键字,其后跟一个类型符号。你不用定义函数的返回类型,因为返回类型就是这个函数的名字。
2. explicit关键字,只会拒绝隐式类型转换而调用构造函数。显式类型转换依然合法。
3. 隐式类型转换只会转换一次,即不会A转成B再转成C
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
~~~~~~~~~
2.1 谨慎定义类型转换函数
=========================
1. 有两种函数允许编译器进行隐式类型转换:
* 单参数构造函数(包括除了第一个参数,所有参数都有缺省值得情况)
* 隐式类型转换运算符
隐式类型转换运算符只是一个样子奇怪的成员函数:operator 关键字,其后跟一个类型符号。你不用定义函数的返回类型,因为返回类型就是这个函数的名字。
2. explicit关键字,只会拒绝隐式类型转换而调用构造函数。显式类型转换依然合法。
3. 隐式类型转换只会转换一次,即不会A转成B再转成C
struct B { B(int){}; }; struct D2 { D2(B ){}; }; void test(D2) { cout<<"D2 created"<<endl; } int main() { 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
相关文章推荐
- &lt;More Effective C++&gt;笔记--其他杂项
- &lt;More Effective C++&gt;笔记--技巧
- &lt;More Effective C++&gt;笔记--异常
- <<More Effective C++>>笔记C++技巧1
- <<Effective C++>>笔记5
- &lt;More Effective C++&gt;笔记--基础
- <<Effective C++>>笔记1
- <<Effective C++>>笔记3
- <More Effective C++>笔记--运算符
- <C++学习笔记一>——多继承
- <Effective C++>读书笔记-2
- <Effective C++>读书笔记-5
- <C++学习笔记>预处理功能
- <<c++ primer>> 函数指针的笔记
- <Effective C++>读书笔记-4
- <<More Effective C++>>读书笔记2: 运算符
- <C++学习笔记>函数模板 template
- &lt;Effective STL&gt;笔记--仿函数
- <Effective C++>读书笔记-6
- <Effective C++>读书笔记-7