初始c++语法

news2024/10/2 2:23:28

    我们在C语言的基础之上进行c++语言的学习。对于我们的c++语言来说,c++兼容C语言,所以我们以前编写的C语言的程序在c++平台上也是可以运行的。唯一不同的就是我们的c++对于我们C语言的部分语法做出了优化以及引入了面向对象的概念。所以在刚开始学习c++的时候我们可以从了解c++新增的语法入手,学习c++语言的特点。

    🌵命名空间域

  我们先来看一段代码:

 

  我们定义了一个变量名叫做 rand 的变量。我们可以发现程序运行一切正常,但是如果我们再引入一个头文件呢?   我们会发现编译器产生了报错,显示rand变量已经定义为一个函数。我们可以很容易的想到这是和我们stdlib.h库里面的rand函数发生了冲突。但是我们不可能记住所有库中的变量名并在命名的时候加以回避,那么也就代表着我们在定义变量的时候随时都可能会有和库中的变量发生冲突的危险。这是C语言当中隐藏的危险。

  所以我们的c++为了避免出现这种情况引入了命名空间域的概念。对于c++我们会经常看到如下的代码:

  

  我们可以逐步的进行分析:我们第一行引用的iostream我们可以先将其认为是和我们stdio.h类似的头文件。但是我们这个头文件是处于特定的命名空间域当中的,只是单纯的包含这个头文件并不能使用其中的函数,所以我们需要将我们这个命名空间域展开。就有了我们第三行的代码:

using namespace std;

  我们为了方式我们在全局的范围内定义的变量名和我们库函数当中的函数名相冲突所以自己创建了一个命名空间域。所以也就有了:

namespace lm
{
	int rand = 12;
}

  但是我们创建好命名空间域之后并不能直接使用我们在其中定义的变量。我们有两个选择要么向我们展开std的那样展开。但是我们需要注意的是,要是我们将命名空间域展开之后,相当于我们命名的变量会直接出现在全局的范围内,依旧会出现冲突,所以我们在展开命名空间域的时候需要格外小心。所以我们是用另一种形式——使用域作用限定符进行指定域中的变量。也就有了我们的:

printf("%d", lm::rand);

  这么看来我们的命名空间域很实用,并且我们的命名空间域支持嵌套,我们可以在一个命名空间域中嵌套一个新的命名空间域,在使用的时候只需要依次利用域作用限定符将我们的变量名引出即可。

    🌵c++的输入和输出 

   实际上按照我们c++正规的写法来说我们上面的代码应该这样来写:

  我们在main函数当中的输出函数由printf更改为了cout。这是c++当中的输出函数。其优点我们到后面会细细道来。我们先来了解一下cout函数的使用方法:

  我们可以将cout大致理解为我们屏幕上面的黑框框,我们可以将指定的内容输出到我们的黑框框当中,我们在上面也就是将我们lm1命名空间域中的a输出到屏幕上。双箭头表示输出方向,endl表示我们本行输入的结束。

  既然有了输出函数那么一定有输入函数,在c++当中输入函数为:

   我们先使用cout函数在屏幕上打印提示信息,之后使用cin检测用户的输入,最后使用cout将我们输入的x打印出来。由于我们的c++是兼容C语言的所以我们可以将我们的cin,cout,printf,scanf搭配起来使用。样例如下:

 

  需要注意的是,虽然我们的printf函数可以和cout混合使用,但是效率方面会有些许减慢,所以我们在使用的时候尽量不要掺杂使用。

  同时我们的cout函数会自动检测并识别类型,也就是说我们在使用cout函数向屏幕输出的时候,不需要指定格式输出,代码如下:

      🌵c++的缺省函数

  在我们的c++语言当中还支持缺省函数的概念。我们先来通过一段代码体会一下缺省函数的概念:   就像我们上面的代码所展示的那样,我们可以在定义函数时候给我们的参数定义一个默认值,这样假如我们在使用函数的时候可以选择只传入一个参数,另一个参数会自动默认会定义的值。我们也可以向函数中传入两个值。代码如下:

 

  缺省函数分为两种全缺省函数和半缺省函数,半缺省函数就像是我们上面的代码一样,全缺省的代码如下:

 

  在这里需要我们注意的是:我们在选择半缺省的时候,缺省的值必须在后面,否则系统可能会报错。还有我们在向函数传值的时候不能跳过数据进行传参,否则系统也会报错。

  前半部分缺省报错:

   跳过参数传参报错:

   和python语言不同的是我们这里的缺省函数不能指定参数传参,否则也会报错:

     🌵c++函数重载

   首先我们来看一下函数重载的定义:函数重载是函数的一种特殊的情况。c++允许在同一作用域中声明几个功能类似的同名的函数,这些同名函数的形参列表(参数个数,参数类型或参数顺序)不同,常用来处理实现功能类似,数据类型不同的问题。

  我们首先通过两个简单的函数来体会一下函数重载:

  在C语言当中我们的编译器并不支持同名的函数,但是我们的c++将这一点优化之后,可以支持我们的同名但是参数的形式不同的函数。这种参数不同但是函数名相同的函数成为函数的重载。在这里需要我们注意的是:当我们的形参列表相同但返回值不同时不构成重载,否则会编译出错。

  有一个特殊的情况:根据定义当我们有一个全缺省函数和我们的无参数的函数构成重载的时候在编译上会通过。   但是当我们在使用函数缺省的时候就会出现解释歧义的现象,进而产生报错:

   在介绍完c++的重载之后我们肯定会想:为什么C语言不支持函数重载,c++就可以支持函数重载呢?c++又是怎样支持函数的重载的呢?

  我们先来给定一个正确的答案,再来进行详细的解释:我们的c++语言在编译链接的过程当中会通过函数名修饰规则支持重载。

  我们先从编译器的编译链接的过程来解释这一答案:

     通过汇编代码我们可以发现在我们的C语言当中产生的汇编指令如下:

   我们的函数名表示的形式仅仅是我们定义出来的函数名,所以当我们定义两个相同的函数名的时候就出现同一个函数名对应多个函数地址的情况,进而产生歧义。而我们再来看我们c++的汇编代码的形式:

   我们可以发现的是我们在汇编当中产生的函数名并不只我们定义的函数名,他会通过一种特定的形式加以修饰。在我们的gcc编译器下所进行的修饰为把我们的参数的所写添加到我们的函数名当中,这样定义不同的参数的同名函数所最终找到的地址就不同了。也就不会产生歧义了。这也就是我们函数重载的原理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

