• EC读书笔记系列之1:条款1、条款2、条款3


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

    记住:

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

        C;

        Object-oriented c++;

        Template c++;

        STL

    条款2:尽量以constenuminline替换#define

    记住:

      ★对于单纯常量,最好以const对象或enums替换#define

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

     ------------------------------------------------------------------------------------------------------

    延伸:面试时经常会被问到的一个典型问题是:参数宏与函数的区别,我想可以从如下几个角度来回答:

      a 函数调用要先求出实参表达式的值,然后代入形参;宏只是字符替换;

      b 宏替换只占编译时间;函数调用占运行时间;

      c 函数运行时可调试,宏不可;

      d 函数会做参数类型检查,宏不会;

      e 使用宏次数多时宏展开后源程序变长;函数调用不会;

    条款3:尽可能使用const

    记住:

      ★将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体

      ★编译器强制实施bitwise constness,但你写程序时应使用“概念上的常量性”(conceptual constness)

      ★当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复

    ----------------------------------------------------------------------------------------------------------------------

    1 一条规则:

      const出现在*左,表示被指物是常量: const int *p = NULL;

                   *右,  指针自身是常量:int *const p = NULL;

                   *两边,  两者都是常量:const int *const p = NULL;

      对于被指物是常量的情形,const 写在类型前后无关:const int *p 等价于 int const *p

    2 STL迭代器中const的用法:

      迭代器自身是const的用法:  const std::vector<int>::iterator iter = vec.begin();

                    *iter = 10; //可以,改变iter所指之物

                    ++iter; //错误,iter自身是const

      迭代器所指之物是const的用法:std::vector<int>::const_iterator cIter = vec.begin();

                    *cIter = 10; //错,*cIter是const

                    ++cIter; //没问题,cIter本身可以变化

    3 const成员函数

        将const实施于成员函数的目的是为了确认该成员函数可作用于const对象身上。这类成员函数重要的两个原因:

      一、使class接口较容易被理解。因为可得知哪个函数可改动对象内容而哪个不行很是重要;

      二、使“操作const”对象成为可能。

    4 bitwise constness(或physical constness)和logical constness

      利用mutable可释放掉non-static成员变量的bitwise constness约束

    5 constnon-const成员函数中避免重复

      利用const成员函数实现出其non-const成员函数:举例:

        

     1 class TextBlock {
     2     ...
     3     const char& operator[]( std::size_t position ) const {  //const版本
     4         ...
     5         ...
     6         ...
     7         return text[position];
     8     }
     9     
    10     char& operator[]( std::size_t position )  { //用const实现的non-const版本
    11     
    12         return
    13             const_cast<char&>(
    14             
    15                 static_cast<const TextBlock&>(*this)[position] //转换后调用const版[]
    16             );
    17     }
    18     
    19     ...
    20 }

    理解:这份代码有两个转型动作

      一、将*this从其原始类型TextBlock&转型为const TextBlock&(这使得接下来调用operator[]时得以调用const版本成员函数)

      二、从const operator[]的返回值中移除const

    最后需要注意:non-const成员调用const成员可以,但反之不行!!!

  • 相关阅读:
    fake data
    template 的简单使用
    computed what time passage pushed-
    drag And drop
    threeJs(1)
    使用babel
    PHP海补知识(2)-- 复合赋值操作
    PHP海补知识(1)-- 可变变量
    一个裸的Ubuntu系统,搭建LAMP需要配置这些东西
    Ubuntu Server 12.04 U盘启动盘打包
  • 原文地址:https://www.cnblogs.com/hansonwang99/p/4915635.html
Copyright © 2020-2023  润新知