变量和基本类型¶
约 802 个字 16 行代码 预计阅读时间 4 分钟
1.基本内置类型¶
- 算数类型和空类型
bool, char, wchar_t, char16_t, char32_t, short, int, long, long long, fliat, double, long double
- w_char_t确保可以存放机器最大扩展字符集中的任意一个字符
- char16_t,char32_t为Unicode字符集服务
- 一般float 32bit,double 64bit,long double 96/128bit
带符号类型和无符号类型¶
- int, short, long, long long前直接加unsigned
- signed char和unsigned char;char表现为上述两种之一
如何选择类型¶
- 数值不为负时,选用无符号类型
- int执行整数运算;如果超过int,使用long long
- 算术表达式中不要使用char和bool,char可能有符号;明确指明signed char或unsigned char
- 浮点数运算选用double类型
类型转换¶
- 含有无符号变量时要十分注意,有符号变量会自动地转换成无符号数
- 前缀(字符)和后缀(整数或浮点数)
2.变量¶
initializer_list<string>
:允许进行列表初始化
C++
struct myclass {
myclass (int,int);
myclass (initializer_list<int>);
};
myclass foo {10,20}; // calls initializer_list ctor
myclass bar (10,20);
初始值¶
- 初始化不是赋值,只是创建对象是赋一个初始值;赋值是将当前值擦除,用一个新值代替
- 使用花括号进行列表初始化,存在丢失信息的风险,编译器报错
复合类型¶
引用¶
- 引用必须被初始化;指向变量(是变量的另一个名字)
- 将引用和初始值绑定(bind)在一起
指针¶
- 空指针:nullptr, 0, NULL(预处理变量,值就是0)
- 不能把int变量直接赋给指针,即使是0也不行
- int *&r;从右向左理解r的定义,是一个引用,引用的对象是一个指针
- (void*)obj:类似返回p->next
const修饰符¶
- 用一个对象去初始化另一个对象,是不是const都无关紧要
- 默认情况下,const对象仅在文件中有效
- 如果想在多个文件之间共享const对象,使用extern
C++
double dval = 3.14;
const int &ri = dval;
// 编译器将ri绑定在一个临时对象上
const int tmp = dval;
const int &ri = tmp;
-
对const的引用可能引用一个并非const的对象
-
常量指针必须初始化(int* const p = &ri;),初始化后不能被赋值;常量必须初始化(const int i = 3;)
顶层const¶
- 顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量
- 执行对象的拷贝操作时,如果是顶层const,不受影响
constexpr和常量表达式¶
- constexpr编译器验证变量的值是否是一个常量表达式
处理类型¶
auto¶
- 只保留底层const,忽略顶层const
decltype¶
- 编译器分析表达式得到类型,但不计算表达式的值
- 返回该变量的类型(包括顶层const和引用)
- 表达式内容是解引用操作,返回的是引用类型
- 如果给变量加上多层括号,会得到引用类型
auto与decltype区别¶
- auto计算变量的初始值来推断类型;decltype分析表达式但不计算实际表达式的值
- auto类型和初始值不完全一致,
- decltype的结果类型和表达式形式密切相关,