chapter-2

C++ Primer第二章!

#include "stdafx.h"
#include

using namespace std;

int main()
{
    bool bl = true;
    char c = 'c';           //与机器字节一样,大多数机器字节由8比特构成。
    wchar_t wc = 'c';
    char16_t c16 = 'c';     //为Unicode字符集服务。可以储存unicode的字符,而char也只能储存ANSI字符!
    char32_t c32 = 'c';     //为Unicode字符集服务。
    short st = 1;
    int it = 1;
    long lt = 1;
    long long llt = 1;
    float ft = 0.1;         //1字节表示,7个有效位。
    double dt = 0.1;        //2字节表示,16个有效位。
    long double ldt = 0.1;

    //应该避免混用带符号类型和无符号类型!在无符号类型进行减法运算时,应该保证不为负数!
    unsigned char i1 = -1;
    cout << int(i1) << endl;        //unsigned char,赋值-1,所得结果为255。10000001原码-11111110反码-11111111补码

    unsigned u2 = 10;
    int i2 = -42;
    cout << i2 + i2 << endl;
    cout << u2 + i2 << endl;            //int值转换为无符号值,导致异常结果

    unsigned u3 = 42, u4 = 10;
    cout << u3 - u4 << endl;
    cout << u4 - u3 << endl;            //必须确保无符号变量不可能为负值,否者会导致未知错误,当应用于循环时尤其注意。
    
    //初始化不是赋值,初始化是创建变量时赋予一个初始值,而赋值是把对象的当前值擦除并以一个新值取代。
    int i3 = 1;
    int i4(1);
    int i5 = { 0 };                     //列表初始化,C11新规定。列表初始化,当发生精度损失时,会报告错误!
    int i6{ 0 };

    double pi = 3.1415926;
    int i7 = pi;
    //int i8{ pi };                     //当初始值存在丢失信息时,使用列表初始化会报错!

    //在函数体内部的内置类型变量不被默认初始化,其变量值是未定义的;在函数体之外的变量被初始化为0。所以,显示初始化变量是非常必要的!
    //每个类决定其初始化对象方式,例如string默认初始化为空串。由类的默认构造函数决定!

    //变量的命名规范:标识符要体现实际含义;变量名一般用小写字母;用户自定义的类名用大写字母开头;如果标识符由多个单词组成,则单词间应有明显区分。

    int ival = 1024;
    int &refVal = ival;             //引用,即对象别名,程序将引用和它的初始值绑定。引用必须被初始化!
    int *pVal = &ival;              //指针,指针本身就是一种对象。但是也建议进行空指针初始化!
    cout << refVal << " " << *pVal << endl;

    //空指针,注意不能把int变量直接赋给指针。
    int *p1 = nullptr;//c++推荐方式!
    int *p2 = 0;
    int *p3 = NULL;

    //void*指针
    void *p4;
    //int *p5 = static_cast(p4);//强制类型转换。

    //指向指针的指针
    int ival2 = 1024;
    int *p_ival2 = &ival2;
    int **pp_ival2 = &p_ival2;
    cout << ival2 << "-" << *p_ival2 << "-" << **pp_ival2 << endl;

    //指针是对象,所以有引用
    int ival3 = 1024;
    int *pi_ival3 = &ival3;
    int *&r_p_ival3 = pi_ival3;

    //const限定符,指向常量的引用
    const int ival3 = 1314;             //cosnt对象创建时必须初始化!
    const int ival4 = ival2;            //利用一个对象去初始化const对象。
    //extern const int ival5 = 1024;        //如果想在多个文件之间共享const对象,必须在对象定义时加上extern。
    const int &r_ival3 = ival3;         //cosnt常量引用,引用ival3对象。常量引用绑定非常量对象、字面值;非常量引用不允许绑定常量对象。

    //指向常量的指针
    const int *p_ival3 = &ival3;        //类似于指向常量的引用。
    //常量指针,即指针对象地址不能修改。
    int *const pp_ival3 = &ival3;       //指针将一直指向ival3.
    //指向常量的常量指针
    const int *const ppp_ival3 = &ival3;

    //顶层const和底层const
    //顶层const表示(指针)本身是个常量;底层const表示指针所指的对象是一个常量。
    //const(底层) int *const(顶层) pp_ival3 = &ival3;

    //常量表达式:值不会改变并且在编译过程就能得到计算结果。
    const int ival6 = ival3 + 520;
    //将变量声明为constexpr,便由编译器来验证变量是否是一个常量表达式。
    constexpr int ival7 = 520;      //如果确定变量为常量,则就把它声明为constexpr。
    //算术类型、应用和指针都是字面值类型,可以被定义为constexpr;而自定义类型string则不能!
    constexpr int *q = nullptr;     //如果constexpr定义指针,将所定义的对象置为顶层const。

    //类型别名
    typedef double wages;       //wages是double的同义词,p是double*的同义词。
    using uwages = wages;       //C++新的规定,别名声明
    typedef wages *p;

    //auto类型说明符,通过初始值来推算变量的类型
    auto ai = 1;
    //auto一般会忽略掉顶层const,如果希望推断顶层const,则需要明确指出
    const auto cai = 2;
    //还可以将引用的类型设为auto,此时顶层常量属性仍然保留
    auto &rai = ai;

    //decltype类型指示符,返回操作数的数据类型,包括顶层const和引用在内。即推断指针为引用,推断函数为函数类型!
    decltype(ai) dai = 2;
    //特别用法
    int di = 1, *dpi = &di, &dr = di;
    decltype(dr + 0) b;     //返回类型为int
    decltype(*dpi) dc = dr; //返回类型为int&
    decltype((di)) drr = dr;//双括号的结果永远是引用

    //自定义数据结构
    class Sales_data
    {
        string bookNo;
        unsigned units_sold = 0;            //类内初始值,推荐使用值初始化。
        double revenue = 0.0;
    };

    Sales_data data1, data2;                //类通常被定义在头文件中,而类所在头文件的名字应与类的名字一样。

    //头文件保护符,避免头文件被多次包含,从而导致重复定义
    //  #ifndef SALES_DATA_H
    //  #define SALES_DATA_H
    //  #include
    //  /*声明和定义*/
    //  #endif

    cin.ignore();

    return 0;
}

//C++定义了算术类型和空类型,其中算术类型包括字符、整数、布尔值、浮点数。
//带符号包含正数、负数、零;不带符号包含大于等于0的值。不带符号声明:unsigned int i=1。
//signed char表示-128~127,unsigned char表示0~255,不要声明char。
//当明确知晓数值不可能为负时,选用无符号类型;如果你的数值超出int范围,选用long long;在算术表达式中不要使用char和bool,只有存放字符和布尔值时才使用它;执行浮点运算选用double。
//内置类型转换:0为false,否则为true;false为0,true为1;浮点数到整数,仅保留整数部分;整数转浮点型,小数部分为0,如果整数所占空间超过浮点型容量,否则精度有可能损失;给带符号类型超范围值,结果是未定义的;

第二章介绍了C++基本的数据类型(算术型+引用+指针)及其用法,另外也讲解了C++对于复合类型的支持(类),

你可能感兴趣的:(chapter-2)