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

<<Effective C++>>笔记1

2012-12-21 09:31 555 查看
Chapter 1

Item 1: Rules for effective C++ programming vary, depend on the part of C++ you are using.

C++共分为四个部分:C、Object-Oriented C++、Template C++、STL

Item 2: 1、For simple constants, prefer const object or enum to #define.

2、For function-like macros, prefer inline functions to #define.

#define只是简单的宏展开而不进行类型检查。

Item 3: 1、Declaring something const helps compilers detect usage errors. const can be applied to objects at any scope, to function parameters and return types, and
to member functions as a whole.

2、Compilers enforce bitwise constness, but you should program using conceptual constness.

就是该复制一个对象的所有内容,并且需要注意的是逻辑不变性,而非字节不变性。

3、When const and non-const member functions have essentially identical implementations, code duplication can be avoided by having the non-const version call
the const version.

Item 4: 1、Manually initialize objects of built-in-type, because C++ only sometimes initializes them itself.

养成对内置类型手工初始化的习惯,因为读未定义的变量会导致未定义的行为。这里和Perl不同Perl语言中有单独的undef类型,而C++是没有的,虽然在某些上下文中变量未定义被默认为0,但是存在特殊的情况,所以还是手工对所有变量进行初始化为好。

2、In a constructor, prefer use of the member initialization list to assignment inside the body of the constructor. List data members in the initialization
list in the same order they are declared in the class.

C++规定对象的数据成员需要在进入构造函数之前初始化。构造函数中的是赋值而不是初始化。而初始化成员列表在构造函数之外,所以初始化成员列表时初始化而不是赋值。并且应用初始化成员列表的效率是要高于构造函数的。因为构造函数之中是赋值,对于非内置类型(对于内置类型是没有区别的)需要先启用默认构造函数对数据成员进行初始化,之后调用构造函数对数据成员进行赋值。并且有时候是必须应用初始化成员列表进行初始化的,例如数据成员是const或者是reference。因为引用本来就是const,引用一旦指向某个对象(初始化)就不可以再改变指向另外一个对象,其实引用可以看做const指针。为了避免记忆,尽量都用初始化成员列表。并且自定义的类型如果有默认构造函数的时候就是可以直接写入初始化成员列表的。

3、Avoid initialization order problems across translation units by replacing non-local static objects with local static objects.

C++以源文件为编译单元,而各编译单元(可能是不同人在不同时间写的)中的非局部静态变量的初始化顺序是未定义的。因为定义不同编译单元的初始化顺序是不可能的。

将非局部静态变量改变为局部静态变量的方式就是定义一个返回静态变量类型的引用的函数,函数中只有两条语句,第一条定义局部静态变量(因为是静态变量,所以下次再调用这个函数的时候就不再定义了),第二条语句就是返回该局部静态变量。

例如:className& static_object(){

static className object;

return object;

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