C++ Primer第二章笔记

C++ Primer 第二章笔记 变量和基本类型

  1. 算术类型
    算术类型分为两类,整型和浮点型

    算术类型的尺寸在不同机器上有所差别。
    char是基本的字符类型,一个char的空间应确保可以存放基本字符集(ASCII码)中任意字符对应的数字值。即一个char的大小和一个机器字节一样。
    其他字符类型可以用于扩展字符集,比如wchar_t。
    除了字符和布尔类型,其他整型可以用于表示不同尺寸的整数。一个int至少和一个short一样大,一个long至少和一个int大,一个long long至少和一个long一样大。
  2. 内置类型的机器实现
    计算机通常以比特序列存储数据,每个比特非0即1,例如010110101000101
    大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为字节,存储的基本单元称为,它通常由几个字节组成。在C++语言中,一个字节至少要能容纳机器字符集中的字符。
    大多数计算机中字节由8比特构成,字则由32或64比特构成,也就是4或8字节(32位机器和64位机器的区别)。
    计算机中每个字节对应一个数字(地址)。在一个字节为8比特,字为32比特的机器上,下图左边代表字节的地址,右侧是字节中每个比特的具体内容。地址为736424的那个字,或者地址736472的那个字节。为了赋予内存中某个地址明确的含义,必须知道存储在该地址的数据的类型。
  3. 类型选择规范
  • 明确知道数据不可能为负时候,选择无符号类型
  • 在算术表达式中不要使用char或者bool
  1. 类型转换
  • 当我们将非布尔型的值赋给布尔类型时,初始值为0结果为false,否则为true
  • 布尔类型转化为非布尔类型,初始值为false结果为0,初始值为true结果为1.
  • 浮点型值赋给整数类型,进行了近似处理,结果值仅包含浮点数中整数部分
  • 将整数值赋给浮点类型,小数部分记为0,如果该整数所占的空间超过了浮点类型的容量,精度有可能损失。(浮点型数的存储方式)
  • 当赋给无符号类型一个超出它范围的值,结果是初始值对该类型能表达的数值总数取模后的余数
  • 当我们赋给带符号类型一个超出它表示范围的值,结果是未定义的
  • 当表达式中即包含有符号类型又包含无符号类型,带符号类型数会自动转化为无符号类型数。
  1. 字面值常量
    以0开头的整数代表八进制数,以0x或0X开头的代表十六进制数。
    由单引号括起来的一个字符称为char型字面值,双括号括起来的构成字符串型字面值。
  2. 初始化和赋值
    初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新的值来替代。
    int i1 = 0;int i2 = {0};int i3(0);int i4{0};
    用花括号的来初始化变量,称为列表初始化。特点是如果初始值存在丢失信息的危险,编译器将报错,初始化失败。
  3. 默认初始化
    如果定义变量时没有指定初值,则变量被默认初始化。默认值到底是什么将由变量类型决定,同时变量的位置也会有影响。
  • 在函数外部定义的变量自动初始化为0;在函数体内部定义的变量不进行自动初始化。
  • 一个未被初始化的内置类型变量的值是未定义的,访问此值将引发错误。
  • 每个类各自决定其初始对象的方式。定义于函数体内的内置类型的对象如果没有初始化,则其值未定义。(未初始化的变量含有一个不确定的值,使用未初始化变量的值是一种错误的编程行为,建议初始化每一个内置类型的变量)
  1. 声明与定义
    为了支持分离式编译,C++将声明与定义区分开,声明使得名字为为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明(比如std:cout),而定义负责创建于名字关联的实体。
    声明方法: extern <类型> 变量名;
  2. 复合类型
  • 引用
    引用为对象起了另一个名字,引用即别名。引用必须被初始化。注意引用并非对象。引用类型的初始值必须是一个对象。
    <类型> &<引用名>=对象;
  • 指针
    指针是指向另一种类型的符合类型。指针和引用相比有很多不同点。第一,指针本身是一个对象,允许对指针赋值和拷贝,而且可以先后指向不同的对象。其二,指针无须在定义时赋初值。
    <类型> *<指针名>=&<对象>
    指针的类型一般都要和它所指向的对象严格匹配。
  • 指针值
    指针的值应该属于下列4中状态之一:
    1. 指向一个对象
    2. 指向紧邻对象所占空间的下一个位置
    3. 空指针,意味着指针没有指定任何对象
    4. 无效指针,也就是上述情况之外的其他值
      如果指针指向了一个对象,允许使用解引用符*来访问该对象(仅适用于那些确实指向了某个对象的有效指针)。
      未经引用的指针会引发错误,如果不知道指针指向何处,应先初始化为0或者nullptr
  • void* 指针
    void是一种特殊类型的指针,可用于存放任意类型对象的地址。void指针的操作比较有限,和其他指针比较、作为函数的输入和输出、赋值给另一个void指针。不能直接操作void指针所指的对象。
  • 指向指针的引用
    int *p;
    int *&r = p;//r是对指针p的引用,离r最近的&决定了其属性
    r = &i;//指针p指向i
    *r = 0;//将p指向的对象即i的值改为0
    
  1. const限定符
    const对变量类型加以限定,因为const对象一旦创建后其值不能改变,所以const对象必须初始化。
    可以在多个文件之间共享const对象,用extern声明。
  2. 对const的引用
  • 对常量的引用不能被用作修改它所绑定的对象。
    一般引用类型必须与所引对象的类型一致,一种例外是初始化变量引用时允许用任意表达式作为初始值,只要改表达式的结果能被转化为引用的类型。
  • 指向常量的指针不能用于改变所指向对象的值。想要存放常量对象的地址,只能使用指向常量的指针。指针的类型一般都要和它所指向的对象严格匹配。第一个例外是允许一个指向常量的指针指向一个非常量对象。
    const double pi = 3.14;
    const double *cptr=&pi;	
    
  • const指针
    指针也是对象,允许将指针本身定义为常量。常量指针必须初始化,将*放在const之前用以说明指针是个常量。
    int errNum=0;
    int *const curErr = &errNum;//curErr将一直指向errNum
    const int errNum=0;
    const int *const curErr = &errNum;//curErr是一个指向常量对象的常量指针。
    
  • 顶层const
    指针本身是一个对象,它又可以指向另一个对象。指针是不是常量以及指针所指的对象是不是一个常量是两个独立的问题。对指针而言,顶层const表示指针是个常量,底层const表示指针所指的对象是一个常量
    更一般的是,顶层const可以表示任意的对象是常量,底层const则与指针和引用等复合类型的基本类型部分有关。
    int i = 0;
    int *const p1=&i;//顶层const
    const int ci=42;
    const int *p2 = &ci;//允许改变p2的值,这是一个底层const int *const p3=p2;//靠右的const是顶层const,靠左的是底层const
    const int &r = ci;//用于声明引用的const都是底层const 
    
    当执行对象的拷贝操作时,顶层const不受什么影响,另一方面底层操作的限制却不能忽视,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的能够转换。一般来说,非常量可以转换为常量,反之不行。
  1. constexpr常量表达式
    常量表达式是指值不会改变且在编译过程中就能得到计算结果的表达式,显然字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
    常量表达式的值需要在编译时就计算,因此声明constexpr时用到的类型必须有所限制,因为这些类型比较简单,称为字面值类型。
    指针和应用都能定义为constexpr,但它们的初始值受到限制,constexpr指针初始值必须是nullptr或者0.

    如果在constexpr声明中定义了一个指针,constexpr仅仅对于指针有效,与指针所指的对象无关。

    constexpr int *q = nullptr//指向一个整数的常量指针
    int j = 0;
    constexpr const int *q = &j;//q是常量指针指向整型常量
    
    
  2. 处理类型

  • 类型别名
    typedef char *pstring;
    const pstring cstr=0;
    const pstring *ps;//ps是一个指针,指向的对象是指向char的常量指针。
    
  • auto类型说明
    使用auto类型说明符,它能让编译器替我们分析表达式所属的类型。
    auto一般会忽略顶层const,同时底层const则会保留下来
    const int ci = 1;
    auto b = ci ;//b是一个整数,ci的顶层const特性被忽略了。
    const auto f = ci;//如果希望推断出的类型为顶层const,需要明确指出。
    
  • decltype类型指示符
    有时希望从表达式的类型推断出要定义的变量的类型,引入了第二种类型说明符号decltype,它的作用是选择并返回操作数的数据类型。
    细节:decltype((variable))的结果永远是引用。
  1. 预处理器概述
    防止头文件中多次包含某一个 .h头文件

    #define指令把一个名字设定为预处理变量,#ifdef当且仅当变量已定义时为真。一旦检查结果为真,执行操作直到#endif指令为止。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值