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

文章目录

  • 前言
  • 命名空间
    • 命名空间的定义
    • 命名空间的使用
  • 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.mzph.cn/news/590342.shtml

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

相关文章

Embedding模型在大语言模型中的重要性

引言 随着大型语言模型的发展&#xff0c;以ChatGPT为首&#xff0c;涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快&#xff0c;却少有关注支撑许多大型语言模型应用落地的必不可少的Embedding模型。本文将主要介绍为什么…

C ++类

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

【ROS2】MOMO的鱼香ROS2(四)ROS2入门篇——ROS2节点通信之话题与服务

ROS2节点通信之话题与服务点 引言1 理解从通信开始1.1 TCP&#xff08;传输控制协议&#xff09;1.2 UDP&#xff08;用户数据报协议&#xff09;1.3 基于共享内存的IPC方式 2 ROS2话题2.1 ROS2话题指令2.2 话题之RCLPY实现2.2.1 编写发布者2.2 2 编写订阅者2.2.3 运行测试 3 R…

OSG读取和添加节点学习

之前加载了一个模型&#xff0c;代码是&#xff0c; osg::Group* root new osg::Group(); osg::Node* node new osg::Node(); node osgDB::readNodeFile("tree.osg"); root->addChild(node); root是指向osg::Group的指针&#xff1b; node是 osg:…

字节高级Java面试真题

今年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验…

appium入门基础

介绍 appium支持在不同平台的UI自动化&#xff0c;如web,移动端,桌面端等。还支持使用java&#xff0c;python&#xff0c;js等语言编写自动化代码。主要用于自动化测试脚本&#xff0c;省去重复的手动操作。 Appium官网 安装 首先必须环境有Node.js用于安装Appium。 总体来…

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

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

TransNeXt:稳健的注视感知ViT学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2311.17132.pdf 代码地址&#xff1a; GitHub - DaiShiResearch/TransNeXt: Code release for TransNeXt model 可以直接在ImageNet上训练的分类代码&#xff1a;GitHub - athrunsunny/TransNext-classify 代码中读取数据的部分修改…

Rust学习笔记006:代码组织

Crate 在Rust中&#xff0c;“crate” 是指 Rust 的代码单元&#xff0c;它可以包含一个或多个模块&#xff08;modules&#xff09;。Rust 的 crate 分类主要有两个方面&#xff1a;库&#xff08;Library Crates&#xff09;和二进制&#xff08;Binary Crates&#xff09;。…

病理HE学习贴(自备)

目录 正常结构 癌症HE 在线学习 以胃癌的学习为例 正常结构 1&#xff1a;胃粘膜正常结构和细胞分化 ●表面覆盖小凹上皮细胞(主要标志物&#xff1a;MUC5AC)以保护黏膜。 ●胃底腺固有腺体由黏液颈细胞(MUC6)、主细胞(Pepsinogen l)和壁细胞(Proton pump α-subunit)组…

算法练习Day23 (Leetcode/Python-回溯算法)

46. Permutations Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order. Example 1: Input: nums [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路&#xff1a;此题可用回溯…

oracle学习(6)

其他数据库对象 视图&#xff1a; 常见数据库对象——视图&#xff1a;从表中抽出的逻辑上相关的数据集合。 所以&#xff1a;1. 视图基于表。2. 视图是逻辑概念。3. 视图本身没有数据。 创建视图 创建语法与创建表类似&#xff0c;只需要将table → view即可: SQL> …

Selenium教程04:鼠标+键盘网页的模拟操作

在webdriver 中&#xff0c;鼠标操作都封装在ActionChains类中&#xff0c;使用的时候需要导入这个包。 from selenium.webdriver import ActionChainsActionChains方法列表如下&#xff1a; click(on_elementNone) ——单击鼠标左键click_and_hold(on_elementNone) ——点击…

将PPT4页并排成1页

将PPT4页并排成1页打印 解决方法: 方法一 在打印时选择&#xff1a; 打开 PPT&#xff0c;点击文件选项点击打印点击整页幻灯片点击4张水平放置的幻灯平页面就会显示4张PPT显示在一张纸上 方法二 另存为PDF&#xff1a; 打开电脑上的目标PPT文件&#xff0c;点击文件点击…

可拖拽流程图组件开发

效果 说在前面 流程图在技术领域是一种常见的可视化工具&#xff0c;用于展示系统、应用或业务流程的各个步骤以及它们之间的关系。它们可以帮助开发人员和项目团队更好地理解和规划复杂的流程&#xff0c;从而提高工作效率和准确性。但是&#xff0c;传统的静态流程图有时无法…

《深入理解C++11:C++11新特性解析与应用》笔记七

第七章 为改变思考方式而改变 7.1 指针空值--nullptr 7.1.1 指针空值&#xff1a;从0到NULL&#xff0c;再到nullptr 传统C头文件里NULL是一个宏定义&#xff1a; 在函数重载同时出现int和char *参数版本的函数时&#xff0c;使用NULL作为参数调用函数会调用int参数版本&…

elasticsearch系列九:异地容灾-CCR跨集群复制

概述 起初只在部分业务中采用es存储数据&#xff0c;在主中心搭建了个集群&#xff0c;随着es在我们系统中的地位越来越重要&#xff0c;数据也越来越多&#xff0c;针对它的安全性问题也越发重要&#xff0c;那如何对es做异地容灾呢&#xff1f; 今天咱们就一起看下官方提供的…

【电商项目实战】商品详情显示与Redis存储购物车信息

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

合伙企业有哪些分类

合伙企业分为&#xff1a;普通合伙企业和有限合伙企业。其中&#xff0c;普通合伙企业又包含特殊的普通合伙企业。 1、普通合伙企业由2人以上普通合伙人(没有上限规定)组成。 普通合伙企业中&#xff0c;合伙人对合伙企业债务承担无限连带责任。 特殊的普通合伙企业中&#xf…

软件测试/测试开发丨Python 封装 学习笔记

封装的概念 封装&#xff08;Encapsulation&#xff09; 隐藏&#xff1a;属性和实现细节&#xff0c;不允许外部直接访问暴露&#xff1a;公开方法&#xff0c;实现对内部信息的操作和访问 封装的作用 限制安全的访问和操作&#xff0c;提高数据安全性可进行数据检查&#x…