C++ | C++ 基础知识 | 类型与声明
一、类型
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++ 基础知识 | 类型与声明的更多相关文章
- Typescript 基础知识
Typescript 就是 Javascript 的超集,所以首先你要知道 Javascript 基础知识 类型注解 类型注解在TypeScript中是记录函数或变量约束的简便方法. // 布尔值 l ...
- Go语言基础知识总结(持续中)
Go基础知识总结 变量声明 Go语言中的变量需要声明以后才可以使用(需要提前定义变量)并且声明后必须使用(不适用会报错) 标准声明 var 变量名 变量类型 example: var name str ...
- 快速掌握JavaScript面试基础知识(三)
译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...
- Java基础知识➣环境搭建与类型整理(一)
概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以 ...
- C#基础知识1-深入理解值类型和引用类型
C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- [C++学习历程]基础部分 C++中的类型和声明
前面搭起了C++的VS环境,可以在VS中编写C++代码了,也运行了最简单的一个程序Helloworld.那么我们该怎么才能写出功能强大的程序,怎样才能随心所欲的应用呢,那就需要重新回头来,从C++基础 ...
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
随机推荐
- [学习笔记]整体DP
问题: 有一些问题,通常见于二维的DP,另一维记录当前x的信息,但是这一维过大无法开下,O(nm)也无法通过. 但是如果发现,对于x,在第二维的一些区间内,取值都是相同的,并且这样的区间是有限个,就可 ...
- wpf 登录时显示状态动态图
下面的示例演示了如何在登录过程时,界面上显示状态图标,登录完成后隐藏图标: public partial class MainWindow : Window { public MainWindow() ...
- 2018-2-13-C#-枚举转字符串
title author date CreateTime categories C# 枚举转字符串 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...
- PHP Warning: Module 'json' already loaded in Unknown on line 0
Zend加密文件.启动服务器后无法正常运行加密后的文件.处理方法: 某台服务器上跑着php 5.3.8,线上服务运行正常. 某天拆分php错误日志时,发现其中有一段连续的错误信息. [14-Feb ...
- git clone出现Permission denied (publickey)解决办法
一.错误 git clone git@gitee.com:wangzaiplus/xxx.git, 出现Permission denied (publickey) 二.原因 无权限, 未将公钥添加至G ...
- pip安装python包时报字符编码错
比如安装scikit-learn时报错: django ascii’ codec can’t encode character 原因是用户目录或用户名存在中文,ascii不能解码,解决办法是在Pyth ...
- UPC个人训练赛第十五场(AtCoder Grand Contest 031)
传送门: [1]:AtCoder [2]:UPC比赛场 [3]:UPC补题场 参考资料 [1]:https://www.cnblogs.com/QLU-ACM/p/11191644.html B.Re ...
- Delphi中的Val函数和iif函数(出错的时候,会有索引值)
在delphi中Val是一个将字符串转换为数字的函数,Val(S; var V; var Code: Integer)第一个参数是要转换的字符串,第二个参数存放转换后的数字,可以是整数或浮点数,第三个 ...
- 33.python之操作系统,进程,线程
转载:https://www.cnblogs.com/yuanchenqi/articles/6248025.html 操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存, ...
- Django 中配置MySQL数据库
在Django的项目中会默认使用sqlite的数据库 配置MySQL需要在setting.py 里加入以下设置: 配置数据库 DATABASES = { 'default': { 'ENGINE': ...