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

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

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30562.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python项目在 Cursor 编辑器中 Conda 环境配置问题

在开发使用 FastApi 框架的 Python 某项目时&#xff0c;我遇到了一个因为 Conda 环境配置没有起作用的问题。 我是用 Cursor 编辑器开发 FastApi 项目的&#xff0c;项目运行在 Conda 环境blog中&#xff0c; 由于使用了 opencc-python-reimplemented&#xff0c;Python 版本…

Redis客户端

1.前言 前面学习的Redis的基本操作和命令都是在redis命令行手动执行的&#xff0c;更多的时候&#xff0c;是使用redis的API来实现定制化的redis客户端操作redis服务器。接下来我们要了解Redis服务端和客户端的通信协议&#xff0c;以及Java语言的Redis客户端使用方法 Redis服…

Git基础之分支

常用指令 git branch 列出本地所有分支 git branch -r 列出所有远程分支 git branch [branch-name] 新建一个分支&#xff0c;但依然停留在当前分支 git checkout -b [branch] 新建一个分支&#xff0c;并切换到该分支 git merge [branch] 合并指定分支当前分支 git branch -d …

Java多线程与高并发专题——什么是阻塞队列?

引入 阻塞队列&#xff08;Blocking Queue&#xff09;是一种线程安全的队列数据结构&#xff0c;它的主要特点是&#xff1a; 线程安全&#xff1a;多个线程可以安全地同时访问队列。阻塞操作&#xff1a;当队列为空时&#xff0c;从队列中获取元素的操作会被阻塞&#xff0…

电路常用常用的定理/定律/计算方法

1、欧姆定理 在恒定温度下&#xff0c;导体中的电流I与导体两端的电压U成正比&#xff0c;与导体的电阻R成反比。 2、基尔霍夫定律 2.1基尔霍夫电流定律&#xff08;KCL&#xff09; 在电路中任何一个节点上&#xff0c;任意时刻&#xff0c;流入节点的电流之和等于流出节点…

unity 让两个物体相遇时候刚体互不影响

解决方案是设定好层级不同&#xff0c;在PlayerSetting中找到物理&#xff0c;有一个图层碰撞矩阵 取消对应 勾选即可 如图

编译Telegram Desktop

目录 一、前言 二、环境准备 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 三、编译 四、总结和学习 一、前言 Telegram 是一款全球广泛使用的即时通讯软件&#xff0c;以其强大的隐私保护、跨平台同步和丰富的功能而闻名。它支持一对一聊天、群组&#xff08;最多20万成员&am…

(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx? Nginx 是一款高性能的 HTTP 服务器和反向代理服务器&#xff0c;同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势&#xff0c;广泛应用于负载均衡、静态资源服务和反向代理等场景。 一、Nginx 的核心优势 高并发处理能力采用异步非阻塞的…

PCIE接口

PCIE接口 PIC接口介绍PIC总线结构PCI总线特点PCI总线的主要性能PIC的历程 PCIE接口介绍PCIe接口总线位宽PCIE速率GT/s和Gbps区别PCIE带宽计算 PCIE架构PCIe体系结构端到端的差分数据传递PCIe总线的层次结构事务层数据链路层物理层PCIe层级结构及功能框图 PCIe链路初始化PCIe链路…

边缘计算盒子:解决交通拥堵的智能方案

在当今的智能交通系统中&#xff0c;边缘计算盒子&#xff08;Edge Computing Box&#xff09;正逐渐成为不可或缺的核心组件。这种设备通过将计算能力下沉到网络边缘&#xff0c;极大地提升了数据处理的速度和效率&#xff0c;特别适用于实时性要求极高的交通监控场景。本文将…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布&#xff01;此次更新&#xff0c;Easysearch 增加了新的功能和数据类型&#xff0c;包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持&#xff0c;Console 新增了日志查询功能。 INFINI Easyse…

Kotlin从入门到精通:开启高效编程之旅

目录 一、为什么选择 Kotlin 二、Kotlin 基础语法入门​ 2.1 Hello, Kotlin​ 2.2 变量与数据类型​ 2.2.1 可变与不可变变量​ 2.2.2 基本数据类型​ 2.2.3 数组​ 三、Kotlin 流程控制与函数​ 3.1 流程控制语句​ 3.1.1 if 表达式​ 3.1.2 when 表达式​ 3.2 函…

大模型量化技术实践指南:GPTQ、AWQ、BitsandBytes 和 Unsloth

在大模型&#xff08;LLM&#xff09;的时代&#xff0c;我们需要了解量化技术&#xff0c;以便在本地电脑上运行这些模型&#xff0c;因为它们的规模非常庞大。然而&#xff0c;实现量化的方法有很多&#xff0c;这让像我这样的初学者很容易感到困惑。本文介绍了我们必须掌握的…

C51 Proteus仿真实验16:4X4矩阵键盘控制条形LED显示

说明 按下的按键值越大点亮的LED越多 Proteus仿真 注意&#xff1a; K1、K5、K9、K13左边引脚连接的是P1.0 K2、K6、K10、K14左边引脚连接的是P1.1 K3、K7、K11、K15左边引脚连接的是P1.2 K4、K8、K12、K16左边引脚连接的是P1.3 K1、K2、K3、K4右边引脚连接的是P1.4 K5、K6、…

Hive的架构

1. 概念 Hive 是建立在 Hadoop 上的数据仓库工具&#xff0c;旨在简化大规模数据集的查询与管理。它通过类 SQL 语言&#xff08;HiveQL&#xff09;将结构化数据映射为 Hadoop 的 MapReduce&#xff0c;适合离线批处理&#xff0c;尤其适用于数据仓库场景。 2. 数据模型 表&a…

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 解析代码 题目 解析 首先先让所有的f&#xff08;i&#xff09;i&#xff0c;即每个人最开始的祖先都是自己&#xff0c;然后就每一次都让轮到那个数的父亲1&#xff0c;第二次出现的时候就直接用父亲替换掉 并查集适用场景 …

GitHub上传项目

总结&#xff08;有基础的话直接执行这几步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…

关于Windows输入法切换的一些总结

语言和键盘的关系&#xff08;第一层是语言 语言下一层是键盘&#xff09; 如下图&#xff1a;语言就是 中文 英文 阿拉伯文之类的 键盘就是 语言中文下的&#xff1a;XX输入法 语言的切换 和 键盘&#xff08;输入法&#xff09;的切换 &#xff08;用windos空格 可以切换…

C# Unity 唐老狮 No.7 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

搜广推校招面经三十九

小红书&#xfe63;图搜 一、两个整数的汉明距离 两个整数之间的汉明距离是指这两个数字对应二进制位相同位置不同的个数。换句话说&#xff0c;它就是将一个整数变成另一个整数所需要改变的二进制位的数量。例如&#xff0c;如果两个整数在它们的二进制表示中有三个位置上的…