c++ primer 5th 笔记:第二章

第二章:变量和基本类型c++

  笔记:express

    1. c++语言规定一个int至少和一个short同样大,一个long至少和一个int同样大,一个long long至少和一个long同样大。其中,数据类型long long是在c++11中新定义的。安全

    2. 执行浮点运算选用double,这是由于float一般精度不够并且双精度浮点和单精度浮点数的计算代价相差无几。函数

    3. 切勿混用带符号类型和无符号类型。其中,带符号数会自动地转换成无符号数。spa

    4. 转义序列以反斜线做为开始,如\n、\t、\"、\'。也可使用泛化的转义序列,如\7(响铃)、\12(换行符)、\x4d(字符M)。形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字。参考ASCII码。指针

    5. 指定字面值的类型,如L'a'(类型是wchar_t)、u8"hi!"(utf-8字符串字面值)、1E-3F(单精度浮点型字面值,类型是float)。c++11

    6. c++语言中,初始化和赋值时两个彻底不一样的操做code

    7. c++11新标准中,用花括号来初始化变量获得了全面应用,被称为列表初始化(list initialization)。这种初始化有一个重要特色:若是咱们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错。如:对象

    long double ld = 3.1415926536;
    int a{ld}, b = {ld};   //错误:转换未执行,由于存在丢失信息的危险
    int c(ld), d = ld;        //正确:转换执行,且确实丢失了部分信息

    8. 定义在函数体内部的内置类型将不被初始化(uninitialized)。blog

    9. 建议初始化每个内置类型的变量。

    10. c++支持分离式编译,即容许将程序分割为若干个文件,每一个文件可被独立编译

    11. 声明使得名字呗程序所知,而定义会申请存储空间,还可能为变量赋一个初始值。只声明用关键字extern。

    extern int i;   // 声明i而非定义i
    int j;             // 声明而且定义j
    extern double pi = 3.1415;  //定义

    12. 变量能且只能被定义一次,可是能够被屡次声明。

    13. (a)做用域分为全局做用域块做用域,定义于main函数以外变量具备全局做用域。(b)做用域能彼此嵌套,被包含的做用域称为内层做用域(inner scope),包含着别的做用域的做用域称为外层做用域。(c)做用域中一旦声明了某个名字,它所嵌套着的全部做用域中都能访问到该名字。(d)同时,容许内层做用域中从新定义外层做用域中已有的名字,来覆盖外层名字。而在内层做用域中能够用::reused来访问外层名字。

    14. 定义引用时,程序把引用和它的初始值绑定(bind)在一块儿,而不是将初始值拷贝给引用,并且引用只能绑定在对象上,引用即别名

    15. 空指针(null pointer)用NULL、0、nullptr来表示,字面值nullptr是新标准刚引入的一种方法。最好使用nullptr。

    16. 引用自己并不是是一个对象,而指针是一个存储地址的对象

    17. 类型别名(type alias)是一个名字,它是某种类型的同义词。用关键词typedef。新标准规定一种新方法,使用别名声明(alias declaration)来定义类型别名。关键字using。如:

      typedef double wages;
      typedef wages base, *p;   // p是double*的同义词
      using SI = Sales_item;     // SI是Sales_item的同义词

      类型别名重难点理解:

      typedef char *pstring;
      const pstring cstr = 0;   // cstr是指向char的常量指针,顶层const
      const pstring *ps;         // ps是一个指针,它指向的对象是指向char的常量指针

    18. c++11新标准引入了auto类型说明符,用它就能让编译器替咱们去分析表达式所属的类型。由于编译器经过初始值推断出变量的类型,因此auto定义的变量必须有初始值

    19. c++11新标准引入另外一种类型说明符decltype,它的做用是选择并返回操做数的数据类型,编译器分析表达式并获得它的类型,却不实际计算表达式的值。如:

      decltype(f()) sum = x;

    20. c++11新标准规定,能够为类中数据成员提供一个类内初始值(in-class initializer)。如:

    struct Sales_data
    {
        std::string bookNo;
        unsigned units_sold = 0;
        double revenue = 0.0;
    };

    21. 类一般被定义在头文件中,并且类所在头文件的名字应与类名字同样。

    22. 确保头文件屡次包含仍能安全工做的经常使用技术是预处理器(preprocessor),如:

    #ifndef  SALES_DATA_H
    #define SALES_DATA_H
    #include <string>
    struct Sales_data
    {
        std::string bookNo;
        unsigned units_sold = 0;
        double revenue = 0.0;
    };
    #endif            

    23. 一般将头文件中类的名字来构建保护符的名字,以确保惟一性,且名字所有大写

  重点知识点总结:

  待补充知识点:decltype类型指示符。  

  c++中const限定符

    1. 容许一个常量的引用半丁很是量的对象、字面值,甚至是一个通常表达式。

    2. 容许另外一个指向常量的指针指向一个很是量。

    3. 顶层const表示指针自己是一个常量,而名词底层const表示指针所指的对象时一个常量。

    4. 底层cosnt的限制不能忽视,拷贝时,对象必须具备相同的底层const资格或者两个对象的数据类型必须可以转换,通常来讲,很是量能够转换为常量,反之不行。

    如:

    /* 范围1
    cosnt int ci = 1024;
    const int &r1 = ci;    //正确:引用机器对象都是常量
    r1 = 41;      //错误:r1是对常量的引用
    int &r2 = ci;    // 错误:试图让一个很是量引用指向一个常量对象
    */

    /*范围2
    int i = 42;
    const int &r1 = i;    //正确(经常使用):容许将const int& 绑定到一个普通int对象上
    const int &r2 = 42;    // 正确:r2是一个常量引用;编译器会将其绑定到一个临时对象上
    const int &r3 = r1 * 2;    //正确:r3是一个常量引用
    int &r4 = r1 * 2;    // 错误:r4是一个普通的很是量引用
    */

    /*范围3
    int i = 0;
    int *const p1 = &i;   // 不能改变p1的值,这是一个顶层const
    const int ci = 42;     //  不能改变ci的值,这是一个顶层const
    const int *p2 = &ci;  // 容许改变p2的值,这是一个底层const
    const int *const p3 = p2;  //靠右的const是顶层const,靠左的是底层const
    const int &r = ci;     // 用于声明引用的const都是底层const

  术语

    转义序列(escape sequence)、类型说明符(type specifier)、做用域(scope)、复合类型(compound type)、

    引用(reference)、预处理变量(preprocessor variable)、常量表达式(const expression)、类型别名(type alias)、

    预处理器(preprocessor)、头文件保护符(header guard)。

    术语解释:

    常量表达式(const expression):指值不会改变而且在编译过程就能获得计算结果的表示式。

                                                 2016-10-25 19:32:34

相关文章
相关标签/搜索