真题详解(归并)-软件设计(五十三)

真题详解&#xff08;UML部署图&#xff09;-软件设计&#xff08;五十二)https://blog.csdn.net/ke1ying/article/details/130233656 语句覆盖<判定覆盖<条件覆盖<路径覆盖。 2、ISO/IEC 9126软件质量模型中对软件质量定义&#xff1a; 易测试性、易分析性、稳定性、…

【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板

&#x1f389;欢迎来到FPGA专栏~基于FPGA的循迹小车 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

Contrastive Representation Learning 对比表征学习(二)关键成分

原文翻译自这里 关键成分 大量数据增强 给定一训练样本&#xff0c;在计算其相关损失之前通常需要数据增强技术为该样本添加噪声。适度的数据增强设定对于学习一个优秀的&#xff0c;泛化性好的嵌入特征是至关重要的。其在不改变语义信息的同时将些微变量引入到样本之中&…

Windows环境下实现设计模式——备忘录模式(JAVA版)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows环境下如何编程实现备忘录模式&#xff08;设计模式&#xff09;。 不知道大家有没有这样的感觉&#xff0c;看了一大堆编程和设计模式的书&#xff0c;却还是很难理解设计模式&#xff…

【使用ChatGPT自动化】批量转换.csv文件为.xlsx文件

第1次提问&#xff1a; 我&#xff1a;我想使用Python批量转换.csv文件为.xlsx文件&#xff0c;请你提供代码 它&#xff1a;好的&#xff0c;以下是使用Python批量转换.csv文件为.xlsx文件的代码&#xff1a; import os import glob import pandas as pddef csv_to_xlsx(pa…

MATLAB数值运算(六)

目录 实验目的 实验内容 原创代码&#xff0c;仅供参考&#xff0c;不要直接CV呀 ~_~ 实验目的 1&#xff09;掌握定义符号对象和创建符号表达式的方法&#xff1b; 2&#xff09;掌握符号运算基本命令和规则&#xff1b; 3&#xff09;掌握符号表达式的运算法则以及符号矩阵…

A100 Jeston TX1TX2使用教程-接口说明

EdgeBox_Umate_A100是一款嵌入式人工智能计算机&#xff0c;能够为各类终端设备赋予人工智能的能力&#xff0c;降低终端智能的开发门槛。EdgeBox_Umate_A100搭载了移动处理器——NVIDIA Jetson TX1&#xff0c;并且兼容TX2&#xff0c;是最适合边缘计算的高性能平台。 A100 算…

【Javascript - 力扣每日一题】13. 罗马数字转整数

题目描述 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1 。12 写做 XII &#xff0c;即为…

【黑马2023大数据实战教程】VMWare虚拟机部署HDFS集群详细过程

