一、类型

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. 【CSS3】分类豆腐块菜单浮动效果

    HTML <html> <head> <title></title> <style type="text/css"> # ...

  2. hdu 4430 Yukari's Birthday (简单数学 + 二分)

    Problem - 4430 题意是,给出蜡烛的数量,要求求出r和k,r是蜡烛的层数,k是每一层蜡烛数目的底数. 开始的时候,没有看清题目,其实中间的那根蜡烛是可放可不放的.假设放置中间的那根蜡烛,就 ...

  3. Group_concat介绍与例子

    进公司做的第一个项目就是做一个订单追踪查询,里里外外连接了十一个表,作为公司菜鸡的我麻了爪. 其中有一个需求就是对于多行的数据在一行显示,原谅我才疏学浅 无奈下找到了项目组长  在那学来了这个利器 ( ...

  4. Node.js 安装及环境配置 以及google浏览器安装插件并使用

    一.安装环境 1.本机系统:Windows 10 企业版(64位)2.Node.js:node-v10.16.0-x64.msi(64位) 二.安装Node.js步骤 1.下载对应自己系统对应的 No ...

  5. H3C RIP可选配置

  6. 2018.11.25 齐鲁工业大学ACM-ICPC迎新赛正式赛题解

    整理人:周翔 A 约数个数(难) 解法1:苗学林  解法2:刘少瑞   解法3:刘凯  解法4:董海峥 B Alice And Bob(易) 解法1:周翔  解法2:苗学林  解法3:刘少瑞 C 黑白 ...

  7. es6笔记 day3---对象简介语法以及对象新增

    以前的老写法↓ 新写法来了↓ 提示:千万不要手贱,在里面去用箭头函数!!! -------------------------------------------------------------- ...

  8. 云栖深度干货 | 打造“云边一体化”,时序时空数据库TSDB技术原理深度解密

    本文选自云栖大会下一代云数据库分析专场讲师自修的演讲——<TSDB云边一体化时序时空数据库技术揭秘> 自修 —— 阿里云智能数据库产品事业部高级专家       认识TSDB 第一代时序时 ...

  9. 【Kubernetes】部署K8s-dashboard v1.10.1

    一.官方kubernetes-dashboard.yaml简介 ①首先认识一下官方的kubernetes-dashboard.yaml,我们先下载: https://github.com/kubern ...

  10. Jquery xhr2跨域

    相关享目托管在github: https://github.com/devgis/CSharpCodes