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

C++修炼之路:初识C++

        Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!

我的博客:<但凡.

我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》

欢迎点赞,关注!

引言

        ‌C++‌,通常被称为“C加加”,是一种由Bjarne Stroustrup在1983年开发的通用编程语言。它是由C语言扩展升级而来,支持面向对象程序设计、过程化程序设计等多种编程范式。‌

        C++的应用领域服务器端、游戏(引擎)、机器学习引擎、音视频处理、嵌入式软件、电信设备、金融 应用、基础库、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面都有。

        本篇文章作为c++基础教学的第一篇,将带大家认识和简单使用c++。


1、C++的第一个程序

        万物始于hello world.现在我们来用c++写一个hello world:

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

        我们来分析一下这个程序:首先和C语言一样,上来先包括一个头文件。这里我们包过的头文件是iostream库,意思是输入输出流。里面包含着c++最常用的输入和输出

        接下来一行叫展开命名空间。只有展开的这个明明空间我们的iostream库里的函数才能随便使用。当然了至于什么是命名空间以及为什么要展开我们下文再谈。

        下面一行和我们的c语言一样,都是int main。这里的int main和C语言中的一样就不过多赘述了。

        接下来一行是输出hello world这个字符串。cout是iostream库中提供的输出函数。用法就是cout<<输出内容。后面的endl是换行(endline),但和C语言里面的\n不用,endl是一个函数

2、命名空间

2.1命名空间的定义及使用

        命名空间namespace存在的意义是为了解决命名冲突。在C语言中实现这个代码

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

        会报错。报错的原因就是我们自己定的变量rand和C语言自带的库函数冲突了。这时候编译器就无法识别了。这其实是C语言的不足之处。而c++中的命名空间就完美的解决了这个问题。

        想想一下这个场景。小张和小王同时进行一个项目,但是他俩写的函数名有时候会相同,不如小张的加法函数叫test,小王的乘法函数叫test,那这时候都不用和系统自带的函数冲突了,两个人写的函数就已经冲突了。这个时候namespace的用处就来了。我们把小张和小王的代码写成下面这样:

#include<iostream>
using namespace std;
namespace mrZhang
{int test(int x, int y){return x + y;}
}
namespace mrWang
{int test(int x, int y){return x * y;}
}
int main()
{int a = mrZhang::test(1, 5);int b = mrWang::test(1, 5);cout << a << " " << b;return 0;
}

输出一下,分别是6和5,小张和小王的代码可以毫不冲突的正常使用了。

        其实命名空间本质上是定义出一个域,我们小张和小王各有一个域,那他们从自己的域里面调用自己的函数不就毫不冲突了吗?

        在调用的时候,我们只要用 空间名::函数名 这样的格式来调用。

        命名空间还可以进行嵌套,比如这样:

#include<iostream>
using namespace std;
namespace mrZhang
{int test(int x, int y){return x + y;}namespace mrWang{int test(int x, int y){return x * y;}}}
int main()
{int a = mrZhang::test(1, 5);int b = mrZhang::mrWang::test(1, 5);cout << a << " " << b;return 0;
}

        输出结果仍然是6和5。

        命名空间中不止可以定义函数,也可以定义变量和自定义类型。这样的话你自己定义的变量也可以和别的同名变量毫不冲突了。

        另外在多文件中可以定义同名的命名空间。这样的话他们就会合成一个命名空间。

2.2命名空间的展开

        现在看我们第一个helloworld程序,第二行的using namespace std;就是展开命名空间。正常我们使用输入输出函数是这样的:

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

        当我们程序比较简单,不会出现冲突的命名的时候就可以把命名空间展开。

        比如平时的简单练习程序,或者算法题,我们就可以直接Using namespace std;把命名空间展开直接使用c++自带的函数。

        我们也可以只展开一个命名空间中的某个变量或函数,这样的话访问这个变量或函数就更简便了:

#include<iostream>
using namespace std;
namespace mrZhang
{int test(int x, int y){return x + y;}
}
using mrZhang::test;
int main()
{int a = test(1, 5);cout << a;return 0;
}

