一、类型

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;

C++ | C++ 基础知识 | 类型与声明的更多相关文章

  1. Typescript 基础知识

    Typescript 就是 Javascript 的超集,所以首先你要知道 Javascript 基础知识 类型注解 类型注解在TypeScript中是记录函数或变量约束的简便方法. // 布尔值 l ...

  2. Go语言基础知识总结(持续中)

    Go基础知识总结 变量声明 Go语言中的变量需要声明以后才可以使用(需要提前定义变量)并且声明后必须使用(不适用会报错) 标准声明 var 变量名 变量类型 example: var name str ...

  3. 快速掌握JavaScript面试基础知识(三)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

  4. Java基础知识➣环境搭建与类型整理(一)

    概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以 ...

  5. C#基础知识1-深入理解值类型和引用类型

    C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...

  6. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  7. [C++学习历程]基础部分 C++中的类型和声明

    前面搭起了C++的VS环境,可以在VS中编写C++代码了,也运行了最简单的一个程序Helloworld.那么我们该怎么才能写出功能强大的程序,怎样才能随心所欲的应用呢,那就需要重新回头来,从C++基础 ...

  8. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  9. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

随机推荐

  1. 【原生JS】滑动门效果

    效果图: 思路:通过每次鼠标移动至目标上使所有图片重置为初始样式再向左移动目标及其左侧每个图片隐藏部分距离即实现. HTML: <!DOCTYPE html> <html> & ...

  2. DataTable添加单个或多个字段组成的主键,实现查找

    单列主键 DataTable fdt = CmmDb.GetDataTable(orgsql); fdt.PrimaryKey = new DataColumn[] { fdt.Columns[&qu ...

  3. mybatis 基础理解resultType和resultMap

    resultType和resultMap: 1.resultType: 一.返回一般数据类型比如要根据 id 属性获得数据库中的某个字段值. mapper (dao)接口: // 根据 id 获得数据 ...

  4. 小程序与HTML5的区别

    小程序与传统HTML5还是有明显的区别,主要区别在于: 开发工具不同: 区别于H5的开发工具+浏览器Device Mode预览的模式,小程序的开发基于自己的开发者工具,可以实现同步本地文件+开发调试+ ...

  5. 3-7 彻底搞清楚unicode和utf8编码

  6. Springboot-webscoket with sockjs

    新建springboot maven工程,引入以下包 <dependency> <groupId>org.springframework.boot</groupId> ...

  7. python基础十一之迭代器和生成器

    可迭代 内置方法中含有__iter__的数据类型都是可迭代的,只要是可迭代的就可以使用for循环,反之亦然. print(dir('')) # dir()函数可以获取当前数据类型的所有内置方法 返回值 ...

  8. linux内核符号表

    我们已经看到 insmod 如何对应共用的内核符号来解决未定义的符号. 表中包含了全局内 核项的地址 -- 函数和变量 -- 需要来完成模块化的驱动. 当加载一个模块, 如何由模块 输出的符号成为内核 ...

  9. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  10. linux之旅首页

    为什么有此系列文章 目录 为什么有此系列文章 一直使用windows,决定使用linux作为操作系统. 使用此系列文章来记录我使用linux过程中遇到的问题,和应对方式 目录 安装linux