【C++】关键字、命名空间、输入和输出、缺省参数、函数重载

news2025/1/23 7:54:16

  • C++关键字(C++98)
  • 命名空间
    • 产生背景
    • 命名空间定义
    • 命名空间使用
  • 输入&输出
  • 缺省参数
    • 什么叫缺省参数
    • 缺省参数分类
  • 函数重载
    • 函数重载概念
    • C++支持函数重载的原理--名字修饰

C++关键字(C++98)

C++总计63个关键字,C语言32个关键字。

下面我们先看一下C++有多少关键字,不对关键字进行具体的了解,后面遇到再进行细讲,这样更轻松。

在这里插入图片描述

命名空间

产生背景

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

#include <stdio.h>
#include <stdlib.h> 
//rand本来就是<stdlib.h>里的库函数,下面我们自己又定义一个和它同名的变量,冲突了
int rand = 10; 
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
 printf("%d\n", rand);
return 0; }
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

命名空间定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

// 命名空间的名字可以根据需要自己起
// 1. 正常的命名空间定义
namespace lx
{
 // 命名空间中可以定义变量/函数/类型
 int rand = 10;
 int Add(int left, int right)
 {
 return left + right;
 }

注意:一个命名空间就定义了一个新的作用域,该命名空间中的所有内容都局限于该命名空间中

命名空间可以嵌套:

namespace N1
{
		namespace N2
		{
			int a;
			int b;
			int Add(int left, int right)
			 {
     			return left + right;
 			 }
 		}
} 		

同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

命名空间使用

下面谈谈命名空间的使用:

 namespace N
{
 // 命名空间中可以定义变量/函数/类型
 int a = 0;
 int b = 1;
 int Add(int left, int right)
 {
 return left + right;
 }
 struct Node
 {
 struct Node* next;
 int val;
 };
 
}

针对上面命名空间N有三种使用方式:

1.加命名空间名称及作用域限定符

int main()
{
		//下面变量a是命名空间N里的变量,可以通过 N:a 的方式来使用a
    printf("%d\n", N::a);
    return 0;    
}

2.使用using将命名空间中某个成员引入

//using N::b 相当于将命名空间N里的变量b和全局作用域连接起来了
//可以像使用普通变量一样使用它
using N::b;
int main()
{
	//通过 N:a 的方式来使用a
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;    
}

3.使用using namespace 命名空间名称,相当于将整个命名空间和全局域连接起来了,这时命名空间就行与名存实亡,不起作用了。但上面两种方法还是可以使用。不过已经没必要了。

using namespace N;
int main()
{
    printf("%d\n", a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}

std命名空间的使用惯例:

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对 象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

输入&输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0; }
  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型。

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用+std的方式。

缺省参数

什么叫缺省参数

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

void Func(int a = 0)
 {
 cout<<a<<endl; 
 }
 
int main()
 {
 Func();     // 没有传参时,使用参数的默认值,结果为0
 Func(10);   // 传参时,使用指定的实参,结果为10
return 0; 
 }

缺省参数分类

全缺省参数:函数的所有形参全部赋初值,调用函数时没有指定任何实参,则全部使用缺省参数值。

void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

半缺省参数:函数的部分形参赋初值,调用函数时没有缺省的参数必须给与实参值。

void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给。
  2. 缺省参数不能在函数声明和定义中同时出现(如果必须有函数声明和定义,那只在函数声明中出现就行)
  //a.h
  void Func(int a = 10);
  
  // a.cpp
  void Func(int a = 20)
 {}
  
  // 注意:如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
  1. 缺省值必须是常量或者全局变量。
  2. C语言不支持(编译器不支持)。

函数重载

函数重载概念

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

函数重载分为三类:

#include<iostream>
using namespace std;

// 1、参数类型不同
int Add(int left, int right)
 {
 cout << "int Add(int left, int right)" << endl;
 return left + right;
  }
  
double Add(double left, double right)
 {
 cout << "double Add(double left, double right)" << endl;
 return left + right;
  }
  
// 2、参数个数不同
void f()
{
 cout << "f()" << endl;
 }
 
void f(int a)
 {
 cout << "f(int a)" << endl; 
 }
 
// 3、参数类型顺序不同
void f(int a, char b) 
{
 cout << "f(int a,char b)" << endl; 
 }
 
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
  }

