当前位置: 首页 > news >正文

C++:从C语言过渡到C++

在这篇博客中,我将会介绍从C语言过渡到C++的一些基础知识。

目录

C++起源

C++的关键字

输出hello,world

​编辑

命名空间

1.什么是命名空间

2.namespace的作用

3.域作用限定符

4.命名空间的使用

IO流

缺省参数

函数重载

引用

1.引用的定义

2.引用的特性

3.引用的使用

4.const引用

5.引用和指针

内联函数inline

nullptr


C++起源

1979年本贾尼·斯特劳斯特卢普在贝尔实验室中进行复杂的软件开发时,他感受到了C语言的局限性,于是他在此基础上设计了C++。

C++在C语言的基础上添加了面向对象编程的特性:封装、继承、多态。

随后几年,C++不断完善发展,在1998年推出了C++98,官方第一个较为完善的版本,引入了STL(标准模板库)。

2011年,C++的一次革命性的更新,增加了大量特性和功能

2020年,C++又一次巨大更新,引入了模板(Modules)、概念(Concepts)、协程(Coroutines)

在公司中,使用的比较多的都是C++98和C++11.

C++的关键字

输出hello,world

#include<iostream>
using namespace std;int main()
{cout << "hello,world!" << endl;return 0;
}


命名空间

1.什么是命名空间

命名空间需要用一个关键字namespace后跟命名空间的名字,然后用{}括起来,在里面可以定义变量、函数、自定义类型,即为命名空间的成员


2.namespace的作用

在C/C++中,变量、函数、类是大量存在的,这些名称在全局域中可能会重复从而引发冲突

#include<stdlib.h>
int rand = 15;int main()
{//这里会报编译错误,“rand” : 重定义;以前的定义是“函数”	printf("%d\n", rand);return 0;
}

C++中域有函数局部域,全局域,命名空间域,类域。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期命名空间域类域不影响变量生命周期。

namespace会定义一个域,也就是命名空间域,它与全局域独立,不同的域可以存在同名变量

我们可以将rand放于一个命名空间域,从而修正上述问题。

namespace只能定义在全局,当然他还可以嵌套定义

项目工程中多文件中定义同名namespace会认为是⼀个同namespace,不会冲突。


3.域作用限定符

既然有不同的有不同的域,那我们可以通过域作用限定符::)l来访问域中的成员变量。

::默认访问全局域;在其左侧加上域名就是访问该名字的域,如上面代码,Moss::rand就时访问的Moss域中的rand变量。


4.命名空间的使用

namespace的使用主要分为两种:

1.指定命名空间访问,实际项目中推荐这种。

2.使用关键字using命名空间的某个成员或者全部成员展开

C++标准库都放在⼀个叫std(standard)的命名空间中。

#include<iostream>
using namespace std;//展开std中的所有成员

IO流

IO流其实就是输入输出流,与之相关的头文件就是<iostream>。

<iostream>:Input Output Stream,标准输入输出流库,定义了标准输入输出对象。

std标准库就被包含在其中。

cout、cin、endl都属于C++标准库(std)

cout:用于屏幕输出

cin:用于键盘输入

endl:输出时,增加换行符('\n')

<<是流插入运算符,>>流提取运算符。(在C语言是左移/右移运算符)。

cout和cin的输出输入通过函数重载实现自动识别变量类型,无须像C语言那样指定格式。

使用格式如下:


缺省参数

缺省参数就是在声明或者定义函数时为函数的实参指定一个默认值无参数调用函数时,函数就会使用该默认值

需要注意的几个点:

1.当函数声明和定义分离时,缺省参数只能在函数声明出现,函数定义不能使用缺省参数。

2.缺省参数的指定在函数的声明或者定义中,规定缺省参数必须从右往左依次指定不能跳跃给缺省参数。

3.对于带缺省参数的函数调用从左往右依次传实参不能跳跃传

