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

news2024/11/27 1:40:48

文章目录

  • 前言
  • 命名空间
    • 命名空间的定义
    • 命名空间的使用
  • C++输入输出
  • 缺省参数
    • 缺省参数定义
    • 缺省参数分类
  • 函数重载
    • 函数重载的概念
    • 函数名修饰规则
    • extern "C"的使用
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

C++ 是一门强大而灵活的编程语言,具有许多高级的特性,其中包括命名空间、缺省参数和函数重载。这些特性为开发者提供了更好的代码组织结构、更灵活的函数调用方式以及更强大的函数多态性。在本博客中,我们将深入探讨这些特性,揭示它们的用途和优势,帮助读者更好地利用 C++ 的强大功能进行编程。


提示:以下是本篇文章正文内容,下面案例可供参考

命名空间

在C++中,命名空间是一种用于组织和管理代码的机制,旨在解决命名冲突和提供更好的代码结构。通过命名空间,程序员可以将全局作用域内的代码划分为不同的逻辑单元,使其更具可读性和可维护性。

命名空间的定义

基本形式

namespace NamespaceName {
    // 声明或定义代码元素
    // 如变量、函数、类等
}

普通的命名空间

namespace N1//N1是命名空间的名称
{
	//命名空间中的内容,既可以定义变量,也可以定义函数
	int b;
	int add(int num1, int num2)
	{
		return num1 + num2;
	}
}

命名空间的嵌套

namespace N2
{
	int a;
	int b;
	int add(int num1, int num2)
	{
		return num1 + num2;
	}

	namespace N3
	{
		int c;
		int f;
		int sub(int num1, int num2)
		{
			return num1 - num2;
		}
	}
}

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

//同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
namespace N2
{
	int mul(int num1, int num2)
	{
		return num1 * num2;
	}
}

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

命名空间的使用

先看一段代码

#include <iostream>
using namespace std;
namespace N2
{
	int a;
	int b;
	int add(int num1, int num2)
	{
		return num1 + num2;
	}

	namespace N3
	{
		int c;
		int f;
		int sub(int num1, int num2)
		{
			return num1 - num2;
		}
	}
}
int main()
{
	cout <<a << endl;//编译错误,a是未定义的标识符
}

在这段代码中,直接利用变量a并不可行,那么如何引入命名空间N2中的a呢?

命名空间的使用有三种方式:

  • 加命名空间名称及作用域标识符
int main()
{
	cout<<N2::a<<endl;
	cout << N2::N3::f << endl;
	return 0;
}
  • 使用using关键字将命名空间中成员引入
using N2::a;
using N2::N3::f;
int main()
{
	cout<<a<<endl;
	cout << f << endl;
	return 0;
}
  • 使用using namespace关键字将命名空间名称引入
using namespace N2;
int main()
{
	cout<<a<<endl;
	cout << N3::f << endl;
	return 0;
}

C++输入输出

C++ 的输入输出是通过标准库的 <iostream> 头文件提供的。主要使用 cin 进行输入,cout 进行输出。

输入(cin):

  1. 基本输入:

    int num;
    std::cin >> num;  // 从标准输入读取整数
    
  2. 字符输入:

    char ch;
    std::cin >> ch;  // 从标准输入读取字符
    
  3. 字符串输入:

    std::string str;
    std::cin >> str;  // 从标准输入读取字符串,以空白字符为分隔符
    

输出(cout):

  1. 基本输出:

    int num = 42;
    std::cout << num;  // 将整数输出到标准输出
    
  2. 字符输出:

    char ch = 'A';
    std::cout << ch;  // 将字符输出到标准输出
    
  3. 字符串输出:

    std::string str = "Hello, World!";
    std::cout << str;  // 将字符串输出到标准输出
    

文件输入输出:

  1. 文件输入:

    std::ifstream inputFile("input.txt");
    int num;
    inputFile >> num;  // 从文件读取整数
    
  2. 文件输出:

    std::ofstream outputFile("output.txt");
    int result = 42;
    outputFile << result;  // 将整数写入文件
    

注意事项:

  • 输入输出流操作需要包含 <iostream> 头文件和std标准命名空间。
  • 避免使用未初始化的变量进行输出。
  • 使用文件输入输出时,确保文件是否存在、可读写。
  • 早期的编译器还支持<iosteam.h>的写法,但后续编译器都不支持,因此推荐使用<iosteam>+std的写法。
  • 使用C++输入输出更方便,不需要增加数据格式控制,比如:整型-%d等。

以上是C++中输入输出的基本概念,这些简单而强大的机制可以满足日常编程中的大多数需求。

缺省参数

缺省参数定义

在C++中,缺省参数(默认参数)是一种函数参数的设置方式,允许在调用函数时不提供该参数的值,而使用函数定义时指定的默认值。这样的设计提高了函数的灵活性和可用性,使得函数的调用更为简便。
示例:

#include <iostream>
using namespace std;
void test(int a = 10)
{
	cout << a << endl;
}
int main()
{
	test();//没有传参时,使用默认参数
	test(20);//传参时使用指定参数
	return  0;
}

