命名空间,缺省参数和函数重载

前言:本文章主要介绍一些C++中的小语法。

目录

命名空间

namespace的使用

访问全局变量

namespace可以嵌套

 不同文件中定义的同名的命名空间可以合并进一个命名空间,并且其中不可以有同名的变量

C++中的输入和输出

缺省参数(默认参数)

缺省参数又分为全缺省和部分缺省

既有声明又有定义的情况下

函数重载

不同作用域下的函数可以同名

调用歧义问题:

为什么C不支持函数重载,C++支持?


命名空间

为什么要有命名空间?

命名空间是解决C语言中命名重复的问题

比如,以下代码(在c++环境下运行)的情况:

#include <stdlib.h>
#include <stdio.h>

int rand = 0;

int main()
{
	printf("%d", rand);
}

在C语言中rand是一个函数名,而在该代码中定义了一个与rand函数名重名的变量。

#include <stdio.h>
int rand = 0;
int main()
{
	int rand = 1;
	printf("%d", rand);
}

以上代码的打印结果是:

 

为什么是1呢?

在C语言中局部优先,所以打印的是main函数中rand的值。

为什么没有报变量重定义的错呢?

因为rand这个变量是在不同的域中定义的,一个定义在局部域中,另一个定义在全局域中,所以没有命名重复。


 

namespace的使用

开辟一个命名空间域,可以在里面定义变量,函数,结构体等。与其他域中定义的一样的名字的变量不构成重名。

#include <stdio.h>

namespace _name
{
	int rand = 0;
}

int rand = 1;

int main()
{
    int rand = 2;
	printf("%d", rand);
}

 下面代码的运行结果是:

另一份代码:

#include <stdio.h>

namespace _name
{
	int rand = 0;
}


//int rand = 1;

int main()
{
	//int rand = 2;
	printf("%d", rand);
}

上面的代码会报错:rand未定义 

 

为什么呢?

编辑器的默认查找规则:

1.先去局部域中去找

2.去全局域中去找

3.但不去命名空间域中去查找。

那么如何使用命名空间中定义的变量,结构体,函数等呢?

:: 两个冒号是域作用限定符

1.全展开命名空间

#include <stdio.h>

namespace _name
{
	int rand = 0;
}
using namespace _name;//展开命名空间


//int rand = 1;

int main()
{
	//int rand = 2;
	printf("%d", rand);
}

建议:在大型项目中不建议直接全展开,在平时刷题时写代码时随便用。

展开命名空间的本质:影响查找规则:

1.先去局部域中去找

2.去全局域中去找

3.但不去命名空间域中去查找。

 

2.指定访问

#include <stdio.h>

namespace _name
{
	int rand = 0;
}
//using namespace _name;


//int rand = 1;

int main()
{
	//int rand = 2;
    //指定访问
	printf("%d", _name::rand);
}

3.指定某一个展开

#include <stdio.h>

namespace _name
{
	int rand = 0;
}
//using namespace _name;
using _name::rand;//指定某一个展开

//int rand = 1;

int main()
{
	//int rand = 2;
	//printf("%d", _name::rand);
	printf("%d", rand);
}

访问全局变量

#include <stdio.h>

namespace _name
{
	int rand = 0;
}
//using namespace _name;
using _name::rand;

int rand = 1;

int main()
{
	//int rand = 2;
	//printf("%d", _name::rand);
	printf("%d", ::rand);//访问全局域中的rand
}

namespace可以嵌套

namespace _name
{
	int rand = 0;
	namespace bit
	{
		int rand = 1;
	}
}

 不同文件中定义的同名的命名空间可以合并进一个命名空间,并且其中不可以有同名的变量

//test.h
namespace _name
{
	int rand1 = 1;
}
//test.c
#include <stdio.h>
#include "test.h"
namespace _name
{
	int rand = 0;
}

using namespace _name;


int main()
{
	printf("%d", rand1);
    return 0;
}

C++中的输入和输出

#include <iostream>
using namespace std;

int main()
{
	int i;
	cin >> i;//相当于scanf("%d",&i);
	cout << i << endl;//相当于printf("%d",i);
	cout << "hello world" << endl;//相当于printf("hello world\n");
}

运行结果: 

代码解析:

#include<iostream>: io流,里面有定义的命名空间std

using namespace std:展开std这个命名空间,该空间中有定义的cin和cout

cout:console output 控制台输出

<<:流插入

cin: console input 控制台输入

