其中char16_t 和 char32_t 是为Unicode(是用于表示所有自然语言中字符的标准)字符集服务。
int a = 3;
bool temp = a; //temp的值为true
bool a = true;
bool b = false;
int c = a; //c的值是1
int d = b //d的值是0
double a = 5.89;
int b = a; //此时a的值为5,而不是6
unsigned char a = 257;
cout << a << endl; //这里输出的a为1
int i = -42;
unsigned u = 10;
cout << u + i << endl; //此时i被转换成无符号类型,表达式输出(UINT_MAX - 31)
int month = 07; //month是8进制的7
int a = 0x9; //a是16进制的9
float b = 1.6f;
int a = { 0 };
float b = { 1.6f };
值得注意的是,当使用列表初始化时初始值存在丢失信息的风险时,编译器会报错,例如拿浮点数去通过列表初始化初始正型变量
int c = { 5.20 } //错误
extern int a; //声明但是没有定义变量
int i = 0; //声明且定义变量
extern int b = 10; //声明且定义了变量,这时候赋值就把extern的作用抵消了
int a = 10;
int& b = a; //这时候b就是a的别名,共用这同一块空间
int c = 30;
int d = c; //d只是把c空间中的值拷贝了一份放到自己空间
const int a = 10;
a = 20; //错误,a现在不能被改变了
const int i = 10;
const int& a = i; //常量引用,a的值不可改变
a = 20; //错误,a是常量引用,值不能改变
int& b = i; //错误,必须要是常量引用,从逻辑来说,i不可改变,如果通过普通引用的方式又可以把i改变,那么就矛盾了
int i = 42;
const int& r1 = i; //没问题,i是可以变的,但是通过r1不能改变i,逻辑上行得通
const int& r2 = 42; //没问题,常量引用
int& r3 = r1; //错了,r1是不能被改变的,这种举动相当于绕过r1的常量引用去改变r1,有问题
char ch = 'A';
char* const p1 = &ch; //此时的const修饰p,p是一个指针,指针存放的是地址,地址不能被改变,也就是指针指向不能变,为顶层const
const char* p2 = &ch; //此时const修饰*p,p存放的地址是可以变的,但是p解引用得到的值是不能被改变的,这就是底层const
int i = 0;
int* const p1 = &i; //顶层const
const int ci = 10; //顶层const
注意的是,用于声明引用的const都是底层const,因为引用的意义就是“指向的对象”。
int i = 0;
auto b = i; //auto自动推断b是int型
const int a = 10;
auto b = a; //b的类型是int而不是const int
//很容易就能理解,我只是把a的值拷贝到b,怎么改b的值,a的值都不会被改变,默认没有必要上const
const int a = 10;
auto& b = a; //b的类型是const int&
//因为引用如果没有const的话,那是可以通过b去改变a的,有毛病!
//auto案例
const int i = 10;
auto j = i; //j为int类型
const auto& k = i; //k为const int&类型
auto* p = &i; //p为int*类型
const auto j2 = i, &k2 = i; //j2为const int类型,k2为const int&类型
int a = 10;
decltype(a) b = 20; //b与是a那个类型,也就是int
int i = 0;
int *p = &i;
int& r = i;
decltype(r + 1) a; //a的类型是r+1结果的类型,是int不是int&
decltype(*p) = i; //i的类型是*p的结果,也就是指向的对象,是引用类型,所以是int&
值得注意的是:decltype((i)) a = i;
这里的括号 内是(i),实际上是一个表达式,该表达式的结果是i这个对象,实际上也属于“指向的对象”,所以a的类型是int&。
第二章完