一、类型

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;

最新文章

  1. 使用 Weinre 调试移动网站及 PhoneGap 应用
  2. Javascript模块化编程(三):require.js的用法 作者: 阮一峰
  3. [转]设置Android手机以使用ARM Streamline进行性能分析(一)
  4. 实现远程连接ACCESS数据库的方法
  5. WCF入门 (14)
  6. hdu4720Naive and Silly Muggles
  7. ExtJS 的一些技巧与问题
  8. PHP 下载文件时自动添加bom头的方法
  9. Android 工程目录结构简介
  10. ecshop了解01
  11. C 语言字符 和字符串输出
  12. Android开发多线程断点续传下载器
  13. Java解析JSON文件的方法(一)
  14. java中StringUtils中isEmpty 和isBlank的区别
  15. Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)
  16. [Swift]LeetCode438. 找到字符串中所有字母异位词 | Find All Anagrams in a String
  17. Lubuntu下小巧好用的Python编辑工具Geany
  18. jquery复制值到剪切板(clipboard.js)
  19. [部署]CentOS安装MariaDB
  20. CSS知识点总结[部分]

热门文章

  1. SuperSocket通过 SessionID 获取 Session
  2. JavaScript 字符串转为数字
  3. 不需内测账号,带你体验微信小程序完整开发过程
  4. python中使用指定GPU
  5. [转]Jmeter压力测试工具安装及使用教程
  6. 高可用之keepalived的配置文件详解
  7. 常用mime.types
  8. H3C 域名解析显示及维护
  9. jQuery 工具类函数-使用$.extend()扩展工具函数
  10. EJB版本