int main()
{
 Add(10, 20);
 Add(10.1, 20.2);
 f();
 f(10);
 f(10, 'a');
 f('a', 10);
 return 0;
 }

C++支持函数重载的原理–名字修饰

每个编译器都有自己的函数名字修饰规则,就以Windows下和Linux下编译器的名字修饰规则来看,Windows下的比较复杂,Linux下的比较直观好懂,这里我们以Linux下的为例。
通过下面我们可以看出gcc编译器(用于C语言)的函数修饰后名字不变。而g++编译器(用于C++)的函数修饰后变成【_Z+函数长度+函数名+类型首字母】

gcc编译器:(C语言不支持函数重载,因为它的函数修饰规则只看函数名)在这里插入图片描述
g++编译器:(C++支持函数重载,因为它的函数修饰规则不仅仅看函数名)
在这里插入图片描述从上图C++的名字修饰规则也可以看出,函数重载和函数返回值没有关系。

Windows下的名字修饰规则不够直观,有个印象就行。在这里插入图片描述

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

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

相关文章

Linux 解压JAR包 查看class内容

快速解决方案 查询class相对路径&#xff1a;jar tf test.jar | grep "test.class"单独解压class文件&#xff1a;jar xvf test.jar com/test/test.class查看class文件内容&#xff1a;javap -c com/test/test.class 背景 服务运行后&#xff0c;日志打印出来发现…

【taichi】利用 taichi 编写深度学习算子 —— 以提取右上三角阵为例

