一、类型

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. CSS像素设置为整数,渲染结果像素带有小数

    今天进行网页设计学习时,CSS代码设计width:300px,但实际显示像素如下图所示为199.99px. 最后发现是浏览器运用了缩放,恢复100%的缩放后,像素显示为整数.

  2. C#的选择语句练习(二)

    1.输入a,b,c三个数,计算一元二次方程ax²+bx+c的根:若a=0,则不是一元二次方程:△=b²-4ac,根的计算公式为-b±√b²-4ac/2a:若△=b²-4ac>0,则方程有两个不一 ...

  3. NLP进阶之(七)膨胀卷积神经网络

    NLP进阶之(七)膨胀卷积神经网络1. Dilated Convolutions 膨胀卷积神经网络1.2 动态理解1.2.2 转置卷积动画1.2.3 理解2. Dilated Convolutions ...

  4. 洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链, ...

  5. mysql基础(库、表相关)

    一. mysql支持的数据类型 1.1 mysql支持的数字类型: TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767 ...

  6. Linux下FTP的安装和登陆

    对于一个经常接触电脑的人来说,FTP无形中出现在我们生活的各个角落.日常生活中的文件上传和下载很多时候就是依靠FTP去实现的. 专业的说,FTP 是File Transfer Protocol(文件传 ...

  7. Laravel5 call to undefined function openssl cipher iv length() 报错 PHP7开启OpenSSL扩展失败

    在安装laravel5.5后, 访问显示报错. call to undefined function openssl cipher iv length() 经查为php7.1的OpenSSL扩展加载失 ...

  8. UVA 11992 ——线段树(区间修改)

    解题思路: 将矩阵每一行建立一棵线段树,进而变成一维问题求解.注意数组要开 4*N 代码如下: #include <iostream> #include <cstdio> #i ...

  9. 深度学习——GAN

    整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 思想 表达式 实际计算 ...

  10. records

    2019年数据地址备份: three.js 实例在NextWebProject/static/canvas下边! qlgj 在NextWebProject下边!