变量与基本类型

类型

https://files.catbox.moe/u5ptwi.png

char类型有三种,char,与有符号的,无符号的,但是实际上只有两种char,有符号与无符号的,char是哪一种由编译器决定。

少用float多用double。

无符号超出范围会取mod,而有符号超出范围会报错。

带符号与无符号在一起,带符号会转化为无符号。

若两个char字面值仅由空格,缩进,换行分割则视为一个整体。

开头有0为八进制,有0x为十六进制

+数字为八进制的char,只管前3个,\x+数字为十六进制的char,管后面的所有。

nullptr是指针的字面值。

初始化与命名

事实上在C++语言中,初始化和赋值是两个完全不同的操作。

初始化不是赋值,初始化的含义是剑建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。

列表初始化的表现形式为使用花括号来初始化,如={}或者{},会在数据精度存在丢失可能的情况下报错。

声明:名称与类型

定义:声明+实体(申请存储空间,初始化等)

对于一个变量加上externextern关键字且不以显式初始化即表示声明。

当全局变量与局部变量相同的时候,局部变量会在块域内覆盖全局变量。内层的局部变量也会覆盖较外层的局部变量,但当离开作用域后覆盖也会失效,若是要在内层访问全局变量,只需加上作用域解析运算符::即可,但是不能访问较外层但非全局变量的变量。

引用与指针

引用在定义后无法换绑,因此必须初始化。当引用初始化时被赋为另一个引用时,会绑定另一个引用绑定的变量。

由于引用没有地址,所有指针无法指向引用。

void*是一种特殊的指针,它能指向各种类型,但是,并不能对它所指向的对象进行操作,因为不清楚它指向的

类型修饰符如*,&不过是声明符的一部分。

当为…*&时,是一个对指针的引用。

nullptr指针空值。

const

const常量只能获取它的信息,但不能改变它。const仅在当前文件内可用,若是要使其在其他文件中可用,需要加上extern关键字。

const … &,常量引用,只能引用常量,所能做的事与const相同。

常量引用可以绑定非常量变量。当类型一致时,和普通的引用没有任何区别。当并非绑定变量而是表达式或者函数时,其所绑定的值将是该表达式或函数返回值的临时量,并不会因为其内部值的改变而改变。当类型不同时,编译器会增加一句先将其转换为const类型的常量,接着将引用指向它。

但即便引用了非常量,也不能通过常量引用来改变它。

常量只能被常量引用引用,但常量引用可以引用非常量。

常量指针也和常量引用差不多,但是类型不能不一样。

但是常量指针只是其指向的地址是固定的,因此常量指针是否能改变其指向的对象取决于其对象的类型。

所谓指向常量的指针或引用,不过是指针或引用“自以为是”罢了,它们觉得自己指向了常量,所以自觉地不去玫变所指对象的值

由于指针与其所指向的类型是完全相同的,因此指向这个指针的指针也与其最终所指向的量的类型是相同的。若是要定义一个指针为常量,将*改为const^*const,当为二级指针的时候,将**改为const const^*const\ ^*const,如指向一个(指向int常量的常量指针)的常量指针,const int const constconst\ int\ ^*const\ ^*const.

对于一个指针,若它本身是常量,则为顶层const。若它指向的是一个常量,则为底层const。

当为顶层const时,只能作右值。

当为底层const时,需要保证左值与右值的底层一致或者左值是常量右值是非常量。

constexpr

当定义时是一个常量,且初始化为一个常量(即不运行这个值就已经确定的)时候,这就是常量表达式(const expression),可以通过constexpr关键字来确保这是一个常量表达式。此外,也可以通过对函数类型增加这一关键字来确保其可以作为常量表达式的一部分。会在编译的时候就会计算完成并替代。

能够被声明constexpr的变量类型必须为字面值类型。引用和指针也能被声明,但是其初始化只能指向固定地址或者nullptr。此外,由于函数体内的变量不是固定地址,故constexpr指针不能指向这些变量,但可以在函数体内定义全局变量(拥有着固定的地址),可以被指向。

constexpr保证为顶层const。

类型别名

typedef A B,B是A的别名。实际上比这复杂很多,还是用using比较好。

using A=B,A是B的别名

另外可以使用类型修饰来构造复合类型。

可以通过替换的方式来理解,但是要注意的是要加上括号来理解。

auto

通过初始化的值的类型来判断类型,因此必须初始化。

当初始值为一个引用时,会直接代换为其引用的对象。

会保留底层const但会忽略顶层const。

因此auto不可能推断出顶层const,需要在auto前增加const关键字使其推断为const。

auto中也可以使用类型修饰符,但需保证初始值是一个类型。

decltype

decltype用在不想使用用来判断类型的表达式作为初始值的情况。decltype(表达式)代替类型关键字。decltype并不会对其表达式的类型作任何改变,而会直接传过来,引用和指针也会被传出来。

解指针所得的是对其指向变量的一个引用,而非其指向的变量本身。

若是decltype中一个变量被加上了括号,那么它就会变成一个引用类型。

struct在初始化时可以为其每一个成员定义一个初始值,若是没定义,将会被默认初始化。

头文件里通常包含只能被定义一次的实体。

预处理器

#include会在预处理时将其自身替换为头文件的内容。

#define 将一个名字设为预处理变量

#ifdef 当且仅当变量已被定义时为真

#ifndef 当且仅当变量未被定义时为真

#endif if语句结束

预处理器无视作用域。

为了防止与其他实体产生名字冲突,预处理中将其大写。

初始化

  1. 默认初始化:瞎几把初始化
  2. 值初始化:若为普通类型,初始化为0,否则按类定义初始化。

变量与基本类型
https://lhish.github.io/project/hide/变量与基本类型/
作者
lhy
发布于
2024年6月30日
许可协议