[C++Primer]第2章.变量和基本类型

第2章.变量和基本类型

bit(比特、位):非0即1
byte(字节):可寻址的最小内存块,大多由8bit构成
word(字):存储的基本单元,4或8字节

一. 基本内置类型

1. signed和unsigned

① 特殊:与其他内置类型不同,char类型不等同于signed char,由编译器决定其为signed还是unsigned

② 赋值溢出:赋给带符号变量超过其范围的值,结果是未定义的;赋给无符号变量超过其范围的值,结果是对该无符号类型表示的数值总值取模后的余数

③ 类型转换

2. 字面值常量
  • 十进制字面值常量的类型为int、long、long long中能容纳该值的尺寸最小类型,除非有u、l、ll等后缀
  • 八进制和十六进制字面值常量(如:0123、0x2f等)为int、unsigned int、long、unsigned long、long long、unsigned long long中能容纳该值的尺寸最小类型
  • 浮点字面值常量(如:1.08e2、1.08E2、.3、2.、1.34f、1.34l等)默认为double
  • 字符串字面值常量实际上是由常量字符组成的数组,编译器会在每个字符串的结尾处添加一个空字符’\0’
  • 泛化的转义字符:/后面1-3位8进制数字(如/123),/x后面1-多个十六进制数字(如/x4d)
  • bool:true、false
  • 指针:nullptr

二. 变量

1. 初始化

初始化不同于赋值:初始化是创建变量时赋予其一个初值,而赋值则是把对象的当前值擦掉,以一个新值代替。

初始化方式例子说明
拷贝初始化int a = 2;只能提供一个初始值
()初始化int a(2);类内的初始化不能用该样式
列表初始化int a{2};
vector<int> a = {2, 3}
如果存在信息丢失的风险,编译器会报错,如int a = {3.14};
如果提供的是初始元素值的列表,应使用该方式,如vector
2. 变量声明extern

变量声明一般放在头文件中。

extern int value;

任何含有显式初始化的声明将会成为定义。

3. 标识符
4. 全局作用域、块作用域;内层作用域、外层作用域

三. 复合类型

int value = 100;

基本数据类型声明符变量名
int*pointer
double&reference
1. 引用
  • 引用必须在定义时即被初始化,之后无法令其重新绑定
    int value1 = 100;

    int value2 = 200;

    int &reference = value1;

    reference = value2; // 这句话并不是将引用reference重新绑定至value2,而是相当于value1 = value2;
2. 指针
  • 指针(及引用)的类型要和它指向(引用)的对象类型严格匹配。

    例外:具有底层const的指针(或引用)可以指向(或引用)非const对象。

    const int constValue = 3;

    int value = 4;

    int &ref1 = constValue; // Error

    const int &constRef1 = constValue;

    const int &constRef2 = value;

  • 空指针

    nullptr、NULL、0

  • 野指针

  • 解指针:解指针得到其所指向的对象

    int integer = 3;

    int *pointer = &integer;

    *pointer = 10;

四. const

const对象必须初始化,且初始化之后其值不能再改变

1. extern

默认情况下,const对象被设定为仅在文件内有效

如果想要在其他文件中使用,则必须在定义和声明的时候都加上extern

2. 顶层const和底层const

顶层const,表示对象本身(这里是指针)是个常量

int *const pointerHaveTopLevelConst = &unConstInteger;

底层const,表示指针指向的对象是个常量(即便不是常量也当做常量解引用后不能改变其值)

const int *pointerHaveLowLevelConst = &constValue;

拷贝不能忽略底层const。但是没有底层const的指针(或引用)可以被拷贝给具有底层const的指针或引用。
拷贝忽略顶层const。

3. constexpr和常量表达式

常量表达式:值不会改变,在编译期间就能得到计算结果
constexpr和const的不同之处在于,前者编译器会验证变量的值是否是一个常量表达式

五. 处理类型

1. 类型别名

typedef int number;

typedef double *pointerToDouble;

using pointerToInt = int *;

特别注意,下语句表示的时一个具有顶层const还是底层const的指针

const pointerToInt pointer = &value;

2. auto类型说明符
  • 使用auto会忽略顶层const,如果希望保留则使用const auto
  • 底层const会被保留下来
  • 使用auto在同一条语句声明多个变量,这些变量的数据类型必须相同
3. decltype类型指示符
  • 引用从来都作为其引用对象的同义词出现,仅在decltype是一个例外
  • decltype(*pointer) 表示的是一个引用类型
  • decltype((value)) 表示的引用类型

六. 自定义数据结构

头文件通常包含那些只能被定义一次的实体,如类、const和constexpr变量等

头文件保护符

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值