变量和基本类型

  • C++为静态类型语言,在编译阶段检查类型
    • 编译器负责检查数据类型是否支持要执行的运算,如果不支持,编译器将报错

变量和基本类型

基本内置类型

  • 算术类型
  • 空类型

算术类型

  • 整型(包括字符和布尔类型)
  • 浮点型
类型转换
  • 将非布尔类型的算术值赋给布尔类型时,初始值为0结果为false,否则结果为true
  • 将布尔类型赋给非布尔类型时,初始值为false结果为0,否则结果为1
  • 赋给带符号类型一个超出其表示范围的值时,结果为未定义,程序可能继续工作、崩溃、或产生垃圾数据

变量

初始化

int a=0;
int a={0};//列表初始化
int a{0};//列表初始化
int a(0);
//使用{}为列表初始化
  • 若使用列表初始化且初始值存在丢失信息的风险时,编译器将报错
long double a=3.1415926535;
int a{ld},b={ld};//错误
int c(ld),d=ld;//正确
默认初始化
  • 定义于函数体之外的变量被初始化为0
  • 定义在函数体内部的内置类型变量将不被初始化,一个未被初始化的内置类型变量的值是未定义的,无法拷贝或以其他形式访问

定义与声明

  • 声明一个变量而非定义,可在变量名前添加关键字extern,且不要显示初始化变量
  • 变量只能被定义一个,但可多次声明
extern int i;//声明而非定义i
int j;//声明并且定义了j
extern int k = 0;//定义

标识符

  • 字母、数字与下划线,必须以字母或下划线开头
  • 变量名一般使用小写字母
  • 用户自定义的类目一般以大写字母开头
  • 由多个多单词组成的标识符使用下划线隔开

复合类型

引用

  • 为对象起另一个名字,引用类型引用另一种类型
  • &d:d为声明的变量名
  • 定义引用时,程序将引用与初始值绑定在一起,而不是将初始值拷贝给引用
  • 无法令引用重新绑定到另一个对象
  • 引用必须初始化
  • 引用只能绑定在对象上,不能与字面值或某个表达式的计算结果绑定在一起
//int &a=10;
double b=3.14;
//int &c=b;

指针

  • &取址符:获取某个对象的地址
  • 引用不是对象,没有实际地址,不能定义指向引用的指针
  • *解引用符:访问指针指向的对象
空指针
//生成空指针方法
int *p1=nullptr;//等价于int *p1=0;
int *p2=0;//直接将p2初始化为字面常量0
int *p3=NULL;//需#include <cstdlib>

//不能将int变量直接赋给指针
int zero=0;
//int p4=zero;
void*指针
  • 可用于存放任意对象的地址
double a=3.14,*p1=&a;
void *p2=&a;
p2=p1;
指向指针的引用
int i=0;
int *p=nullptr;
int *&r=p;//r是一个对指针p的引用
r=&i;//p=&i;
*r=10;//*p=10;i=10

const限定符

  • 默认状态下,const对象仅在文件内有效,当多个文件中出现同名的const变量,等同于在不同文件中分别定义了独立的变量
  • 在声明于与定义前都添加extern,可以只在一个文件中定义const,在其他多个文件中声明并使用该变量
//file_1.cc定义并初始化一个常量,该常量能够被其他文件访问
extern const int bufSize=fcn();
//file_1.h头文件
extern const int bufsize;//与file_1.cc中定义的bufsize是同一个

const的引用

  • 对常量的引用:将引用绑定到const对象上
const int ci=1024;
const int &r1=ci;//正确:引用及其对应的对象均为常量
//r1 = 42;错误
//int &r2=ci;错误
初始化和对const的引用
  • 引用的类型必须与其引用对象的类型一致的例外
    • 初始化常量引用时运行用任意表达式作为初始值
      • 运行为一个常量引用绑定非常量的对象、字面值或表达式
int i=0;
const int &r1=i;
const int &r2=42;
const int &r3=r1*2;
//int &r4 = r1*2;错误,r4为普通的非常量引用

指针和const

  • 指向常量的指针不能用于改变其所指对象的值
  • 指针的类型必须与其所指对象的类型一致的例外
    • 允许将一个指向常量的指针指向一个非常量对象
double a=3.14;
const double *cptr=&a;

顶底层const

  • 顶层const:指针本身为一个常量
  • 底层const:指针所指的对象时一个常量
int i=0;
int *const p1=&i;//不能改变p1的值,为顶层const
const int ci=42;//不能改变ci的值,为顶层const
const int *p2=&ci;//允许改变p2的值,不允许改变ci的值,为底层const

constexpr和常量表达式

  • 常量表达式:其值不会改变并且在编译过程就可得到计算结果的表达式
const int a=10;//true
const int b=a+1;//true
int c=10;//false
int d=c+1;//false
int e=func();//false

constexpr变量

  • 将变量声明为constexpr类型以便编译器验证变量的值是否为一个常量表达式
constexpr int a=10;//true
constexpr int b=a+1;//true
constexpr int sz=func();//只有当func时一个constexpr函数时才是一条正确的声明语句
  • constexpr只对指针有效,与指针所指对象无关
const int *p=nullptr;//p是一个指向整型常量的指针
constexpr int *q=nullptr;//q是一个指向整数的常量指针

处理类型

类型别名

  • 使用关键字typedef
typedef double wages;
typedef wages base,*p;
  • 使用别名声明
using SI=int;

auto类型说明符

  • 由编译器通过初始值推算变量的类型
  • auto可在一条语句中声明多个变量,该语句中所有变量的初始基本数据类型必须一样
auto i=0,*p=&i;
//auto sz=0,pi=3.14;
  • auto一般会忽略顶层const,底层const会保留夏哩
int i=0,&r=i;
auto a=r;//a是一个整数
const int ci=i,&cr=ci;
auto b=ci;//b是一个整数,ci的顶层const被忽略
auto c = cr;//c是一个整数
auto d = &i;//d是一个整型指针
auto e = &ci;//e是一个整向整数常量的指针

decltype类型指示符

  • 选择并返回操作数的数据类型
  • 从表达式的类型推断出要定义的变量的类型,但不使用该表达式的值初始化变量
decltype(f())sum=x;//sum的类型为函数f的返回类型

const int ci=0,&cj=ci;
decltype(ci)x=0;//x的类型为const int
decltype(cj)y=x;//y的类型为const int&
//decltype(cj)z;
decltype和引用
  • 如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型
  • 如果表达式的内容是解引用操作,则decltype将得到引用类型
int i=42,*p=&i;&r=i;
decltype(r+0)b;//b是一个未初始化的int
decltype(*p)c;//c是int&,必须初始化
  • 如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型
  • 如果给变量加了一层或多层括号,编译器会将其当成一个表达式
  • decltype((variable))双层括号的结果永远是引用
//decltype((i))d;d为int&
decltype(i)e;//e为一个为初始化的int
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值