【C++入门】C++和C语言比较:新增的和有变化的关键字

2023-11-13

1、新增bool关键字

1.1、C语言的bool类型

#define true  (1)
#define false (0)

//C语言中的bool类型
typedef int bool

(1)bool类型也叫逻辑类型,只存在两个值:true和false;(true和false也是C++的关键字)
(2)在C语言中有bool类型这个概念,但是bool不是C语言的关键字,C语言原生并不支持bool类型,一般在C语言中,都是用typedef进行定义bool类型;
总结:在C语言中,bool就是int类型,只是为了便于理解才定义处bool类型变量

1.2、C++新增bool类型

(1)bool是C++的关键字,bool类型是C++原生就支持的类型,可以直接用bool关键字去定义bool类型变量;
(2)bool变量在C++中一般都是占1字节(和平台相关),用法和C语言没有区别;
总结:在C++中,bool和int是两个不同的数据类型,在函数重载机制中,bool类型传参和int类型传参会被识别成两个函数

1.3、C++中bool类型示例代码

#include <iostream>

using namespace std;


int main(void)
{
	int a, b, c;
	
	a = 4;

	bool b1 = !a;

	//用boolalpha 关键字打印bool类型会输出true或者false
	cout << boolalpha << b1 << endl;

	return 0;
}

2、C++新增字符类型:wchar_t

2.1、whcar_t类型介绍

(1)char类型一般占1字节,表示字符(ASCI或unicode字符);
(2)ASCI编码用一个字节表示字符,英文字符一般都是ASCI编码;unicode字符表示一个字符不止一个字节,因此能表示的字符更多,比如中文就是用unicode编码;
(3)wchar_t又叫宽字符,用于应对一个字符编码超过1字节的Unicode编码;
(4)wchar_t和char的数组都能存下unicode码,区别是需要几个单元才能存一个字;
(5)wchar_t占几个字节取决于具体实现,可能是unsigned short也可能是int;
(6)wchar_t要用wcin和wcout来输入输出,对应字符串为wstring;

2.2、指定具体字节数的字符类型

(1)char8_t (C++20 起) :无符号,每个字符类型占1字节;
(2)char16_t (C++11 起):无符号,每个字符类型占2字节;
(3) char32_t (C++11 起):无符号,每个字符类型占4字节;
(4)C++20起,新增字符串类u8string, u16string, u32string;

3、C++新增运算符代用关键字

逻辑运算 C语言 C++
逻辑与 && and
逻辑或 or ||
逻辑非 not !
位与 bitand &
位或 bitor |
位异或 xor ^
位于等于 and_eq &=
位或等于 or_eq |=
异或等于 xor_eq ^=
位取反 compl ~
不等于 not_eq !=

(1)在C++中C语言的逻辑运算符仍然可以使用,C++新增的运算符代用关键字便于理解和阅读;
(2)运算符代用关键字使用很简单,和C语言的逻辑运算符用法一样,就是在原来使用逻辑运算法的地方用运算符代用关键字替换就行;

4、C++新增的引用符&

参考博客:;

5、enum枚举

//C++11开始扩展的写法
//enumType:枚举体的名字
//valueType:每个枚举值的数据类型
//{one=xx, two, three}:定义每个枚举值,还可以赋初值

enum class enumType:valueType{one=xx, two, three};

(1)C++和C语言的enum枚举没有大的区别,C++兼容C中的枚举用法;
(2)C++11开始扩展的枚举写法,具体参见上面,但不是必须,可以继续使用原来的简写方法;
(3)C++中使用枚举类型时,可以省略enum关键字;

6、union共用体

(1)C++中union里成员除了普通的,还可以是对象,但是对象不能包含自定义构造函数、析构函数,简单说就是不能太复杂;
(2)C++中union类型定义后使用时可以省去union(和上节enum时一样);

7、inline关键字

class A
{ 
public:
 void Foo(int x, int y) { ... }   // 自动地成为内联函数,即使没有inline关键字 
}

C++新增的特性:
(1)定义在类声明中的成员函数将自动成为内联函数,即使没有inline关键字;
(2)如果在类中未给出成员函数定义,而又想内联该函数时,要在类外定义时加上inline,否则就认为不是内联的;

8、C++新增nullptr关键字

参考博客:《【C++入门】新增nullptr关键字详解》

9、新增静态断言

参考博客:《【C++入门】C/C++的(静态)断言用法总结》

10、C/C++内存对齐

10.1、C语言的内存对齐

(1)#pragma 和 attribute((packed)) attribute((aligned(n)));
参考博客:《嵌入式开发——#pragma pack()常见用法介绍》

10.2、C++新增内存对齐关键字

	//指定结构体s1的对齐字节数
	struct alignas(32) s1
	{
		char a;			// 1	+3		4
		int b;			// 4	+0		4
		double c;		// 8	+0		8
	};

	//获取s1的对齐字节数
	cout << "alignof xxx  = " << alignof(s1) << endl;
	
	cout << "sizeof xxx  = " << sizeof(s1) << endl;