运行结果
在这里插入图片描述
从结果上,证明了缺省参数就是默认参数的事实!!!

缺省参数分类

  • 全缺省
#include <iostream>
using namespace std;
void test(int a = 10,int b = 20,int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}
int main()
{
	test();
	test(1);
	test(1,2);
	test(1,2,3);
	return  0;
}
  • 半缺省
#include <iostream>
using namespace std;
void test(int a ,int b ,int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}
int main()
{
	test(1,2);
	test(1,2,3);
	return  0;
}

注意事项:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 半缺省参数必须从右往左依次来给出,不能间隔着给
  • 缺省参数不能在函数声明和定义中同时出现(编译器报错重定义默认参数)
void test1(int x = 10);
void test1(int x = 20)
{
	cout << x << endl;
}
  • 缺省值必须是常量或者全局变量
  • C语言不支持(编译器不支持)

函数重载

函数重载的概念

函数重载是指在同一个作用域内定义多个同名函数,但它们的参数列表或参数类型不同(参数个数或类型或顺序必须其中有一个不同)。C++允许在程序中使用相同的函数名,通过函数参数的不同组合来区分它们。
示例:

#include <iostream>
using namespace std;
int add(int num1, int num2)
{
	return num1 + num2;
}
double add(double num1, double num2)
{
	return num1 + num2;
}

int main()
{
	cout << add(10, 20) << endl;
	cout << add(10.1, 20.1) << endl;
	return 0;
}

注意:函数重载和返回值类型没有关系!!!

函数名修饰规则

为什么C++支持函数重载,但是C语言不支持?
谈到这个问题,我们需要知道程序的运行,需要经过几个步骤:

  • 预处理:宏替换、去注释、头文件的展开

  • 编译:语法分析等、检查语法错误

  • 汇编:将源代码转换成二进制代码,生成目标文件和符号表

  • 链接:链接目标文件,符号表的合并与重定位,生成可执行程序

  • 实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,当a.cpp中调用了b.cpp中定义的Add函数时,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?

  • 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。

  • 那么链接时,面对Add函数,链接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则

  • 由于Windows下vs的修饰规则过于复杂,而Linux下gcc的修饰规则简单易懂,下面我们使用了gcc演示了这个修饰后的名字。

  • 通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成_Z+函数长度+函数名+类型首字母

关键来咯!!!!

  • 采用C语言编译器,编译后结果
    在这里插入图片描述
    结论:linux、gcc下,可以看到在汇编代码中,函数名和源代码中函数名是一样的,这也说明C语言函数名修饰规则基本就是采用原来的函数名
  • 采用C++编译器,编译后结果

在这里插入图片描述
结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息
添加到修改后的名字中。

extern "C"的使用

有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern “C”,意思是告诉编译器,
将该函数按照C语言规则来编译。比如:tcmalloc是google用C++实现的一个项目,他提供tcmallc()和tcfree
两个接口来使用,但如果是C项目就没办法使用,那么他就使用extern “C”来解决。

extern "C" int Add(int left, int right);
int main()
{
 	Add(1,2);
 	return 0;
}

总结

通过本博客的阅读,我们希望读者能够更深入地理解 C++ 中命名空间的作用,掌握如何使用缺省参数使函数调用更简洁、灵活,以及如何通过函数重载实现更多样化的函数功能。这些特性不仅提高了代码的可读性和可维护性,也为开发者提供了更多的选择,使得 C++ 成为处理各种编程任务的理想选择。愿这些知识点的掌握能够让你在 C++ 编程的旅途中更加得心应手。

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

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

相关文章

linux释放交换空间-Swap

确保剩余内存比swap内存空间大&#xff0c;再执行以下操作&#xff0c;否则会宕机&#xff01; 查看swap分区 swapon -s 会查看到你的swap分区位置 停止swap分区 停止swap分区是将swap内存释放到实际内存中 swapoff /dev/dm-1开启swap分区 swap分区内存成功释放到实际内…

ant-design-vue的form表单全局禁用不生效

文章目录 一、问题二、解决2.1、4.0之前的版本2.2、4.0开始的版本 三、最后 一、问题 ​ 实际使用ant-design-vue在开发表单的时候或许会遇到编辑与查看的需求&#xff0c;但是查看的时候表单不允许编辑&#xff0c;ant-design-vue的官方是没有像element一样提供全局disabled属…

message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogra

第一步&#xff1a;修改 project.config.json 文件 "packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./miniprogram/"}], "packNpmManually": true 第二步&#xff1a;…

Linux--批量自动装机

实验环境 随着某公司业务不断发展&#xff0c;服务器主机的数量也迅速增长&#xff0c;对于功能变更或新采购的服务器&#xff0c; 需要重新安装CentOS7操作系统&#xff0c;为了提高服务器装机效率&#xff0c;要求基于PXE网络实现全自动无人值 守批量安装。 需求描述 > 服…

[蓝桥 2023] 位乘积计数

问题描述 给定两个正整数 n 和 m&#xff0c;请你计算出&#xff0c;从 1到 n 的所有整数中&#xff0c;满足每一位上的数字乘积小于等于 m 的数字的个数。 例如&#xff0c;当 n12&#xff0c;m3 时&#xff0c;满足条件的数字有 1,2,3,10,11,12 共 6 个。 输入格式 输出格…

