zoukankan      html  css  js  c++  java
  • Effective C++ 学习笔记[2]

    2. 第一节 习惯C++

    2.1 C++是一个语言联邦,包括以下四个部分:

      C:包括区块、语句、预处理器、内置数据类型、数组、指针等,但是C语言本身存在局限:没有模板template、没有异常exception、没有重载overloading…….

      Object-oriented C++: 这部分主要就是C with classes.是面向对象设计的古典守则在C++上最直接实施。包括类(构造函数、析构函数)、封装、继承、多态、virtual虚函数等等。

      Template C++: 这部分是C++泛型编程的部分。

      STL:STL是一个template程序库。

    2.2尽量以const、enum,inline 替换#define

    本规则大致意思就是:宁可以编译器替换预处理器,因为#define不被视为语言的一部分,在预处理阶段就已经处理好了。例如:

    #define ASPECT_RATIO 1.63

    也许在编译器处理源码之前,ASPECT_RATIO 就已经被预处理器移走了,于是ASPECT_RATIO 名称可能没有进入记号表symbol table,于是当运用此常量但获得一个编译错误信息时,可能会带来困惑,因为这个错误信息提到的是1.63而不是ASPECT_RATIO ;而加入ASPECT_RATIO 被定义在一个非你所写的头文件内,你肯定对1.63以及它来自何处毫无概念,于是将会因为追踪他而浪费时间。

    一个可行的代替方式是:

    const double AspectRatio = 1.63;

    作为一个语言常量,AspectRatio肯定会被编译器看到,当然就会进入记号表内部。

    2.3 尽可能使用const

    (1)关于const 在不同位置所代表的不同含义:

    0)ONZUD5QXCR1RRYWSES5`C

    事实上这个概念都有只是三种声明方式非常相似:
    Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 
    把一个声明从右向左读。 
    char * const cp; ( * 读成 pointer to ) cp is a const pointer to char 
    const char * p; p is a pointer to const char; 
    char const * p; 同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。 


    C++标准规定,const关键字放在类型或变量名之前等价的。
    const int n=5; //same as below
    int const m=10
    结论:
    char * const cp     : 定义一个指向字符的指针常数,即const指针
    const char* p       : 定义一个指向字符常数的指针
    char const* p       : 等同于const char* p

    2.4 const修饰数组

     //直接声明为 int a[], 这样会允许函数内部对a[] 进行修改

    void showTheWorld( int a[], int sizeOfa) { 
     for ( int i = 0; i < sizeOfa; i++) 
     cout << a[i] << " "; 
     cout << endl; 
     }
    

     如果 声明为const int a[], C++就不允许函数内部在对a[] ,进行修改了

    void showTheWorld( const int a[], int sizeOfa) 
     { 
     cout << "The array contains the following values:
    "; 
     for ( int i = 0; i < sizeOfa; a[i]++) // a[i]++ 会改变a[] l里面的每个项加1;因为声明了const int  a[] ,这样编译器就会报错
    cout << a[i] << " "; 
     cout << endl; 
     } 
    
    double computeAverage( int a[], int numberUsed); //声明一个参数 int a[] 不为const
    
    void showDifference( const int a[], int numberUsed) 
     { 
       double average = computeAverage(a, numberUsed);  //调用computeAverage,编译器会认为computeAverage会改变a[] 数组,这与showDifference参数矛盾,报错                                             
    for ( int index = 0; index < numberUsed; index++) cout << a[index] << " differs from average by " << (a[index] – average) << endl; } //computeAverage 应该定义成 double computeAverage( const int a[], int numberUsed);

     总结说明:

        const char* g_str = "123456" 与 const char g_str[] = "123465"是不同的, 前面那个const 修饰的是g_str指向的内容是不能变化的,但是指针g_str本身并不是常量;但是const char g_str[] = "123465"表示g_str[]数组本身是const的。

       在定义const的全局常量时,如果你像让char *g_str遵守const的全局常量的规则,最好这么定义const char* const g_str="123456",或者定义为const char g_str[] = "123465"。

  • 相关阅读:
    【BZOJ 2324】 [ZJOI2011]营救皮卡丘
    【BZOJ 2809】 [Apio2012]dispatching
    网络流小结
    复活
    终结
    11.7模拟赛
    codevs 2173 忠诚
    P3386 【模板】二分图匹配
    Leetcode 大部分是medium难度不怎么按顺序题解(上)
    ATP的新博客!
  • 原文地址:https://www.cnblogs.com/jiayouwyhit/p/3222461.html
Copyright © 2011-2022 走看看