(1)alignas:设置对齐字节数;
(2)alignof:获取当前结构体的对齐字节数;

11、C++新增typeid关键字

#include <iostream>
#include <typeinfo>

using namespace std;


int main(void)
{
	signed char a;		//  signed char类型的type.name是	"a"
	
	unsigned char b;
	
	if (typeid(a) == typeid(b))
		cout << "==" << endl;
	else
		cout << "!=" << endl;
	
	
	//打印变量a的类型
	cout << "a type = " << typeid(a).name() << endl;
	
	return 0;
}

(1)typeid用来判断变量的类型,类似于sizeof,使用时需要包含头文件typeinfo文件;
(2)typeid可用来返回静态类型,也可用来返回动态类型;
(3)typeid真正大用在引入class和继承后,并结合指针和引用后才能显现出来;

12、C++的4种cast转换

12.1、static_cast

(1)原生类型之间的隐式转换,可以用static_cast来明确告知编译器,避免警告,转换后会丢失精度(二进制会改变),正确性需要程序员自己保证;
(2)可以用与指针间的转换,将void *p转为具体的指针类型,或者取回原有的指针类型;
(3)用于类层次结构中父类和子类之间指针和引用的转换。其中上行转换时安全的,而下行转换时不安全的;

12.2、reintepret_cast

(1)明确告诉编译器此次转换别管,正确性由程序员自己负责;
(2)和static_cast的区别:reintepret_cast转换后二进制是原封不动的赋值,只是解释二进制的方式改变了,也就是说不会做隐式转换;
(3)reintepret_cast一般用于将指针转成int或者回转,将A类型指针转为B类型指针等;
(4)reintepret_cast其实就是让C++在本次转换中放弃严苛的编译器类型检查

12.3、const_cast

const_cast<type_id> (expression)

去掉或者添加const属性

12.4、dynamic_cast

(1)只用在父子class的指针和引用访问时的转换中,尤其是下行转换时;
(2)属于一种运行时转换机制,运行时才能知道转换结果是NULL还是有效对象;
(3)运行时确定对象类型RTTI(run time type indentification)是一种需求,C++有一套机制来实现;

13、自动类型推导:auto、decltype

参考博客:《C++11——自动类型推导》

14、 struct和class的对比

14.1、C和C++中struct的区别

(1)C中不支持成员函数(只能通过函数指针成员变量间接支持),而C++源生支持。
(2)C中不支持static成员,而C++中支持。后面会详细讲,C++ static class是一个大知识点
(3)访问权限,C中默认public,C++中默认public,但是可以显式指定public/private/protected三者之一
(4)继承特性上,C中不支持(只能通过结构体包含来间接实现),而C++源生支持,且struct和class可以互相继承
(5)初始化方面,C中靠初始化式(gcc扩展了初始化语法),而C++靠构造函数所以初始化更自由可定制化

14.2、C++中struct和class的区别

(1)默认成员权限,struct默认public,class默认private;
(2)继承关系的权限管控,struct默认public,class默认private;
(3)struct和class交叉继承时,默认的权限管控取决于子类而不是基类;
(4)模板相关使用都用class,而不用struct了;

15、static关键字

参考博客:《【C++入门】static关键字》

16、const和mutable关键字

参考博客:《【C++入门】const和mutable关键字、常函数介绍》

17、异常处理机制:try、throw、catch

参考博客:《【C++入门】C++的异常管理机制介绍》

18、constexpr关键字

constexpr int multiply (int x, int y)
{
    return x * y;
}
const int val = multiply( 10, 10 );		// 将在编译时计算

//等同于下面
const int val = 100;

(1)在编译时进行计算,利用编译时的计算能力,用于处理一些常量;
(2)会增加程序编译的时间,提高程序运行的效率;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++入门】C++和C语言比较:新增的和有变化的关键字 的相关文章