3、缺省参数

        缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时,如果没有指定实参 则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。

        缺省参数又叫默认参数。

比如我们定义一个这样的函数:

int test(int x=2, int y=6)
{return x + y;
}

        我们调用这个函数但是不传入实参,返回结果就是8.

        如果再调用时我们传入实参1和2,那么返回值就是1+2=3。

需要注意三点:

        1、缺省参数必须从右往左给。比如上面的程序,我们只给x缺省参数但不给y缺省参数这样其实是不合法的。

        2、函数实参一定是从左往右给函数的。

        3、函数声明和定义分离时,不能在声明和定义中同时给缺省值。

比如这样,其实是不合法的:

#include<iostream>
using namespace std;int test(int x = 1, int y = 2);
int main()
{int a = test();cout << a;return 0;
}
int test(int x = 1, int y = 2)
{return x + y;
}

        我们只能在声明中给,不能在定义中给。

4、函数重载

        在c++中允许出现同名函数,但是同名函数的返回值或者形参类型或形参个数必须有一个不同。在调用函数时,c++可以根据传入实参的类型自动选择正确的函数。比如这样:

#include<iostream>
using namespace std;int test(int x , int y )
{return x + y;
}
double test(double x, double y)
{return x + y;
}
int main()
{double x = 1.5, y = 2.8;int a = test(1,2);double b = test(x, y);cout << a <<" "<< b ;return 0;
}

5、引用

5.1引用的介绍

        引用其实就是给我们已有的一个变量去别名。并不会开辟新的空间。它的使用格式是这样的:类型&引用别名=引用对象;

        就像每个人都有大名和乳名一样,我叫这两个名字其实指的人都是一个。比如这样:

int i = 5;
int& j = i;

        此时我们改变j就相当于改变了i。那这个东西有什么意义呢?回想我们在C语言阶段学习指针的时候,交换两个数的函数得用指针变量做形参。有了引用这个东西,我们就可以这样写交换函数

void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}

        怎么样,是不是方便了很多呢?

        其实引用的底层也是指针。所以说通过引用我们能够改变原值。

5.2引用的特性

        1、引用必须在定义时初始化。比如int& a=0;这句代码其实是不合法的。

        2、一个变量可以有多个引用。

        3、引用一旦引用一个实体,再不能引用其他实体。

比如下面这串代码:

#include<iostream>
using namespace std;int main()
{int a = 10;int& b = a;int c = 20;b = c;cout << &a <<" "<< &b <<" "<< &c << endl;cout << a <<" "<< b <<" "<< c << endl;return 0;
}

        我们进行了b=c的操作,只是把c的值赋值给了b,但并没有改变b的引用实例,正因此a和b地址是相同的。

5.3引用的使用

        引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被 引用对象。

        引用传参我们已经介绍过了,现在我们介绍一下引用做返回值。

int STTop(ST& rs)
{assert(rs.top > 0);return rs.a[rs.top];
}
int main()
{ST st1;STInit(st1);STPush(st1, 1);STPush(st1, 2);STTop(st1)+=10;return 0;
}

        我们截取了一部分之前栈的操作,发现对于STTop(st1)+=10;这个操作是无法达到目的的。

我们想的是让栈顶的数据加上10,但是实际上栈顶的数据并没有改变。

        这是因为咱们返回的是一个值,相当于我们把原来的数拷贝出了他的值然后返回了,就算把这份拷贝的值加上10也无法改变原来的栈顶数据。而且实际上值的拷贝具有常性,根本就无法改变,导致这个程序报错。所以从哪个角度来说栈顶数据都无法被更改。

        但是我们如果是引用返回的话,就可以成功改变栈顶的值,因为我们是直接对栈顶这个区域进行的操作。 

5.4、const引用

        const对象必须用const引用,普通对象也可以用const引用,但普通引用引用不了const对象。       

        这涉及到权限的问题。普通对象是一个变量,可以被改变的,所以他的权限更低。而const对象不能被改变所以他的权限更高。普通引用引用const对象权限就放大了,所以编译器会报错。反过来const引用可以引用普通对象,因为权限是可以缩小的。

