一.让自己习惯c++

让自己习惯C++

01.视c++为一个语言联邦

  • C

  • Object-Oriented C++

  • Template C++

  • STL

    C++ 高效编程守则视状况而变化,取决于你使用C++的哪个部分

02.尽量以const, enum, inline 替换#define (以编译器替换预处理器)

  • 对于单纯常量,最好以const对象或是enums替换#defines
  • 对于形似函数的宏(macros), 最好改用inline函数替换#defines

03.尽可能使用const

  • 如果关键字const 出现在星号左边,表示被值物为常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量.

    • 如果被指物是常量,可以将const写在类型前面,亦可以写在类型之后,星号之前.

      void f1(const Widget* pw);
      void f2(Widget const * pw);  // 函数获得一个指针,指向一个常量的Widget对象
      
    • STL迭代器的作用就像个T*指针,声明迭代器为const就像声明指针为const一样(即声明一个T * const 指针),表示这个迭代器不得指向不同的东西,但他指向的值是可以改动的.

      std::vector<int> vec;                                
      const std::vector<int>::iterator iter=vec.begin();   // iter的作用就像T* const
      *iter = 10;                                          // 没问题,改变iter所指物
      ++iter;                            // 错误,iter是const
      
    • 如果希望迭代器所指的东西不可被改动(const T*), 需要的是const_iterator:

    • std::vector<int>::const_iterator cIter = vec.begin(); // cIter的作用像个const T*
      *cIter = 10;                                          // 错误,*cIter是const
      ++cIter;                                              // 没问题,改变cIter.
      

      **注意: **

      • 将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体.
      • 编译器强制实施bitwise constness, 但你编写程序时应该使用"概念上的常量性"
      • 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复.

    04.确定对象被使用前已先被初始化

    • 永远在使用对象之前先将它初始化,对于无任何成员的内置类型,你必须手动完成此事.

      int x = 0;
      const char* text = "A C-style string";
      
      double d;
      std::cin >> d;
      
    • 对于内置类型意外的任何其他东西,初始化的责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化.

    • **注意: **

      • 为内置型对象进行手工初始化,因为C++不保证初始化它们.

      • 构造函数最好使用成员初值列表,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同.

      • 为免除"跨编译单元值初始化次序"问题,请以local static对象替换non-local static对象.

原文地址:https://www.cnblogs.com/o-v-o/p/10156522.html