随机推荐

  • 国内访问github速度过慢的问题解决

    1 在浏览器上输入网址 http tool chinaz com dns 2 查询http github com 3 找到TTL值最低的响应IP 比如IP20 32 253 113的TTL值最低你就选这个IP 4 打开我的电脑 进入到C W
  • 粒子群算法组卷_CVRP问题求解(一)整数编码的粒子群算法

    CVRP问题求解 一 整数编码的粒子群算法 粒子群算法概述 粒子群算法 Particle Swarm Optimization 是由鸟群捕食得到启发的一种算法 在鸟类觅食过程中 每只鸟都会利用自身经验和群体信息来寻找食物 在觅食过程中 每只
  • 跳槽季到了,Linux运维跳槽40道面试精华题

    1 什么是运维 什么是游戏运维 1 运维是指大型组织已经建立好的网络软硬件的维护 就是要保证业务的上线与运作的正常 在他运转的过程中 对他进行维护 他集合了网络 系统 数据库 开发 安全 监控于一身的技术 运维又包括很多种 有DBA运维 网
  • C++寻找数组中的最大值

    include
  • OpenCV——高斯滤波

    目录 一 高斯滤波 二 C 代码 三 python代码 四 结果展示 1 原始图像 2 5x5卷积 3 9x9卷积 一 高斯滤波 高斯滤波是一种线性平滑滤波 适用于消除高斯噪声 广泛应用于图像处理的减噪过程 1 通俗的讲 高斯滤波就是对整幅
  • PC端页面适应不同的分辨率的方法

    上周完成一个PC端的项目 对于我这样的小白来说 这个项目里面最大的问题就是 如何做到让HTML页面适应电脑的不同分辨率 通过师傅的指导和自己查阅资料 最终成功适配不同的分辨率 完成了这个项目 现在回头再来看这个项目 突然发现适配不同的分辨率
  • js弹出窗口总结6种弹窗方法

    关闭 父窗口弹出对话框 子窗口直接关闭 this Response Write 关闭 父窗口和子窗口都不弹出对话框 直接关闭 this Response Write 弹出窗口刷新当前页面width 200 height 200菜单 菜单栏
  • 【图像处理】OpenCV截图小工具

    还存在一些小Bug 需要改进 include
  • 查询表结构信息sql

    select DQMS 库名 A Table Name 表名 C comments 表中文名 A column name 字段名 B comments 备注 A data type 数据类型 A data length 长度 A data
  • 基于SpringBoot左岸小区车位管理系统的设计与实现

    随着信息化时代的到来 管理系统都趋向于智能化 系统化 小区车位管理系统也不例外 但目前不少小区车位的管理仍都使用人工管理 小区规模越来越大 入住率越高 小区车辆信息量也越来越庞大 人工管理显然已无法应对时代的变化 而小区车位管理系统能很好地
  • STM32裸机串口接收方案

    点击下面 进入总目录索引 STM32系列精品Demo集 总目录 一 UART接收方案汇总 补充说明 上述接收方案中有协议帧 本协议帧指的是有帧头帧尾这种协议 不包含类似AT指令这种协议方案 二 UART丢包问题分析 2 1 裸跑机制 裸跑时
  • SpringBoot配置日志每天输出到指定文件

    在使用springboot搭建项目时 它内部引入了logback作为日志框架 默认只有info级别的控制台日志输出 在线上环境都是输出到文件的 并且每日一个文件夹 自动更换文件 文件内容超出一定大小 自动切分 并且以递增的序号排列 不同级别
  • 前端 JavaScript js PDF转img PDF转base64 PDF转图片

    需求是将前端加载的PDF转化到base64上传服务器
  • 【解决】当你不小心将桌面文件位置直接位移到D盘,且桌面上出现D盘所有目录的解决办法!!!

    首先能够出现这个问题的话 必定是你想要将桌面文件位置放在D盘 而不是系统默认的C盘 这样你在桌面显示的东西都可以是占用D盘的内存而不是C盘的内存 在这其中有些人可能出现失误出现了如题目所示的麻烦 我们直接进入主题 首先 在开始菜单搜索 re
  • 【内网穿透】远程访问后端编写中的接口,可用于前后端Swagger远程调试,和https微信开发测试

    之前在家和项目组的同学分开了 无法在同一个路由下通过访问局域网下的ip进行接口对接 只有借助第三方工具 开进行远程访问 NATAPP 我们可以在这个网址购买隧道 与自己电脑上配置后 便可以远程发问idea项目运行的的链接 其次由于连接支持h
  • 海康SDK:C3690 应该为字符串文本,但找到的是用户定义的字符串文本; C4430 缺少类型说明符 - 假定为 int

    海康SDK C 严重性代码说明项目文件行禁止显示状态错误 C3690 应该为字符串文本 但找到的是用户定义的字符串文本 Alarm严重性代码 说明 项目 文件行禁止显示状态错误 C4430 缺少类型说明符 假定为 int 注意 C 不支持默
  • JS面试——宏任务与微任务

    JavaScript的宏任务与微任务 1 问题的由来 2 JavaScript的宏任务与微任务 2 1promise的使用方法 2 2async与await的使用方法 3 面试题实战分析 程序执行顺序 参考文献 1 问题的由来 我相信 你也
  • GAMES101笔记_Lec07~09_着色 Shading

    0 我们已经学了什么 What We ve Covered So Far 空间中定义了一个摄像机 通过某些变换使模型摆好姿势 Model 通过观测变换让摄像机放在原点 得到标准的 1 1
  • EL&&JSTL

    一 JSP技术 1 jsp脚本和注释 jsp脚本 1 内部的java代码翻译到service方法的内部 2 会被翻译成servlet的成员的内容 jsp注释 不同的注释可见范围是不同 1 Html注释 可见范围 jsp源码 翻译后的serv
  • 【C++入门】C++和C语言比较:新增的和有变化的关键字

    1 新增bool关键字 1 1 C语言的bool类型 define true 1 define false 0 C语言中的bool类型 typedef int bool 1 bool类型也叫逻辑类型 只存在两个值 true和false tr