1.变量和基本类型
一、变量和基本类型
1.1 类型转换
当我们把一个数据类型的变量赋值给另一种类型的数据变量,程序会自动发生类型转换。在不同变量之间的类型转换有以下原则。
- 非布尔类型转布尔类型,0为false,非0为true。
- 布尔类型转非布尔类型,true为1,false为0.
- 浮点数类型转整数类型,只保留整数部分,剔除小数部分。
- 整数类型转浮点数类型,小数部分记0,如果整数大于浮点数的表示范围可能发生精度损失。
- 有符号数赋值给无符号数,当有符号数超出了无符号数的表示范围,则对该值以无符号数总值取模。
- 当给一个有符号类型赋值一个超出表示范围的值时,结果是未定义的,此时可能发生错误。
1.2 初始化变量
C++语言中,初始化和赋值是两个概念,两种不同的操作。在之后的操作中有重要区分。这里我们先来看看几种不同的赋值方法。
int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);
此处值得注意的是当我们使用花括号的初始化方法处理内置变量时,当初值存在丢失信息的风险时,编译器会报错。
long double ld = 3.1415926;
int a{ld}, b = {ld}; // 不可以正确执行,存在精度损失。
int c(ld), d = ld; // 可以正确执行,进行了类型转换。
1.3 指针
1.3.1 指针的声明
如何正确声明一个常量指针,指针常量,指针的引用。对于这个问题我们有这样一种方法,在声明变量时靠近变量名具有最直接的影响。所以接下来我们看几个示例:
int i = 42;
int *p; // p是一个int类型的指针
int *&r = p; // r是一个指针的引用
1.3.2 空指针
对于任何指针请一定先进行初始化,如果不知道要指向何处也应该初始化为nullptr
得到一个空指针最有效的办法就是通过字面值常量nullptr来初始化指针。值得注意的是该方法是C++11新标准引入的方法。
在过去我们也可以使用0或者NULL来初始化一个空指针。在初始化指针时,NULL和0是一样的。
1.3.3 void* 指针
void指针,可以存放任意对象的地址,但是该指针由于不知道指针所指的对象,故不能解析地址。所以void指针只能用作比较,输入输出,或者赋值给另一个void*指针。
1.4 const限定符
const的限定范围只在本文件内有效,如果要在文件外访问const对象,要加extern关键字。
1.4.1 const初始化
const对象必须要被初始化,否则会导致错误。初始化可以是在编译阶段,也可以在运行阶段。
int i = 42;
const int ci = i; // 可以初始化
int j = ci; // 可以初始化
1.4.2 const的引用
const的应用只能由,非const对象初始化。该引用的值不可以被修改。但是被引用的对象可以通过其他方法修改其值。
int ci = 1024;
const int &r1 = ci; // 引用的对象要是常量。
r1 = 42 // 无法修改常量引用。
int &r2 = ci; //不能使用非常量引用指向一个常量。
当我们试图将const对象,绑定到const引用时时非法的,即是一种无效的操作。同时接下来我们会看到常量指针和指针常量(指向常量的指针)。但是在引用和常量的关系中只有常量引用没有引用常量,原因也很简单。首先引用本身不是对象且不可以被修改。故不需要也不存在引用的常量。
1.4.3 const和指针
指向常量的指针
指向常量的指针又可以称之为,指针常量。即指针可以改变但是其指向的值不可以改变。同时值得关注的时虽然是指向常量的指针但是却可以将变量赋值给该指针。因此我们可以认为该指针只是自我认为所指对象是一个常量。
const double pi = 3.1415926;
double *ptr = π // pi是一个常量,不能赋值给普通指针
const double *cptr = π // 即常量赋值给常量指针的操作
*cptr = 42 // 不能修改常量指针所指内容
double dval = 3.14;
cptr = &dval; // 可以将一个普通变量赋值给常量指针,同事常量指针所指地址也可以修改
常量指针
常量指针,不变的是指针本事,而不是指向的值。因此对象所指向的值能否修改就与所指对象本身的属性相关。
int errNum = 0;
int *const curErr = &errNum; // 常量指针指针不能修改,指向的值可以修改
const double pi = 3.1415926;
const double *const pip = π // 常量指针指向常量,指针和指向的值都不能修改
浙公网安备 33010602011771号