>>: 流提取

endl:相当于“\n”,也就是换行

cin<< 可以自动识别数据的类型,相较于scanf更方便一些。


缺省参数(默认参数)

函数的全部参数或部分参数有默认值,并且调用时,可以不为有默认值的参数传参。

void f(int a = 1)//形参a有默认值,为1
{
	cout << a << endl;
}

以下有两份代码:

#include <iostream>
using namespace std;

void f(int a = 1)
{
	cout << a << endl;
}

int main()
{
	f();//不传值,那么调用时形参a为默认值1
	return 0;
}

#include <iostream>
using namespace std;

void f(int a = 1)
{
	cout << a << endl;
}

int main()
{
	f(2);//传值
	return 0;
}

 

缺省参数又分为全缺省和部分缺省

全缺省就是:全部的形参都有默认值

部分缺省: 形参从右向左顺序缺省,不能出现跳跃,所以传值的时候也不能跳跃传值

//全缺省
void f(int a = 0, int b = 1, int c = 2)
{
	//....
}

//部分缺省
void f(int a, int b = 1, int c = 2)
{
	//....
}

//错误示范,不是从右向左顺序缺省
void f(int a = 0, int b, int c = 2)
{
	//....
}

既有声明又有定义的情况下

只在定义中给形参加默认参数

//既有声明又有定义
void f(int a = 0, int b = 1, int c = 2);
void f(int a, int b, int c )
{
	//....
}

函数重载

函数重载的条件:同一作用域,函数名相同,形参列表不同(形参的类型不同,类型的数量不同,类型的顺序不同)

//都在全局域中定义,下面的函数参数列表都与第一个比较
void f(int a,char b)
{
	cout << "heihei" << endl;
}

//类型顺序不同
void f(char b, int a)
{
	cout << "haha" << endl;
}
//数量不同
void f(int a, char b,int c)
{
	cout << "wuwu" << endl;
}
//类型不同
void f(double a, char b)
{
	cout << "lalala" << endl;
}

不同作用域下的函数可以同名

namespace tmp
{
	void f()//在命名空间域中定义的f函数
	{
		cout << "hello world" << endl;
    }

}

void f()//在全局域中定义的f函数
{
	cout << "heihei" << endl;
}

因为两个函数的作用域不同,就算将命名空间展开两个f函数仍不构成重载。

调用歧义问题:

void f(int a = 10)
{

}
void f()
{

}
int main()
{
	f();
	return 0;
}

 即使函数重载了,也可能出现函数调用不明确的问题。

为什么C不支持函数重载,C++支持?

C中是不支持函数重载的,C++支持函数重载,

函数的地址:就是函数中有一堆需要执行的指令,而函数的地址就是需要执行的第一条指令的地址。

原因:链接时,

C是直接用函数名找函数的地址

C++是用修饰后的函数名找函数的地址 

结语:希望这篇文章能够让你有所收获。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超越Devin!姚班带队,他们创大模型编程新世界纪录

超越Devin&#xff01;SWEBench排行榜上迎来了新玩家—— StarShip CodeGen Agent&#xff0c;姚班带队初创公司OpenCSG出品&#xff0c;以23.67%的成绩获得全球第二名的成绩。 同时创造了非GPT-4o基模的最高纪录&#xff08;SOTA&#xff09;。 我们都知道&#xff0c;SWEBe…

for深入学习

目录 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 例2&#xff1a; 求0-100中含数字9个个数 作业&#xff1a; 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 代码&#xff1a; #include<stdio.h> int main() {printf("整…

JAVAEE之网络初识_协议、TCP/IP网络模型、封装、分用

前言 在这一节我们简单介绍一下网络的发展 一、通信网络基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#xff0c;更具体一点&#xff0c;是网络主机中的不同进程间&#xff0c;基于网络传输数据。那么&#xff0c;在组建的网络中&#xff0c;如何判断到…

深入理解计算机系统 第三版 中文版 图5-27 p371 错漏

中文版 英文版 对照 可以看出错漏 这本书中文版很多错漏,可以配合英文版查正,不过英文版也很多错漏,所以不用太相信书本.要根据自己的理解来.

TDengine为物联网而生的大数据平台

TDengine为物联网而生的大数据平台 物联网背景 技术支撑 应用落地 未来趋势

【动手学深度学习】softmax回归从零开始实现的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 softmax回归的从零开始实现 &#x1f30d;3.2 基础练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 理解softmax回归的原理和基本实现方式&#xff1b;学习…