6、inline内联 

        由于C语言中宏函数设计的不足,c++中inline的诞生就是为了代替宏函数。

#include<iostream>
using namespace std;
inline int add(int x,int y)
{return x + y;
}
int main()
{cout << add(1, 5) << endl;return 0;
}

        对于短小的函数,inline操作会使函数在编译时展开,可以提高效率。但是如果这个函数过长就不适合使用内联了,过长的函数内联反而会降低时间,甚至,有的编译器防止用户内联过长的函数,就算内联了,也不会起内联的作用。

        注意,内联函数的定义和声明必须在同一个文件。

        好了,今天的内容就分享到这,我们下期再见!

 

 

相关文章:

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …...

Pytorch 第九回:卷积神经网络——ResNet模型

Pytorch 第九回&#xff1a;卷积神经网络——ResNet模型 本次开启深度学习第九回&#xff0c;基于Pytorch的ResNet卷积神经网络模型。这是分享的第四个卷积神经网络模型。该模型是基于解决因网络加深而出现的梯度消失和网络退化而进行设计的。接下来给大家分享具体思路。 本次…...

2025-3-9 一周总结

目前来看本学期上半程汇编语言,编译原理,数字电路和离散数学是相对重点的课程. 在汇编语言和编译原理这块,个人感觉黑书内知识点更多,细节更到位,体系更完整,可以在老师讲解之前进行预习 应当及时复习每天的内容.第一是看书,然后听课,在一天结束后保证自己的知识梳理完整,没有…...

如何在el-input搜索框组件的最后面,添加图标按钮?

1、问题描述 2、解决步骤 在el-input组件标签内&#xff0c;添加一个element-plus的自定义插槽&#xff0c; 在插槽里放一个图标按钮即可。 3、效果展示 结语 以上就是在搜索框组件的末尾添加搜索按钮的过程。 喜欢本篇文章的话&#xff0c;请关注本博主~~...

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯&#xff08;飞控部分&#xff09;六.移植2.4g通讯&#xff08;遥控部分&#xff09; 一.Si24Ri原理图 Si24R1芯片原理图如下&#xff1a; 右侧为晶振。 模块…...

Python爬取咸鱼Goodfish店铺所有商品接口的详细指南

在电商数据分析和市场研究中&#xff0c;爬取咸鱼店铺内的所有商品信息是一项极具价值的任务。通过调用咸鱼的goodfish.item_search_shop接口&#xff0c;可以获取指定店铺内的商品列表&#xff0c;包括商品标题、价格、图片链接、销量等详细信息。本文将详细介绍如何使用Pytho…...

【极光 Orbit•STC8A-8H】03. 小刀初试:点亮你的LED灯

【极光 Orbit•STC8H】03. 小刀初试&#xff1a;点亮你的 LED 灯 七律 点灯初探 单片方寸藏乾坤&#xff0c;LED明灭见真章。 端口配置定方向&#xff0c;寄存器值细推敲。 高低电平随心控&#xff0c;循环闪烁展锋芒。 嵌入式门初开启&#xff0c;从此代码手中扬。 摘要 …...

docker本地部署RagFlow

1.安装 克隆仓库 git clone https://github.com/infiniflow/ragflow.git构建预建的Docker映像并启动服务器 cd ragflow/docker chmod x ./entrypoint.sh docker compose -f docker-compose.yml -p ragflow up -d修改ragflow/docker/.env文件 #RAGFLOW_IMAGEinfiniflow/ragfl…...

STM32F4 UDP组播通信:填一填ST官方HAL库的坑

先说写作本文的原因&#xff0c;由于开项目开发中需要用到UDP组播接收的功能&#xff0c;但是ST官方没有提供合适的参考&#xff0c;使用STM32CubeMX生成的代码也是不能直接使用的&#xff0c;而我在网上找了一大圈&#xff0c;也没有一个能够直接解决的方案&#xff0c;deepse…...

基于python大数据的招聘数据可视化与推荐系统

