C++ | C++ 基础知识 | 类型与声明
2024-10-08 04:56:40
一、类型
C++ 包含一整套基本类型,这些类型对应计算机最基本的存储单元并且展现
1.0 布尔值
一个布尔变量(bool)的取值或者是 true 或者是 false,布尔变量常用于表达逻辑运算结果。
bool a = true;
if (a) {
print("a is true");
}
指针也能被隐式的转换成 bool。其中,非空指针对应 true,值为 nullptr 的指针对应 false。
char a[] = "123";
if (a) // 与 if(p!=nullptr) 相比使用 if(a) 更好,不但更简洁而且可以直接表达 “p 是否有效的含义”
{
cout << "Hello World!\n";
}
1.1 字符类型
- char: 默认字符,大小:8位(char 针对不同编译器而言,有可能表示 signed char 也可能表示 unsigned char)
- signed char: 有符号字符,大小:8位,表示区间 -128 ~ 127(-27 ~ 27 - 1)
- unsigned char: 无符号字符,大小:8位,表示区间 0 ~ 255(0 ~ 28 - 1)
- wchar_t: 用于存放 unicode 等更大的字符集,wchar_t 的尺寸依赖于实现
- char16_t: 存放 UTF-16 等 16 位字符集。
- char32_t: 存放 UTF-32 等 32 位字符集。
UTF-8,UTF-16,UTF-32 都是 Unicode 的一种实现。
UTF-8: 单字节,不需考虑大端小端问题。
UTF-16: 编号在0000~FFFF之间的字符,用两个字节表示。编号在10000~10FFFF之间的字符用四个字节表示,需要考虑大小端问题。
UTF-32: 处理单元为四个字节(一次拿到四个字节进行处理),需要考虑大小端问题。
### 1.2 整数类型 - int: 普通类型,大小 32 位
- sign int: 有符号整型。 大小 32 位
- unsigned int: 无符号整型。
- short ...: 其他类型
如果需要精确控制整数的尺寸
C++ 中可使用 中定义的别名。
C 中可以使用 <_uint8_t.h>,<_uint16_t.h> 等中定义的别名。
整数字面值常量: - 八进制:以 0 开头标识一个八进制值。
- 十进制:默认为十进制
- 十六进制:以 0x、x、X 开头标识一个十六进制值。
编码注意:使用字面量过程中,不能滥用含义不明显的常量,使用字面量常量的时候一般使用枚举或者 #define 结合使用。
### 1.3 浮点类型
浮点类型用于表示浮点数。浮点数是实数在有限内存空间上的是一种近似表示。 - float 单精度。4 个字节,eg: 3.1415926f
- double 双精度。8 个字节,eg: 12234567e34
- long double 扩展精度。8 个字节,eg: 3.1415926l
### 1.4 void
void 属于基本类型,但是只能被用作其他复杂类型的一部分,不存在任何 void 类型的对象。
void 作用 - 作为函数的返回类型用以说明函数不返回任何实际的值。eg: void f();
- 作为指针的基本类型部分表示指针所指对象的类型未知。eg: void* pv;
### 1.5 对齐
在一写机器的体系结构中,存放变量的字节必须保持一种良好的对齐(alignment)方式,以便硬件在访问数据资源时足够高效。例如:4 字节的 int 应该按(4字节)的边界排列,而 8 字节的 double 有时也应该按字(8字节)的边界排列。
使用 alignof() 运算符返回实参表达式的对齐情况。
struct Foo {
int f2;
double f1;
char c;
};
struct alignas(16) FooNew
{
int f2;
double f1;
char c;
};
output:
alignof(Foo) -> 8
alignof(FooNew) -> 16
二、声明
2.1 声明结构:
一条声明语句包含5个部分:
- 可选的前置修饰符(static, virtual)
- 基本类型(vector, const int)
- 可选的声明符(p[7])
- 可选的后缀函数修饰符(const, noexcept)
- 可选的初始化器或函数体({7,3}, {return x;})
eg: const char *kings[] = {"1", "2", "3"};
类型 | 说明 |
---|---|
* | 指针 |
*const | 常量指针 |
*volatile | volatile 指针 |
& | 左值引用 |
&& | 右值引用 |
auto | 函数(使用后置返回类型) |
[] | 数组 |
() | 函数 |
-> | 从函数返回 |
2.2 声明多个名字
C++ 允许在同一条声明语句中声明多个名字,eg: int x,y;
2.3 作用域
- 局部作用域:函数或者 lambda 表达式中声明的名字称为局部名字。局部名字的作用域从声明处开始,到声明语句所在的块结束为止。
- 类作用域:类成员名字的作用域从类声明的 { 开始,到类声明的结束为止。
- 名字空间作用域:如果某个名字控件位于任意函数 lambda 表达式,类,枚举类或者其他名字空间的外部,则定义在该名字控件中的名字为名字控件成员名字。名字空间成员名字的作用域从声明语句开始,到名字空间结束为止。名字空间名字能被其他翻译单元访问。
- 全局作用域:从函数声明处开始,到声明语句所在的文件末尾为止。
- 语句作用域:定义在 for,while,if,switch 语句的()部分,则该名字位于语句作用域中。
- 函数作用域:从声明开始到函数体结束。
2.4 初始化
初始化的四种形式:
- X a1{v}; // 推荐使用这种形式进行初始化
- X a2 = {v};
- X a3 = v;
- X a4();
eg: vector v1 {99} // v1 包含 1 个元素,该元素的值是 99
vector v2(99) // v2 包含 99 个元素,每个元素的默认值是 0
建议使用{}进行初始化,使用{}的初始化称为 列表初始化,能防止窄化转换。
- 如果一种整型存不下另一种整型的值,则后者不会被转换成前者。 char <-> int
- 如果一种浮点型存不下另一种浮点型的值,则后者不会被转换成前者。double <-> float
- float 与 int 不能互转。
2.5 初始化
推断类型 auto 和 decltype()
C++ 提供了两种从表达式中腿短年数据类型的机制:
- auto 根据对象的初始化器推断对象的数据类型,可能是变量、const(编译期和运行时常量)、constexpr(编译期常量)的类型。
// 当声明语句中的变量含有初始化器时,无须显示的指定变量的类型,只要让变量取其初始化器的类型即可。
int a1 = 123;
auto a2 = 123;
void f(vector<int>& v)
{
for(const auto& x:v) { //x 的类型是 const int&
}
}
auto 参数当表达式类型越难读懂,越难书写时,auto就越有用。
当使用 auto 关键字时, 选择 = 要比 {} 更好。
- decltype()推断对象不是一个简单的初始化器,有可能是函数的返回类型或者类成员的类型。
当我们既想推断得到类型,又不想在此过程中定义一个初始化的变量,此时,我们应该使用声明类型修饰符 decltype(expr)。其中,推断所得的结果是 expr 的声明类型。它的作用是选择并返回操作数的数据类型。
int tempA = 2;
decltype(tempA) dclTempA;
最新文章
- 使用 Weinre 调试移动网站及 PhoneGap 应用
- Javascript模块化编程(三):require.js的用法 作者: 阮一峰
- [转]设置Android手机以使用ARM Streamline进行性能分析(一)
- 实现远程连接ACCESS数据库的方法
- WCF入门 (14)
- hdu4720Naive and Silly Muggles
- ExtJS 的一些技巧与问题
- PHP 下载文件时自动添加bom头的方法
- Android 工程目录结构简介
- ecshop了解01
- C 语言字符 和字符串输出
- Android开发多线程断点续传下载器
- Java解析JSON文件的方法(一)
- java中StringUtils中isEmpty 和isBlank的区别
- Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)
- [Swift]LeetCode438. 找到字符串中所有字母异位词 | Find All Anagrams in a String
- Lubuntu下小巧好用的Python编辑工具Geany
- jquery复制值到剪切板(clipboard.js)
- [部署]CentOS安装MariaDB
- CSS知识点总结[部分]