算法金 | 再见,支持向量机 SVM!

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 一、SVM概述 定义与基本概念 支持向量机&#xff08;SVM&#xff09;是一种监督学习模型&#xff0c;用于解决分类和回归问题。它的核…

Streamsets-JDBC模式offset变化逻辑和如何向下传递offset

Streamsets的版本为3.16.0 离线版 offset在jdbc模式中起到非常关键的作用&#xff0c;是滚动查询的基础&#xff0c;offset的准确直接影响数据同步的质量。 本文主要分享一下JDBC Query Consumer中的offset&#xff0c;包括变化逻辑、存储方式、处理器如何获取到最新的offset。…

如何在QGIS中加载MapBox图源

在设计行业中需要多风格地图的调用&#xff0c;不管是规划、建筑设计还是景观&#xff0c;分析图的工作量都大&#xff0c;有好的底图&#xff0c;会事半功倍。 针对不同项目&#xff0c;会选择不同配色的底图&#xff0c;以便让设计内容中的呈现足够清晰。 这里就来分享一个…

如何在自己的电脑上添加静态路由

1.任务栏搜索powershell 选择以管理员身份运行 2.输入 route add -p (永久) 目的网络地址例如192.168.10.0 mask 255.255.255.0&#xff08;子网掩码&#xff09;192.168.20.1&#xff08;下一跳地址&#xff09;。回车即可生效

238.除以自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 题目数据保证数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度内完…

网络编程(六)

网络编程&#xff08;六&#xff09; 广播&组播广播步骤 组播步骤 广播&组播 广播 是一种基于1发送多接收的模型 &#xff08;发送方和接收方&#xff09; 广播是在局域网内实现的&#xff08;发送到广播地址上的消息是会被局域网内同网段的所有主机进行接收&#xf…

[Redis]Set类型

集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元素之间是无序的 2&#xff09;元素不允许重复 一个集合中最多可以存储2^32-1个元素。 Redis 除了支持集合内的增删查改操作&#xff0c;同时还支持多个集合取交…

深入探讨ChatGPT API中的Tokens计算方式和计算库

引言 在现代人工智能应用中&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术无疑是最受关注的领域之一。OpenAI推出的ChatGPT&#xff0c;作为一种先进的对话模型&#xff0c;已经在多个领域展示了其强大的语言生成能力。为了更好地使用ChatGPT API&#xff0c;理解其…

操作系统(3) 处理机调度

目录 一、处理机调度概述 1.基本准则 &#xff08;1&#xff09;CPU利用率 &#xff08;2&#xff09;系统吞吐量 &#xff08;3&#xff09;周转时间 &#xff08;4&#xff09;等待时间 &#xff08;5&#xff09;响应时间 2.进程调度方式 &#xff08;1&#xff0…

【Linux】深入理解进程的优先级(Linux 2.6版本O(1)调度算法)

进程的优先级 【前置知识】一、进程的优先级(一&#xff09;为什么要有优先级&#xff1f;&#xff08;二&#xff09;进程的优先级的范围 二、操作系统是如何实现进程的优先级&#xff1f;&#xff08;Linux内核2.6版本O(1)调度算法&#xff09; 【前置知识】 首先我们要了解…

【excel】设置二级可变联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 step2 名称管理器step3 制作二级下拉菜单step4 消除二级菜单中的空白 【总结】 之前做完了 【excel】设置可变下拉菜单&#xff…

导航时间与坐标转换

前言&#xff1a; 该章节代码均在Gitee中开源&#xff1a;因为这章是学校作业&#xff0c;所以稍微正经点. 时空位置转换https://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/%E5%AF%BC%E8%88%AA%E6%97…

Idea-Linux远程开发部署

第一步&#xff1a;File->Remote Development 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a;在Host位置填写Linux虚拟机的IP地址&#xff0c;在Username、Password填写对应的账号密码后点击Test Connection测试连接。 第五步&#xff1a; 第六步&#xff1a;在…

【leetcode--文本对齐(还没整理完)】

根据题干描述的贪心算法&#xff0c;对于每一行&#xff0c;我们首先确定最多的是可以放置多少单词&#xff0c;这样可以得到该行的空格个数&#xff0c;从而确定该行单词之间的空格个数。 根据题目中填充空格的细节&#xff0c;我们分以下三种情况讨论&#xff1a; 当前行是…