文章目录 部署HDFS集群1.配置workers:2.配置hadoop-env.sh文件3.配置core-site.xml文件4.配置hdfs-site.xml文件准备数据目录分发Hadoop文件夹配置环境变量授权为hadoop用户格式化文件系统错误排查方法!! 视频&#xff1a;黑马2023 VMWare虚拟机部署HDFS集群 注意&#xff01;这…

linux代码检测工具valgrind之内存检测memcheck

1、安装命令&#xff1a; $ sudo apt-get install valgrind 安装成功如下&#xff1a; 检测版本命令&#xff1a;$ valgrind --version 2、valgrind检测工具tool介绍 &#xff08;1&#xff09;Memcheck是一个内存错误检测器。 &#xff08;2&#xff09;Cachegrind是缓存…

C++语法(19)---- 模拟AVL树

C语法&#xff08;18&#xff09;---- set和map_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130228232?spm1001.2014.3001.5501 目录 1.AVL树的概念 2.节点定义 3.AVL树的类实现 1.类定义 2.insert 1.全代码实现 2.思考角度 3.平衡因…

【Redis】Redis十大数据类型—哈希hash

介绍 Hash 是一个键值对&#xff08;key - value&#xff09;集合&#xff0c;其中 value 的形式入&#xff1a;value[{field1&#xff0c;value1}&#xff0c;...{fieldN&#xff0c;valueN}]。Hash 特别适合用于存储对象。 Hash和String对象的区别 内部实现 Hash 类型的底…

SpringMVC 接收前端传递的参数

SpringMVC 接受前端传参 1、前端传参需要注意请求的Content-type, 主要使用的有两种&#xff1a; application/x-www-form-urlencodedapplication/json application/x-www-form-urlencoded是浏览器的默认编码格式 &#xff0c;对于原生的form 表单提交参数&#xff0c;就是使用…

【大数据之Hadoop】十六、MapReduce之Join

1 Reduce Join Map端&#xff1a; 为来自不同表或文件的key/value对&#xff0c;打标签以区别不同来源的记录。然后用连接字段作为key&#xff0c;其余部分和新加的标志作为value&#xff0c;最后进行输出。 Reduce端&#xff1a; 在每一个分组当中将那些来源于不同文件的记录…

【剑指 offer】调整数组顺序使奇数位于偶数前面

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;算法训练营&#x1f447; 调 整 数 组 顺 序 使 奇 数 位 于 偶 数 前 面 核心考点&#xff1a;数组操作&#xff0c;排序思想的扩展使用 描述&#xff1a; 输入一个整数数组&#xff0c;实现一个函数来调…

vue2数据响应式原理(3) 带你手写一个defineReactive响应式函数并理解其本质

然后 我们来学一下defineReactive函数 defineReactive其实是一个要声明的函数 基本都是作为一个响应式函数 因为vue的使用比较经典 因此 也成了 响应式的一个代表函数 而定义它的意义在于 defineProperty不好用 具体不好用在哪呢&#xff1f; 我们打开上文用到的项目 将output…

第六讲 循环结构

我们在写程序的时候&#xff0c;极有可能遇到需要重复执行某条指令或某些指令的场景&#xff0c;例如我们需要每隔1秒钟在屏幕上输出一次“hello, world”并持续输出一个小时。如下所示的代码可以完成一次这样的操作&#xff0c;如果要持续输出一个小时&#xff0c;我们就需要把…

Javaee spring jdbctemplate查询数据库,基于纯注解实现

为啥要用纯注解方式呢&#xff1f;因为xml中代码还是有点多&#xff0c;纯注解可以解决该问题 现在要做的很简单&#xff0c;就是用新建的SpringConfig这个类去替代xml 在测试类中加载核心配置类 SpringConfig类中 Configuratio Spring.xml配置类 ComponentScan <!--开…

Linux搭建Web服务器(三)——服务器编程基本框架以及事件处理模式

目录 0x01 服务器编程基本框架 0x02 两种高效的事件处理模式 Reactor 模式 Proactor 模式 模拟Proactor 模式 0x01 服务器编程基本框架 虽然服务器程序的种类繁多&#xff0c;但是其基本框架都是一样的&#xff0c;不同之处是在于处理逻辑。对于我们在这个服务器的搭建可以…

基于Jenkins实现Docker应用的持续集成与部署

先决条件 1. 服务器部署安装有docker 在docker应用开发中最常见的就是开发Dockerfile文件&#xff0c;可以使用代码仓库来管理它。 而在企业私有开发环境中是无法访问公有代码仓库&#xff08;如Github&#xff09;的。这时可以搭建私有代码仓库。 部署安装svn私有仓库 安…