1,让自己习惯C++

来源:互联网 发布:godaddy和阿里云 编辑:程序博客网 时间:2024/06/05 11:00

条款01:视 C++ 为一个联邦语言

    可将 C++ 分为四个部分:

                     1,C                                               C 部分

                     2,Object-Oriented C++             面向对象部分

                                             封装,继承,多态,virtual 函数,等等

                     3,Template C++                         C++ 模板部分

                     4,STL                                            标准模板库部分

                                              容器,算法,迭代器,函数对象,等

——————————————————————————————————————————————

条款02:尽量以 const, enum, inline 替换 #define

// 如:#define A 1.65  //记号 A 也许从为被编译器看见,于是记号 A 有可能没进入符号表,当发生某些错误时,不易找到错误的所在//所以应该用以下形式const double A = 1.65 ;    //这时 A 肯定能被编译器看见,也能进入符号表//第一种情况//当在头文件中定义字符串常量时,有必要写成下面形式const char * const Name = "abc";//因在 C++ 中,string 类 比 char * 更好 ,所以可以写成下面形式const std::string Name("abc");//第二种情况//class 专属常量,为了让常量的作用域限制在类内,必须将它声明为一个成员,为确保此常量只有一份实体,必须声明为 static 成员class A{     static const int A_a ;  //这里只可声明,不可赋初值     int num[A_a];           //使用该常量}const int A::A_a = 5;        //在实现文件内定义 class 的 static 常量成员//也可以使用 enum, 如下class A{    private:         enum { A_a = 5 };   //A_a成为 5 的一个记号名称         int num[A_a];       //使用 A_a}

*对于单纯常量,最好以 const 对象或 enum 替代 #define

*对于形似函数的宏,最好用 inline 函数来替换 #define

——————————————————————————————————————————————————————————————————

条款03:尽可能使用 const

const 允许指定一个语句约束,它告诉编译器和其他程序员某只应该保持不变。

// 多才多艺的 constchar greeting[] = "Hello" ;char *p = greeting;                   //non-const pointer,non-const dataconst char *p = greeting;             //non-const pointer,const datachar const *p = greeting;             //non-const pointer,const datachar * const p = greeting;            //const pointer, non-const dataconst char * const p = greeting;      //const pointer,const datachar const * const p = greeting;      //const pointer,const data
const 用于迭代器的情况如下:
//std::vector<int> vec;const std::vector<int>::interator iter = vec.begin(); //指针不变*iter = 10; //没问题iter++;     //错——————————————————————————————————std::vector<int>::const_interator iter = vec.begin(); //指针指向的内容不变*iter = 10; //错iter++;     //没问题
const 用于函数的情况
//重载运算符时,返回 const 类型class A{};const A operator*(const A &lhs, const A &rhs); //可防止这种情况:if (a * b = c),此时编译器会报错                                               //而我们的本意是:if (a * b == c)
const 成员函数

//const 成员函数的两个好处://1,使class接口比较容易理解,可让我们得知那个函数可以改变对象,哪个函数不可以//2,可以操作 const 对象
条款04:确定对象在被使用前已被初始化

//对于内置数据类型,必须手工初始化,如:int i = 10;const char *p = "hello";————————————————————————————————————————————————//对于类,初始化落在构造函数身上//所以要确保每一个构造函数都将对象的每一个成员初始化//重要的是不要混淆了赋值和初始化
对于大多数类而言,比起先调用default构造函数然后再调用copy assignment 操作符,单只调用一次copy构造函数式比教高效的,有时候高效的多,

所以在编写累的构造函数时,最好使用成员初始化列表的方式,而不写在构造函数的函数体内,这样效率更高。

若成员变量是 const 或 引用就必须使用初始化成员列表

规则:任何时候都使用初始化成员列表,不再构造函数的函数体内赋初值!!

C++有着十分固定的“成员初始化次序”,base_classes 要早于derived_classes 被初始化,而class的成员变量,总是以其声明的次序被初始化。

---static 对象

所谓 static 对象,其寿命从被构造出来到程序结束为止。这种对象包括:

  1,global 对象

  2,定义域namespace 作用域内的对象

  3,在class内,以及函数内,和 file 文件作用域内的被声明为 static 的对象。

程序结束时,他们会被他们的析构函数销毁。

为避免“跨编译单元之初始化次序”的问题,请以local static 对象替换non-local static 对象。


0 0
原创粉丝点击