TCP中的三次握手和四次挥手

TCP中的连接和断开可以说是在面试中经常被问到的问题之一&#xff0c;正好有空就总结一下&#xff0c;首先回顾一下TCP的相关知识点 1. TCP的基础知识 1.1 TCP的基本概念 我们知道TCP是运输层的面向连接的可靠的传输协议。面向连接的&#xff0c;指的就是在两个进程发送数据…

Pandas教程(四)—— 分层索引及数据联合

1.分层索引 分层索引就是在一个轴上拥有多个&#xff08;两个及以上&#xff09;索引级别&#xff0c;能以低维度形式处理高维度数据。 行索引有两层 1.1 分层索引的创建 1.1.1 方式一&#xff1a;直接设置 1&#xff09;在创建series、dataframe或读取文件时时&#xff0c;行…

《深入理解JAVA虚拟机笔记》垃圾回收器

JVM 判定 Java 对象是否为垃圾的方法 引用计数算法 很多教科书判断对象是否存活的算法是这样的: 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为…

新产品推广选品牌外包广州迅腾文化传播多渠道传播能力

在当今激烈的市场竞争中&#xff0c;新产品推广已成为企业发展的关键。选择具备多渠道传播能力的品牌外包服务提供商&#xff0c;有助于快速提升品牌知名度和市场占有率。作为行业领先者&#xff0c;迅腾文化凭借卓越的多渠道传播能力&#xff0c;成为企业新产品推广的理想合作…

GDPR对邮件营销的影响:合规要求与应对策略

在当今数字化的时代&#xff0c;电子邮件营销已成为企业与顾客联系的重要渠道之一。然而&#xff0c;随着全球数据保护法规的出台&#xff0c;特别是欧盟的GDPR&#xff08;通用数据保护条例&#xff09;&#xff0c;企业在进行邮件营销时需要更加关注隐私政策和用户数据保护。…

Big-endian与Little-endian详尽说明

大端与小端存储详尽说明 大端与小端存储详尽说明 大端与小端存储详尽说明一. 什么是字节序二. 什么是大端存储模式三. 什么是小端存储模式四. 大小端各自的特点五. 为什么会有大小端模式之分六. 为什么要注意大小端问题六. 大小端判定程序七. 大端小端的转换1&#xff09;16位大…

2023年12月编程语言排行榜

TIOBE Index for December 2023 December Headline: C# on its way to become programming language of the year 2023 2023年12月的TIOBE指数&#xff1a;12月头条:c#将成为2023年最佳编程语言 Yes, I know, we have been here before. At the end of 2022, it looked like …

什么是GeoTrust?

在当今数字化时代&#xff0c;网络安全是至关重要的。GeoTrust&#xff0c;作为全球领先的SSL证书提供商&#xff0c;致力于为用户提供卓越的数字安全解决方案。 产品与服务&#xff1a; 域名验证证书&#xff1a; 提供快速简便的验证&#xff0c;是保护网站和用户数据的基础。…

Openwrt修改Dropbear ssh root密码

使用ssh工具连接路由器 输入&#xff1a;passwd root 输入新密码 重复新密码 设置完成 rootImmortalWrt:~# passwd root Changing password for root New password:

【2023年终总结:轻舟已过万重山】

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列…

设计模式—行为型模式之模板方法模式

设计模式—行为型模式之模板方法模式 在模板模式&#xff08;Template Pattern&#xff09;中&#xff0c;一个抽象类公开定义了执行它的方法的方式模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 模板方法&#xff08;Template Metho…

【C Primer Plus第六版 学习笔记】 第十六章 C预处理器和C库

有基础&#xff0c;进阶用&#xff0c;个人查漏补缺 第十五章的内容之前学过&#xff0c;跳过 预处理之前&#xff0c;编译器必须对该程序进行一些翻译处理 首先把源代码中出现的字符映射到原字符集 其次编译器定位每个反斜杠后面跟着换行符的实例&#xff0c;并删除它们&…

软件测试/测试开发丨Python 常用第三方库 pymysql

pymysql 概述 Python 的数据库接口标准是 Python DB-APIPyMySQL 是从 Python 连接到 MySQL 数据库服务器的接口PyMySQL 的目标是成为 MySQLdb 的替代品官方文档&#xff1a;pymysql.readthedocs.io/ pymysql 安装 使用 pip 安装使用 Pycharm 界面安装 pip install pymysqlp…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 代码下载(1)

本文主要参考&#xff1a; BQ3588C_代码下载 1. 安装依赖工具 安装命令如下&#xff1a; sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flexbison gperf build-essential zip curl zlib1g-dev gcc-multilib g-multiliblibc6-dev-i386 l…

Note: An Interesting Festival

An Interesting Festival 一个有趣的节日。 festival The Agricultural Feast takes place after the independence Day. 农业盛会在独立日后举行 takes place independence feast agricultural It is not a worldwide celebration. 它不是一个全球的庆典。 worldwide ce…