本文以取 (bs, n, n) 张量的右上三角阵并展平为向量 (bs, n*(n1)//2)) 为例&#xff0c;展示如何用 taichi 编写深度学习算子。 如图&#xff0c;要把形状为 (bs,n,n)(bs,n,n)(bs,n,n) 的张量&#xff0c;转化为 (bs,n(n1)2)(bs,\frac{n(n1)}{2})(bs,2n(n1)​) 的向量。我们先写…

各种素材网站大全【全部倾倒,福利倒计时-JS,HTML,游戏素材,UI,图片素材等

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;解忧杂货铺 ⭐各种素材网站大全⭐ 文章目录⭐各种素材网站大全⭐&#x1f3b6;大家必逛的四大天王…

STM32F769BIT6微控制器STM32F769IGT6详细规格

说明STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核&#xff0c;工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度&#xff0c;支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元&#xff08;MPU&#xff09;&a…

JVM02类加载子系统

1. 加载阶段 通过一个类的全限定名获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象&#xff0c;作为方法区这个类的各种数据的访问入口 加载class文件的方式 从本地系统中直接…

六、HTTP 首部字段

HTTP 首部字段 一、HTTP 报文首部 HTTP 请求报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成。 HTTP 响应报文由HTTP版本、状态码&#xff08;数字和原因短语&#xff09;、HTTP首部字段3部分构成。 HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端…

TensorRT如何工作

TensorRT如何工作 本章提供了有关 TensorRT 工作原理的更多详细信息。 文章目录TensorRT如何工作5.1. Object Lifetimes5.2. Error Handling and Logging5.3 Memory5.3.1. The Build Phase5.3.2. The Runtime Phase5.4. Threading5.5. Determinism5.1. Object Lifetimes Tenso…

ChatGPT通俗导论:从RL之PPO算法、RLHF到GPT-N、instructGPT

前言 自从我那篇BERT通俗笔记一经发布&#xff0c;然后就不断改、不断找人寻求反馈、不断改&#xff0c;其中一位朋友倪老师(之前我司NLP高级班学员现课程助教老师之一)在谬赞BERT笔记无懈可击的同时&#xff0c;给我建议到&#xff0c;“后面估计可以尝试尝试在BERT的基础上…

MACD多周期共振指标公式,日周月共振

有人问多周期MACD怎么写&#xff0c;编写指标的难度其实不大&#xff0c;主要问题是解决多周期MACD显示的问题。日线、周线、月线三个周期&#xff0c;每个周期都有快线DIF和慢线DEA两条线&#xff0c;一共6条&#xff0c;怎么在副图上清晰显示出来。 一、MACD多周期共振指标公…

第三章SpringBoot配置文件

文章目录什么是配置文件比如我们的QQ的配置文件配置文件作用SpringBoot配置文件的格式Spring Boot 配置文件主要分为以下两种格式properties 配置文件说明properties 基本语法properties 缺点分析yml 配置文件yml概述yml基础语法读取配置文件Value 注解使用“${}”的格式读取Co…

深度使用国产Bg-Tinkle数据库客户端—太赞了,居然还集成chatGPT AI生成SQL

软件概述数据库客户端软件是一种用于连接、管理和操作数据库的软件。它通常与数据库管理系统&#xff08;DBMS&#xff09;配合使用&#xff0c;允许用户在其上执行SQL 语句、浏览数据库中的数据、执行备份和恢复操作以及执行其他管理任务。常见的数据库客户端软件包括 MySQL W…

攻防世界-Confusion1

题目 访问题目场景 某天&#xff0c;Bob说&#xff1a;PHP是最好的语言&#xff0c;但是Alice不赞同。所以Alice编写了这个网站证明。在她还没有写完的时候&#xff0c;我发现其存在问题。(请不要使用扫描器) 然后结合图片我们知道&#xff0c;这个网址是python写的&#xff0…

有序表(上)

文章目录1、引入2、左旋和右旋3、AVL树3.1 AVL 树的平衡条件3.2 搜索二叉树如何删除节点3.3 AVL树的平衡性被破坏的四种类型3.4 AVL 树平衡性如何检查&#xff1f;如何调整失衡&#xff1f;3.4.1 AVL树新增节点如何检查树的平衡性&#xff1f;3.4.2 AVL树删除节点如何检查树的平…

学习笔记:Java 并发编程⑥_并发工具_JUC

若文章内容或图片失效&#xff0c;请留言反馈。 部分素材来自网络&#xff0c;若不小心影响到您的利益&#xff0c;请联系博主删除。 视频链接&#xff1a;https://www.bilibili.com/video/av81461839配套资料&#xff1a;https://pan.baidu.com/s/1lSDty6-hzCWTXFYuqThRPw&am…

4. 寻找两个正序数组的中位数(数组)

文章目录题目描述方法一,重组排序方法二,调用系统函数题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#…

最全面的SpringBoot教程(五)——整合框架

前言 本文为 最全面的SpringBoot教程&#xff08;五&#xff09;——整合框架 相关知识&#xff0c;下边将对SpringBoot整合Junit&#xff0c;SpringBoot整合Mybatis&#xff0c;SpringBoot整合Redis等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &…

回归预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出

回归预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出 目录回归预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出预测效果基本介绍程序设计参考资料预测效果 基本介绍 Matlab实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出…

聚观早报 |阿里清空印度支付宝Paytm股票;Meta终于成功收购Within

今日要闻&#xff1a;全球多所学校禁止学生使用ChatGPT&#xff1b;阿里清空印度支付宝Paytm股票&#xff1b;Meta终于成功收购Within&#xff1b;极氪完成 7.5 亿美元 A 轮融资&#xff1b;现代汽车在美电动汽车销量突破10万全球多所学校禁止学生使用ChatGPT 2月12日消息&…

关于北京君正:带ANC的2K网络摄像头用户案例

如果远程办公是您的未来&#xff0c;或者您经常通过视频通话与远方的朋友和亲戚交谈&#xff0c;那么您可以考虑购买网络摄像头以显著改善您的沟通。Anker PowerConf C200是个不错的选择。 Anker PowerConf C200专为个人工作空间而设计&#xff0c;能够以每秒30帧的速度拍摄2K…

Python图像卡通化animegan2-pytorch实例演示

先看下效果图&#xff1a; 左边是原图&#xff0c;右边是处理后的图片&#xff0c;使用的 face_paint_512_v2 模型。 项目获取&#xff1a; animegan2-pytorch 下载解压后 cmd 可进入项目地址的命令界面。 其中 img 是我自己建的&#xff0c;用于存放图片。 需要 torch 版本 …