【C++Primer】第2章:变量和基本类型

第2章 变量和基本类型

数据类型分无符号和带符号

编译器类型charshortintlongfloatdouble指针
32位编译器1字节244484
64位编译器1字节248488

8比特的signed char范围为-128~127区间

字面值常量

整型和浮点型字面值:

默认整型字面值为double

字符和字符串字面值:

编译器在每个字符串的结尾处添加一个空字符(’\0’),因此,字符串字面值的实际长度比它的内容多1

除了常见的字符类型,还有一些不常见的字符类型,用于扩展字符集,如wchar_tchar16_tchat32_t

wchar_t类型用于确保可以存放机器最大扩展字符集中任意一个字符

char16_t类型和char32_t则为Unicode字符集服务

指定字面值的类型

image-20211215193628863

布尔字面值和指针字面值

true和false是布尔类型的字面值

nullptr是指针字面值

变量

对于C++程序员来说,变量对象一般可以互换使用

通常情况下,对象是指一块能存储数据并具有某种类型的内存空间

初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值

赋值的含义是把对象当前值擦除,而以一个新值来替代

几种初始化方法:

int a = 0;
int a = {0};    //叫做列表初始化
int a{0};
int a(0);

如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错

默认初始化

如果定义变量时没有指定初值,则变量被默认初始化

每个类各自决定其初始化对象的方式。

例如int默认初始化为0,string默认初始化为空字符串。

变量声明和定义的关系

声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明

定义负责创建与名字关联的实体

变量声明规定了变量的类型和名字,在这一点上定义与之相同。

定义还申请存储空间,也可能为变量赋一个初始值

声明不能显示初始化,加上了显示初始化则为定义

声明用关键字extern

extern int i;   //声明i而非定义i
int j;          //声明并定义j
extern double pi = 3.14   //定义

变量只能被定义一次,可以声明很多次

C++是一种静态类型语言

C++中作用域以花括号分隔

复合类型

引用和指针

引用和指针实现了对其他对象的间接访问

引用

我们说引用一般是指左值引用,C++11还新增了右值引用

引用必须初始化

引用并非对象,所以不能定义引用的引用

引用类型的初始值必须是一个对象,且是同一数据类型的对象;不能是字面值

引用只能绑定一次

int &a = 10;   //错误:引用类型的初始值必须是一个对象
const int &b = 0;   //正确,可以为常量引用绑定字面值

指针

指针本身是对象,而引用不是

指针无需在定义时赋初始值

int *P = &ival;   //p存放变量ival的地址,或者说p是指向变量ival的指针

空指针

生成空指针的几种方法:

int *p = nullptr;   //C++11新标准
int *p = 0;
int *p = NULL;

注意:int变量直接付给指针是错误的,恰好等于0也不行

int zero = 0;
int *pi = zero;  //错误

void*指针

可以存放任意对象的地址,并不知道这个对象到底是什么类型

指针的指针

image-20211215205852403

const限定符

const对象一旦创建其值就不能再改变,所以const对象必须初始化

默认状态下,const对象仅在该cpp文件内有效;除非加extern声明

常量引用

const int ci = 1024;
const int &r1 = ci;   //现在r1和ci都是常量1024
int &r2 = ci;   //错误
int i = 42;
const int &r3 = i;  //可以,但是不允许通过r3修改i
r3 = 40;   //错误
i = 41;    //正确
cout << r3 << endl;  //41

const int * P:指向常量的指针,底层const

int * const p:常量指针,顶层const,不能修改p的值,即不能修改地址

const int * const p:指向常量的常量指针

顶层const表示指针本身是个常量

底层const表示指针所指的对象是一个常量

更一般的,顶层const可以表示任意的对象是常量

const int ci = 42;  //顶层const

常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式,可用constexpr修饰

constexpr int mf = 20;

类型别名

typedef double wages;   //wages是double的同义词
using SI = Sales_item;  //SI是Sales_item的同义词

auto类型说明符

C++11新标准引入

auto定义的变量必须有初始值

auto一般会忽略掉顶层const,同时底层const则会保留下来

decltype类型指示符

C++11新标准

选择并返回操作数的数据类型

decltype(f()) sum = x;   //sum类型就是函数f()的返回类型

返回类型包含顶层const和引用在内

auto,decltype都是类型说明符

decltype((i)) d;   //错误:d是int&,必须初始化    注意:双层括号结果永远是引用
decltype(i)  e;    //正确:e是一个未初始化的int 
int a = 3, b = 4;
decltype(a = b) d = a;    //d是int & 型 4

头文件定义

防止重复包含的发生:

#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

#define是一条预处理指令,用于定义一个预处理变量

#endif是一条预处理指令,用于结束一个#ifdef或#ifndef区域

#ifdef是一条预处理指令,用于判断给定的变量是否已经定义

#ifndef是一条预处理指令,用于判断给定的变量是否尚未定义

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zdb呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值