C++primer 第二章笔记 初稿

本文介绍了C++中的基本内置类型及其尺寸,包括算术类型、无符号类型的运算规则、字面值表示方法等。此外,还详细讲解了变量的初始化、声明与定义的区别,并探讨了复合类型如引用和指针的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.1 基本内置类型

  1. 算术类型
类型尺寸
char8位
wchar_t16位
char16_t16位
char32_t32位
float6位有效数字
double10位有效数字
long double10位有效数字

一个字节(byte)由8 Bit构成,一个字(Word)由2个字节构成。

通常float 1个字,double 2个字,long double 3-4个字。

  1. 无符号类型的运算

    • 当一个表达式中既有带符号类型又有无符号类型数,一般转化为无符号类型的数,而一旦产生负的无符号类型数,则取模。
    • char有时是带符号有时是无符号,一般由编译器决定,故不要用char获取一个小整数。
  2. 字面值

    • 进制
      0开头表示8进制,0x开头表示16进制。
    • 小数
      科学计数法以小数加e加整数表示。
    • 字符及字符串
      若干个字符串字面值之间,如果只有空格、制表符(/t)和换行符(/n)存在,那么他们会被自动连接为一个新的字符串字面值。
    • 显示指定的字面值类型
      • 前缀
        • u: char16_t
        • U: char32_t
        • L: wchar_t
        • u8: char
      • 后缀
        • 整型
          • u or U: unsigned
          • l or L: long
          • ll or LL: long long
        • 浮点型
          • f or F: float
          • l or L: long double

2.2 变量

  1. 初始化

    • 方法:直接初始化, 复制初始化, 列表初始化(存在精度丢失会报错)。
    • 初始化与赋值有本质区别
    • 默认初始化
      • 函数体外被初始化为0
      • 函数内部的内置型不被初始化,任何调用为未定义。
      • 类的数据成员 如果没有人为指定初始值的情况下,会被默认初始化。
  2. 声明与定义

    • 加extern前缀表明是声明。
    • 声明可以多次但定义只能一次。
    • 一旦声明的变量被初始化即被定义。
    • 区分声明和定义的关键在于是否分配了内存空间。

2.3复合类型

  1. 引用:初始化一个引用变量必须是一个对象。
  2. 指针
    • 空指针的初始化方法
      • 字面值nullptr
      • 预处理变量NULL,定义在
      • 任何直接把变量赋值给指针都是错的,即使变量值为0。
    • void*指针
      • 特征
        • 可以与其他指针比较,可以作为函数的输入输出,可以赋值给另一个void*。
        • 不可以访问指向对象的值
      • 可以通过显式转换类型使其转化为任意类型指针,从而访问指向对象。
      • 有趣的现象:delete一个void*指针会给出警告。
    • 存在对指针的引用,但不存在指向引用的指针(因为引用本身不是一个对象)。
    • 出现复杂的定义,通常由内向外阅读(int *&r表示一个指针的引用)。

2.4 const限定符

  1. extern const

    • 原由:const对象在属于文件(不同于非const对象),不支持文件间的互相访问,而有时恰恰有互相访问的需求。
    • 解法办法:无论定义和声明,const前添加extern关键字。
  2. const与引用
    允许把const引用绑定到普通对象,但不允许普通引用绑定const对象。

  3. 顶层const与底层const之分

    • 顶层const:限定此变量本身的值不能够被修改(所以要求声明时就初始化)。
    • 底层const:限定不能通过此变量修改它指向或者引用的变量(专门限制引用和指针的)。
      int i=0;  
      int *const p1 = &i;       //p1的值(指向)不能修改,顶层const  
      const int ci = i;         //同上,顶层const  
      const int *p2 = &ci;      //不能通过p2修改ci,底层const  
      const int *const p3 = p2; //底层const,顶层const  
      const int &r = i;         //不能通过r修改i,底层const  
  4. constexpr
    • 通过将变量声明为constexpr来表示此变量的值是一个常量表达式。
    • constexpr 指针类似于于顶层const指针(指向不能改变),而且它只能指向全局变量或者静态变量,以及nullptr或NULL。

2.5处理类型

  1. 类型别名

    • typedef

      typedef double wages;
      typedef wages base, *p;
    • using(据说是用来解决typedef与模板的某些问题的)。

  2. auto运算符:自动推断类型

    • 忽略顶层const,保留底层const。
    • 忽略引用类型,保留值类型。
    • auto类型的引用会保留初始化值的顶层const属性
      const int ci = 0;  
      auto a = ci; //a是int
      const auto b = ci; //显式声明b为const  
      auto &r = ci; //r是const引用  
      const int &ri = ci;  
      auto rc = ri; //rc是int
      auto &rd = ri; //显式要求rd初始化为引用  
  3. decltype
    • 返回表达式的类型,不实际计算表达式
    • 只有在被decltype调用时,引用才不返回其绑定的对象,即decltype会得到引用类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值