您的位置:首页 > 编程语言 > C语言/C++

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

2015-05-26 07:29 337 查看
2 运算符

~~~~~~~~~

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: