C++之入门之命名空间、缺省参数、函数重载

news2024/11/27 2:14:38

一、前言

我们知道c++是对c语言的完善以及再发展,所以C++中的很多东西是与C语言十分修饰的,并且C++也是兼容C的,学习了C之后,相信学C++也不在困难,对我们来说,唯一感到不解和陌生就只有 using namespace std; 这条语句,要理解这条语句,我们需要学习C++的命名空间相关知识。

C++的第一个程序:

#include<iostream>	//IO流头文件
using namespace std;	//全局展开std命名空间

int main()
{
	// cout 是输出函数
	// << 流插入运算符,配合 cout 使用
	// endl 换行符,相当于 \n
	cout << "Hello World!" << endl;
	return 0;
}

二、命名空间

1、什么是命名空间?

看看这一段代码:

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

这里报错的问题是我们定义的变量与库里函数名的rand函数名称发生了冲突,在C语言中这样的问题是没有办法解决的,而在C++中这类问题我们可以通过命名空间得以解决。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,其中定义命名空间的关键字是 namespace。

2、命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员,通过不同的命名空间将函数或变量限定使用,即使存在两个同名变量,找到他们的对应空间,也不会起冲突。
看看这段代码:
#include<iostream>	//IO流头文件
using namespace std;	//全局展开std命名空间

//命名空间
namespace A
{
	//定义变量
	int num = 10;
	//定义类型
	typedef struct SLNode
	{
		int data;
		struct SLNode* next;
	}SLNode;

	//定义函数
	int ADD(int a, int b) {
		return a + b;
	}
}

namespace B
{
	//定义变量
	int num = 24;
	//定义类型
	typedef struct SLNode
	{
		int data;
		struct SLNode* next;
	}SLNode;

	//定义函数
	int ADD(int a, int b) {
		return a + b;
	}
}

int main()
{
	//不同命名空间内的同名 变量/函数 不冲突
	cout << A::num << endl;
	cout << B::num << endl;
	cout << A::ADD(1,3) << endl; //::域作用限定符,指定为A空间里的函数
	cout << B::ADD(3, 4) << endl;
	return 0;
}

输出结果:

此时我们可以看懂这行代码了:

using namespace std;	//全局展开std命名空间

它的作用是展开std这个命名空间,即库函数,只有展开后,我们才可以正常使用cout与endl。

有三种方法使用命名空间:

  1. 用using将命名空间全局展开(在做项目时不建议使用,做练习时可以)

  2. 利用::指定命名空间( 一般做项目时使用此方式)

  3. 用using +::将命名空间常用展开

三种方法的代码使用场景(以std域为例):

//命名空间全局展开
using namespace std;//std为C++标准库
//指定命名空间
std::cout << "hellow world\n" << std::endl;
//命名空间常用展开
using std::cout;
using std::endl;

最上面的C程序rand函数加个域在C++环境中就可以正常使用了。

三、缺省参数

1、缺省参数的概念

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

void Func(int a = 10) {
	cout << a << endl;
}

int main() {
	Func(2); //有传参时,使用参数的指定值
	Func(); //没有传参时,使用参数的默认值
	return 0;
}

2、缺省参数的分类

缺省参数一共分为两类:全缺省参数和半缺省参数;

全缺省参数:

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;
}

3、缺省参数的规则

1、只允许从右到左依次连续缺省,不得出现跳跃缺省

//正确用法
void test(int a, int b = 2, int c = 3);	//从右至左,连续缺省

//错误用法
void test(int a = 1, int b, int c);	//非从右至左缺省
void test(int a, int b = 2, int c);	//跳跃缺省,非法

2、调用时,实参依次从左往右传递

//正确用法
test(4,5,6);	//不启用缺省值,a = 4,b = 5, c = 6
test(5,6);	//启用缺省参数 c,a = 5, b = 6, c = 3

//错误用法
test();	//此时必须传一个参数,因为参数 a 不是缺省参数
test(1,2,3,4);	//参数传多了

3、声明和定义中不能同时出现缺省参数,只能在声明中出现
 

//test.h
//声明时缺省
void test(int a = 10);	
//test.c
//定义时不必再缺省
void test(int a)
{
	cout << a << endl;
}

四、函数重载

1、函数重载的概念

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

//C语言
int Add(int x, int y);
double Add(double x, double y);	//此时会报错,两个函数名冲突

//C++
int Add(int x, int y);
double Add(double x, double y);	//正常编译,即使函数名都是Add,但在C++中编译器能分清两者

2、函数重载的原理

我们在学习C语言 程序环境和预处理 的时候知道了一个程序要运行起来,需要经历预处理、编译、汇编、链接四个阶段;其中编译阶段会进行符号汇总,汇编阶段会生成符号表,而链接阶段则会对符号表进行合并与重定位,其中符号表会将每一个变量都关联上一个地址,但这个地址是否有效需要在链接阶段进行符号表的合并与重定位是时才能检查出来。

我们可以在Linux环境下,通过objdump -S来查看函数的修饰情况,显然,C和C++的修饰情况是不同的。

C环境下:

 C++环境下:

 在底层原理下可以发现,C++中对函数名的修饰为_Z3ADDii,_Z是修饰前缀,3为函数名长度,ADD即为函数名,ii代表参数名的类型,即int,int。C++相较于C语言来说修饰的更加全面。Linux下修饰函数名简单,而window下修饰函数名就比较复杂了。

3、构成重载的三种方式

1、参数类型不同

// 1、参数类型不同
//都为int
int Add(int left, int right)
{
 cout << "int Add(int left, int right)" << endl;
 return left + right;
}
//都为double
double Add(double left, double right)
{
 cout << "double Add(double left, double right)" << endl;
 return left + right;
}
int main()
{
    Add(1,2);//3
    Add(1.1.2.2);//3.3
//不会报错,但如果是在C语言的环境下,则会报错:Add重定义,具体原因后面会讲
    return 0;
}

2、参数个数不同

// 2、参数个数不同
void f()
{
    cout << "f()" << endl;
}
void f(int a)
{
    cout << "f(int a)" << endl;
}
int main()
{
    f();//f()
    f(1);//f(int a)
}

3、参数的类型顺序不同

//int 在前char在后
void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}
//char在前,int 在后
void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}

注意: 返回值不纳入函数名修饰中,假若加入,函数调用时就会出现混乱,因此返回值不同并不构成函数重载

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

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

相关文章

【c++】STL1—STL初识

文章目录STL的基本概念STL六大组件STL中容器、算法、迭代器容器算法迭代器容器算法迭代器初识vector存放内置数据类型vector存放自定义数据类型容器嵌套容器c的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升。 为了建立数据结构和算法的一套标准&#xff0c;诞生了S…

并查集(13张图解)--擒贼先擒王

目录 前言 故事 &#x1f33c;思路 &#x1f33c;总结 &#x1f33c;代码 &#x1f44a;观察过程代码 &#x1f44a;正确代码 &#x1f44a;细节代码 来自《啊哈算法》 前言 刚学了树在优先队列中的应用--堆的实现 那么树还有哪些神奇的用法呢&#xff1f;我们从一…

前端卷算法系列(二)

前端卷算法系列&#xff08;二&#xff09; 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样…

zookeeper集群的搭建,菜鸟升级大神必看

一、下载安装zookeeperhttp://archive.apache.org/dist/zookeeper/下载最新版本2.8.1http://archive.apache.org/dist/zookeeper/zookeeper-3.8.1/二、上传安装包到服务器上并且解压&#xff0c;重命名tar -zxvf apache-zookeeper-3.8.1-bin.tar.gzmv apache-zookeeper-3.8.1-b…

设计环形队列

文章目录1.思路分析1.1队列空满分析1.2出队分析2.循环队列设计1.思路分析 1.1队列空满分析 首先我们假设一个长度为4的环形队列 队头front 队尾rear 当队列为空时 frontrear 当队列满时 frontrear 所以我们无法判断队列是满的或者空的 因此我们多加入一个空间使队列长度为5&am…

什么是自适应平台服务?

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 什么是自适应平台服务?1.1 自适应平台服务包含哪些功能簇呢?1.1.1 ara::sm 状态管理 (SM)1.1.2 ara::diag 诊断管理 (DM)1.1.3 ara::s2s 信号到服务映射1.1.4 ara::nm 网络管理 (NM)1.1.5 ara::ucm 更新和配置管…

数据结构期末复习总结(前章)

作者的话 作为一名计算机类的学生&#xff0c;我深知数据结构的重要性。在期末复习前&#xff0c;我希望通过这篇博客给大家一些复习建议。希望能帮助大家夯实数据结构的基础知识&#xff0c;并能够更好地掌握数据结构和算法的应用。 一、绪论 数据&#xff1a;信息的载体&am…

【测试】loadrunner安装

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录备注一、下载安装包二、安装loadrunner三、修改浏览器配置今天搬砖不努力&#xff0c;明天地位不稳定&#xff01; 备注 电脑最好有IE浏览器&#xff0c;但是没有也没事儿。&#xff08;注意&#xff1a;IE浏览器不…

Bootstrap系列之栅格系统

Bootstrap栅格系统 bootatrap提供了一套响应式&#xff0c;移动设备优先的流式网格系统&#xff0c;随着屏幕或者视口尺寸的增加&#xff0c;系统会自动分为最多12列&#xff0c;多出12列的将不再此行显示&#xff08;换行显示&#xff09; bootstrap网格系统有以下六个类 重点…

华为OD机试用Python实现 -【云短信平台优惠活动】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲云短信平台优惠活动题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明Python 代码实现代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看…

【Java基础】操作系统原理

一、进程 进程是指一段程序的执行过程&#xff0c;会消耗系统资源如CPU、内存、网络等。 一个进程包含静态代码段&#xff0c;数据&#xff0c;寄存器地址等 进程的特点 动态性&#xff08;可动态地创建、结束进程&#xff09; 并发性&#xff08;进程被独立调度并占用处理…

服务器部署—若依【vue】如何部署到nginx里面?nginx刷新页面404怎么办?【完美解决建议收藏】

服务器部署项目我们大家都会遇到&#xff0c;但是有些铁子会遇到很多的问题&#xff0c;比如前端部署nginx如何操作&#xff1f; 前端有单纯的静态页面、还有前后端分离的项目&#xff1b;这里博主直接分享最牛最到位的前后端分离项目的前端部署到nginx上面&#xff0c;以若依项…

C语言之习题练习集

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 文章目录牛客网题号&#xff1a; JZ17 打印从1到最大的n位数牛客网题号&#x…

Laravel框架03:DB类操作数据库

Laravel框架03&#xff1a;DB类操作数据库一、概述二、数据表的创建与配置三、增删改操作1. 增加信息2. 修改数据3. 删除数据四、查询操作1. 取出基本数据2. 取出单行数据3. 获取一个字段的值4. 获取多个字段的值5. 排序6. 分页五、执行任意的SQL语句一、概述 按照MVC的架构&a…

详讲函数知识

目录 1. 函数是什么&#xff1f; 2. C语言中函数的分类&#xff1a; 2.1 库函数&#xff1a; 2.2 自定义函数 函数的基本组成&#xff1a; 3. 函数的参数 3.1 实际参数&#xff08;实参&#xff09;&#xff1a; 3.2 形式参数&#xff08;形参&#xff09;&#xff1a; …

我那点浅薄的MOS模拟集成电路基础

记录研究生课程模拟集成电路设计所学到的一些知识&#xff0c;这门课是由刘老师和周老师一起上的&#xff0c;刘老师讲模拟集成部分这个模集跟模电还是有很大的区别的&#xff0c;模拟集成主要是针对MOS器件的集成&#xff0c;学得更专业也更深&#xff1b;而周老师讲的是信号检…

华为OD机试题,用 Java 解【图片整理】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

Yolov3,v4,v5区别

网络区别就不说了&#xff0c;ipad笔记记录了&#xff0c;这里只说其他的区别1 输入区别1.1 yolov3没什么特别的数据增强方式1.2 yolov4Mosaic数据增强Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式&#xff0c;但CutMix只使用了两张图片进行拼接&#xff0c;…

前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-02

接上一篇&#xff1a;《前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-01》 上一篇说到&#xff0c;在Handler.js的this.options下面的代码&#xff0c;this.assetsExtractor new AssetsExtractor(this.options)&#xff0c;表明op…

【C++】类与对象理解和学习(下)

放在专栏【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持&#x1f339;建议先看完【C】类与对象理解和学习&#xff08;上&#xff09;【C】类与对象理解和学习&#xff08;中&#xff09;本章知识点概括Ⅰ本章知识点概括Ⅱ初始化列表前言在上一篇文章中&#xff0c;…