4.全缺省:全部形参给缺省值。

半缺省:部分形参给缺省值。


函数重载

函数重载同一作用域中出现同名函数,但是这些函数的形参各不相同

函数重载允许返回值的类型相等,但是返回值的类型不同 不能作为函数重载的标识

1.参数类型不同

2.参数个数不同

3参数类型顺序不同

接下来我们看一个需要警惕的坑

上面这两个函数构成函数重载,因为参数个数不同,但是这两个函数存在调用歧义,调用F()函数时,编译器不知道调用哪个函数。


引用

1.引用的定义

引用:给一个存在变量取别名引用变量原变量共用一块内存空间。

语法形式:类型& 引用的别名 = 引用对象

这里a、b、c、d都是共用一块内存空间的

2.引用的特性

1.引用的变量必须初始化

2.一个变量可以多个引用

3.引用一旦引用了一个变量,就不得再引用其他变量。(引用的指向不允许更改

int a = 5;//编译错: ra必须初始化引用
//int& ra;int& b = a;int c = 10;
//这里是赋值,将c的值赋给b(a),不是改变引用的指向
b = c;

3.引用的使用

1.引用传参

2.做返回值

引用传参:

引用传参表面上是传值,但实际上传的是地址,只不过是编译器帮做了。

void Swap(int& x, int& y)//引用传参 可以替换 传址调用
{int tmp = x;x = y;y = tmp;
}

4.const引用

引用一个const对象时,必须const引用,否则就会权限放大,权限不允许放大,但可以缩小

const int a = 10;
//权限不能放大,必须用const引用
//int& ra = a;
const int& ra = a;int b = 5;
//权限缩小是可以的
const int& rb = b;

临时对象:编译器在一块空间暂存表达式的结果时临时创建的未命名的对象

临时对象的引用:临时对象具有常性,也必须用const引用。(不用const引用就会触发权限放大,然后就报错)

int a = 4;
const int& ra = a * 3;//a * 3的结果存放在临时变量中,得用const引用double d = 3.14;
const int& rd = d;//类型转换产生的中间值也存放在临时变量中,也得用const引用

5.引用和指针

1.引用必须初始化,不开空间指针存储变量地址,语法上可以不初始化(nullptr),但是要开空间

2.引用的指向不能改变,而指针可以随意更改

3.引用直接访问对象,指针要解引用。

4.sizeof的结果不同,引用结果为类型大小,但指针只跟多少位系统有关(32位4个字节,64位8个字节)

5.使用引用相对安全,指针容易出现空指针和野指针的问题。


内联函数inline

定义:用inline修饰的函数就是内联函数

作用:内联函数在调用的时候,编译器会在调用的地方展开内联函数,这样就不需要建立函数栈帧,以便提高效率。

所以我们通过作用就很容易想到,内联函数设计出来是为了代替C语言的宏函数,而替代的原因是宏函数的实现很容易出错。

//正确的宏实现
#define ADD(x, y) ((x) + (y))
// 为什么不能加分号?
// 为什么要加外面的括号?
// 为什么要加里面的括号?
//保证优先级
int main()
{cout << ADD(1, 2) * 5 << endl;int x = 1, y = 2;ADD(x & y, x | y);// ->(x&y + x|y)//+的优先级比& | 高,所以里面也要加括号return 0;
}

需要注意的点:

1.inline对于编译器只是建议,并不是说加了一定会在调用的地方被展开,一般来说,inline适用于简短而又被频繁调用的函数,对于代码较多的函数,加了inline也会被编译器忽略。

2.inline不推荐函数声明和定义分离到两个文件,如果inline函数被展开,链接时就会报错

 vs编译器在debug版本下默认不展开inline,以便调试。


nullptr

在C语言中,空指针NULL实际上是一个宏

NULL的使用不可避免存在一定的问题,本想调用指针版本的F(int* ptr),但是NULL被定义成0,从而调用了F(int x)版本,这有违初衷。

因此在C++中新增关键字nullptr,它可以转换任意类型的指针类型。

nullptr只能被隐式转换为指针类型,不能转换为整数类型,所以nullptr定义空指针可以避免类型转换。


拜拜,下期再见😏

摸鱼ing😴✨🎞

相关文章:

C++:从C语言过渡到C++

在这篇博客中&#xff0c;我将会介绍从C语言过渡到C的一些基础知识。 目录 C起源 C的关键字 输出hello&#xff0c;world ​编辑 命名空间 1.什么是命名空间 2.namespace的作用 3.域作用限定符 4.命名空间的使用 IO流 缺省参数 函数重载 引用 1.引用的定义 2.引…...

在安卓中使用FFmpeg录制摄像头的视频并保存到本地MP4文件

在移动应用开发中&#xff0c;有时需要利用设备的摄像头录制视频&#xff0c;并且希望在录制过程中能够精确控制视频的质量、格式和时长。FFmpeg作为一个强大的多媒体处理工具&#xff0c;提供了广泛的功能和选项&#xff0c;能够帮助我们实现这样的需求。 添加依赖 在安卓平台…...

Vue从零到实战第一天

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

BUUCTF - Basic

文章目录 1. Linux Labs 【SSH连接漏洞】2. BUU LFI COURSE【文件包含漏洞】3. BUU BRUTE【暴力破解用户名密码】4. BUU SQL COURSE【SQL注入-当前数据库】5. Upload-Labs-Linux 1【文件上传漏洞】7. Buu Upload Course 1【文件上传包含漏洞】8. sqli-labs 1【SQL注入-服务器上…...

如何理解Node.js?NPM?Yarn?Vue?React?

一、背景 对后端技术栈更熟悉&#xff0c;对前端技术栈不了解&#xff0c;希望通过前后端的技术栈进行对比&#xff0c;可以更直观地了解前端技术栈。 二、Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行环境。它使得 JavaScript 可以在服务器端运…...

苹果入局,AI手机或将实现“真智能”?

【潮汐商业评论/原创】 “AI应用智能手机不就是现在的AI手机。” 当被问到现阶段对AI手机的看法时&#xff0c;John如是说。“术业有专攻&#xff0c;那么多APP在做AI功能&#xff0c;下载用就是了&#xff0c;也用不着现在换个AI手机啊。” 对于AI手机&#xff0c;或许大多…...

AI网络爬虫019:搜狗图片的时间戳反爬虫应对策略

文章目录 一、介绍二、输入内容三、输出内容一、介绍 如何批量爬取下载搜狗图片搜索结果页面的图片?以孙允珠这个关键词的搜索结果为例: https://pic.sogou.com/pics? 翻页规律如下: https://pic.sogou.com/napi/pc/searchList?mode=2&start=384&xml_len=48&am…...

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

当 Windows 网络出现本机故障时&#xff0c;一般从以下两个方面解决&#xff1a;网络栈和使用网络栈的组件或程序。 1、Winsock 组件问题 以管理身份运行 cmd&#xff0c;输入以下命令 netsh winsock reset重置 Winsock 组件以修复网络连接问题。 Winsock 是 Windows 操作系…...

100 个网络基础知识普及,看完成半个网络高手!

1&#xff09;什么是链接&#xff1f; 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2&#xff09;OSI 参考模型的层次是什么&#xff1f; 有 7 个 OSI 层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0…...

高盛开源的量化金融 Python 库

GS Quant GS Quant是用于量化金融的Python工具包&#xff0c;建立在世界上最强大的风险转移平台之一之上。旨在加速量化交易策略和风险管理解决方案的开发&#xff0c;凭借25年的全球市场经验精心打造。 它由高盛的定量开发人员&#xff08;定量&#xff09;创建和维护&#…...

【Linux】docker和docker-compose 区别是什么

Docker 和 Docker Compose 是用于容器化应用的工具,它们在开发、部署和管理容器化应用程序时有不同的作用。以下是对它们的简要介绍和功能描述: Docker 定义: Docker 是一个开源的平台,允许开发者自动化地部署、扩展和管理应用程序容器。容器是一种轻量级、可移植、独立的软…...

Qt图片缩放显示

在Qt中&#xff0c;如果你想显示图片的像素或者对图片进行缩放显示&#xff0c;可以使用 QImage 类来处理图片数据&#xff0c;并使用 QLabel 或自定义的 QWidget 来显示图片&#xff0c;但是很难通过鼠标进行缩放显示 QGraphicsView可以实现此功能 在Qt中&#xff0c;QGraphi…...

47、lvs之DR

1、DR模式&#xff1a; 1.1、lvs三种模式&#xff1a; nat 地址转换 DR 直接路由模式 tun 隧道模式 1.2、DR模式的特点&#xff1a; 调度器在整个lvs集群当中是最重要的&#xff0c;在nat模式下&#xff0c;即负载接收请求&#xff0c;同时根据负载均衡的算法转发流量&…...

分布式技术栈、微服务架构 区分

1.分布式技术栈 这些技术栈都是为了更好的开发分布式架构的项目。 &#xff08;大营销平台的系统框架如下图&#xff0c;扩展的分布式技术栈&#xff09; &#xff08;1&#xff09;Dubbo——分布式技术栈 DubboNacos注册中心是应用可以分布式部署&#xff0c;并且提供RPC接…...

【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流

文章目录 一、输入流1.1 InputStream 概述&#xff1a;1.2 read 方法详解&#xff1a;1.3 close 方法&#xff1a;1.4 利用 Scanner 进行读操作&#xff1a;1.5 Reader&#xff1a; 二、输出流2.1 OutputStream 概述&#xff1a;2.2 write 方法详解&#xff1a;2.3 利用 PrintW…...

C++ 指针变量做参数传递时的情况分析

前言 指针变量作为参数传递时&#xff0c;很容易混淆指针本身和指针指向的内容&#xff0c;实际应用中可能会导致无法预料的问题&#xff0c;所以做一下详细分析。 注意&#xff0c;在测试过程中为了看测试效果&#xff0c;有些指针变量分配了空间&#xff0c;但是未做回收&am…...

Linux环境下Oracle 11g的离线安装与配置历程

在成功体验了 Windows 版本的Oracle 11g 后&#xff0c;这几天心血来潮&#xff0c;决定再挑战一下Linux 环境下的安装&#xff0c;特别是在考虑到部门内部虚拟机无法联网的情况下&#xff0c;我选择了在CentOS 7上进行离线安装。这次安装之旅&#xff0c;主要参考了下面大佬的…...

上位机图像处理和嵌入式模块部署(mcu项目2:串口日志记录器)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 淘宝上面有一个商品蛮好玩的&#xff0c;那就是日志记录器。说是记录器&#xff0c;其实就是一个模块&#xff0c;这个模块的输入是一个ttl串口&am…...

容器是线程不安全的,如果多线程下不加锁直接使用容器会发什么

可能存在的问题 数据竞争 当两个或多个线程同时读写同一个容器且至少有一个线程在写时&#xff0c;会导致数据竞争。这种情况下&#xff0c;容器的内部状态可能会被破坏&#xff0c;从而导致未定义行为。这些未定义的行为包括数据损坏&#xff0c;程序崩溃&#xff0c;以及无…...

配置光源——笔记

一、灯光的类型 (一&#xff09;Directional Light&#xff08;定向光&#xff09; 1、只改变方向变化&#xff0c;不记录位置变化 2、相当于太阳光 3、室外一般使用 (二&#xff09;Spot 聚光灯&#xff1a;昏暗&#xff08;凌晨或傍晚&#xff09;&#xff0c;有一个光斑…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...