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:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
随机推荐
- JavaScript 数组去重和对象相等判断
前几天电话面试问到了数组去重和两个对象相等判断,当时回答的不是特别好,都过去好几天了,总结下. 1.数组去重 当时的问题是这样的有个简单的数组[1,1,2,3],去重后的结果是[1,2,3],怎么实现 ...
- KMPnext数组运用、最小循环节问题
http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html http://www.cnblogs.com/wuyiqi/archive/ ...
- pytorch 状态字典:state_dict 模型和参数保存
pytorch 中的 state_dict 是一个简单的python的字典对象,将每一层与它的对应参数建立映射关系.(如model的每一层的weights及偏置等等) (注意,只有那些参数可以训练的l ...
- 教你如何成为Spark大数据高手?
教你如何成为Spark大数据高手? Spark目前被越来越多的企业使用,和Hadoop一样,Spark也是以作业的形式向集群提交任务,那么如何成为Spark大数据高手?下面就来个深度教程. Spark ...
- [转]【译】.NET Core 3.0 中的新变化
.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...
- SVN常用命令之checkout
官方解释,请参考:http://www.subversion.org.cn/svnbook/nightly/svn.ref.svn.c.checkout.html 常用检出命令: svn co htt ...
- P1062 差K素数对
题目描述 给你两个数 n 和 k ,请求出所有小于等于 n 的相差为 k 的素数对. 输入格式 两个正整数n,k.1<=k<=n<=10000. 输出格式 所有小于等于n的素数对.每 ...
- HDU 3974 Assign the task
Assign the task Problem Description There is a company that has N employees(numbered from 1 to N),ev ...
- 2019-11-20-Github-给仓库上传-NuGet-库
title author date CreateTime categories Github 给仓库上传 NuGet 库 lindexi 2019-11-20 08:18:14 +0800 2019- ...
- 研发环境容器化实施过程(docker + docker-compose + jenkins)
目录 背景介绍 改造思路 容器构建 基础准备 中间件容器 外部依赖容器 业务应用容器 容器整合 自动构建容器 Maven相关 非Maven项目 总结 背景介绍 目前公司内部系统(代号GMS)研发团队, ...