博主介绍&#xff1a;资深开发工程师&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有…...

10. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--认证

在微服务架构中&#xff0c;通过在网关层实现身份认证、权限校验和数据加密&#xff0c;可以有效防范恶意攻击和非法访问&#xff0c;保障内部服务安全。采用JWT、OAuth等主流认证机制&#xff0c;使每次请求均经过严格验证&#xff0c;降低安全漏洞风险。同时&#xff0c;统一…...

DeepSeek 3FS:端到端无缓存的存储新范式

在 2025 年 2 月 28 日&#xff0c;DeepSeek 正式开源了其高性能分布式文件系统 3FS【1】&#xff0c;作为其开源周的压轴项目&#xff0c;3FS 一经发布便引发了技术圈的热烈讨论。它不仅继承了分布式存储的经典设计&#xff0c;还通过极简却高效的架构&#xff0c;展现了存储技…...

vue3组合式API怎么获取全局变量globalProperties

设置全局变量 main.ts app.config.globalProperties.$category { index: 0 } 获取全局变量 const { appContext } getCurrentInstance() as ComponentInternalInstance console.log(appContext.config.globalProperties.$category) 或是 const { proxy } getCurrentInstance…...

【YOLOv12改进trick】多尺度大核注意力机制MLKA模块引入YOLOv12,实现多尺度目标检测涨点,含创新点Python代码,方便发论文

🍋改进模块🍋:多尺度大核注意力机制(MLKA) 🍋解决问题🍋:MLKA模块结合多尺度、门控机制和空间注意力,显著增强卷积网络的模型表示能力。 🍋改进优势🍋:超分辨的MLKA模块对小目标和模糊目标涨点很明显 🍋适用场景🍋:小目标检测、模糊目标检测等 🍋思路…...

网络安全之端口扫描(一)

前置介绍 什么是DVWA&#xff1f; DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个专门设计用于测试和提高Web应用程序安全技能的开源PHP/MySQL Web应用程序。它是一个具有多个安全漏洞的故意不安全的应用程序&#xff0c;供安全专业人员、渗透测试人员、…...

HCIE云计算学什么?怎么学?未来职业发展如何?

随着云计算成为IT行业发展的主流方向&#xff0c;HCIE云计算&#xff08;华为认证云计算专家&#xff09;作为华为认证体系中的高端认证之一&#xff0c;逐渐成为了许多网络工程师和IT从业者提升职业竞争力的重要途径。 那么&#xff0c;HCIE云计算究竟学什么内容&#xff0c;如…...

upload-labs文件上传

第一关 上传一个1.jpg的文件&#xff0c;在里面写好一句webshell 保留一个数据包&#xff0c;将其中截获的1.jpg改为1.php后重新发送 可以看到&#xff0c;已经成功上传 第二关 写一个webshell如图&#xff0c;为2.php 第二关在过滤tpye的属性&#xff0c;在上传2.php后使用b…...

操作系统控制台-健康守护我们的系统

引言基本准备体验功能健康守护系统诊断 收获提升结语 引言 阿里云操作系统控制平台作为新一代云端服务器中枢平台&#xff0c;通过创新交互模式重构主机管理体验。操作系统控制台提供了一系列管理功能&#xff0c;包括运维监控、智能助手、扩展插件管理以及订阅服务等。用户可以…...

财务会计域——合并报表系统设计

摘要 本文主要介绍了合并报表系统的设计&#xff0c;包括其背景、业务流程和系统架构设计。合并报表系统可自动化生成数据&#xff0c;减少人为错误&#xff0c;确保报表合规。其业务流程涵盖数据收集、标准化、合并调整、报表生成、审核及披露等环节。系统架构设计包括数据接…...

教务考试管理系统-Sprintboot vue

一、前言 1.1 实践目的和要求 本次实践的目的是为了帮助学生强化对实践涉及专业技术知识的理解&#xff0c;掌握专业领域中软件知识的应用方法&#xff0c;并了解软件工程在具体行业领域的发展趋势。通过培养学生利用软件工程方法分析、设计并完成具体行业软件开发的能力&…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...