『C++成长记』C++入门——命名空间缺省参数

news2024/12/24 20:30:29

 🔥博客主页:小王又困了

📚系列专栏:C++

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、C++的认识

📒1.1什么是C++

📒1.2C++的发展

二、C++关键字

三、命名空间

📒3.1为什么有命名空间

📒3.2命名空间定义

📒3.3命名空间使用

📒3.4命名空间的嵌套

📒3.5std命名空间的使用

四、C++的输入和输出

五、缺省参数

📒5.1缺省参数的定义

📒5.2 缺省参数分类

📒5.3缺省参数出现的位置


🗒️前言:

C++是在C语言的基础上发展而来的,C++优化了C语言的很多问题,让使用者使用起来更加方便,从今天开始我们将进入C++的学习,学习C++的奇妙之处。

一、C++的认识

📒1.1什么是C++

        C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机 界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

📒1.2C++的发展

       1979年,贝尔实验室的本贾尼等人试图分析 unix 内核的时候,试图将内核模块化,于是在C 语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。

C++的历史版本:

二、C++关键字

 C++一共有63个关键字,其中有32个是C语言中的关键字

三、命名空间

📒3.1为什么有命名空间

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

例如:

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

int rand = 10;

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


 在这段程序中,不引用头文件#include <stdlib.h>是可以正常运行的,但引用后程序就会报错,这是什么原因呢?因为 rand <stdlib.h> 中已有了定义,这里报了重定义的错误。

     命名空间分割了全局命名空间,其中每一个命名空间是一个作用域。域是一种空间概念,常见的域有:局部域、全局域、类域、命名空间域,域会影响访问和生命周期。

📒3.2命名空间定义

     命名空间的定义由两部分构成:首先是关键字namespace,后面跟命名空间的名字,然后接一对花括号,花括号中即为命名空间的成员。 命名空间中可以定义变量、函数、类型和其他命名空间。

namespace N1//命名空间的名字
{
    //定义变量
    int rand = 10;

    //定义函数
    int Add(int left, int right)
    {
        return left + right;
    }

    //定义类型
    struct Node
    {
        struct Node* next;
        int val;
    };

    //嵌套命名空间
    namespace N2
    {
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}

注意:

  • 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
  • 用一个工程中允许出现多个相同名称的命名空间,编译器最后会将它们合并为一个命名空间。 

📒3.3命名空间使用

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

  • 加命名空间名称及域作用限定符
    namespace N
    {
        int a=10;
        int b=5;
    }
    
    int main()
    {
        printf("%d\n", N::a);
        return 0;    
    }
    
  •  使用 using 将命名空间中某个成员引入
    using N::b;
    int main()
    {
        printf("%d\n", N::a);
        printf("%d\n", b);
        return 0;    
    }
    
  •  使用 using namespace 命名空间名称引入(展开命名空间)
    namespace N
    {
        int a=10;
        int b=5;
    }
    
    int a=20;
    
    using namespce N;
    
    int main()
    {
        printf("%d\n", a);      //a不明确,有二义性
        printf("%d\n", ::a);    //访问全局的a  
        printf("%d\n", N::a);   //访问N中的a
        printf("%d\n", b);
        return 0;    
    }
    

    N中的成员a 就与全局作用域中的a 产生了冲突。这种冲突是允许存在的,但是要想使用冲突的名字,我们就必须明确指出名字的版本。main函数中所有未加限定的a都会产生二义性错误。

这时我们必须使用域作用限定符(::)来明确指出所需的版本

  • : :a来表示全局作用域中的a
  • N: :a来表示定义在N中的a

 注意:

如果命名空间没有展开,编译器默认是不会搜索命名空间中的变量,去访问变量是访问不到的。

访问的优先级:局部域 > 全局域

📒3.4命名空间的嵌套

      嵌套的命名空间同时是一个嵌套的作用域,它嵌套在外层命名空间的作用域中。嵌套的命名空间中的名字遵循的规则与往常类似:内层命名空间声明的名字将隐藏外层命名空间声明的同名成员。在嵌套的命名空间中定义的名字只在内层命名空间中有效,外层命名空间的代码想要访问它必须在名字前添加限定符。

namespace N
{
    int a = 10;

    namespace N1
    {
        int a = 20;    //将外层作用域的a隐藏了
        int b = 15;

    namespace N2
    {
        int c = N1::b;
    }
}

int main()
{
    printf("%d\n", N::N2::c);
    printf("%d\n", N::N1::a);
    printf("%d\n", N::a);
    return 0;
}

📒3.5std命名空间的使用

std是C++标准库的命名空间,如何展开std使用更合理呢?

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

四、C++的输入和输出

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	double b = 10.5;
	cout << a << endl;
	cout << b << endl;
	return 0;
}

我们在项目中要经常使用 coutendl,每次指定命名空间很不方便,直接展开会全部暴露,有冲突风险,我们可以指定展开来解决问题。

using std::cout;
using std::endl;

说明:

  • 使用cout标准输出对象(控制台)cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  • coutcin 是全局的流对象,endl 是特殊的C++符号,表示换行输出,他们都包含在包含 < iostream >头文件中。
  • <<是流插入运算符,>>是流提取运算符。
  • 使用C++输入输出更方便,不需要像 printf和scanf 输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型

五、缺省参数

📒5.1缺省参数的定义

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

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

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

上面代码在第一次调用 Func() 时,没有传递参数,a 就使用了缺省值。

📒5.2 缺省参数分类

  • 全缺省参数 -- 所有参数都给了缺省值
void Func(int a = 10, int b = 20, int c = 30)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

int main()
{
    Func(1,2,3);    
    Func(1,2); 
    Func(1); 
    Func();  
    return 0;
}

    全缺省参数在传参时,参数是按照从左往右的顺序进行缺省的,不能跳着缺省,例如:Func(1,  ,3) ,让第一个形参和第三个形参都使用传递值,而让第二个参数使用缺省值,这种做法是不被允许的。

  • 半缺省参数 -- 部分的参数给了缺省值
void Func(int a, int b = 20, int c = 30)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

int main()
{
    Func(1,2,3);    
    Func(1,2); 
    Func(1);  
    return 0;
}

     半缺省参数必须从右往左依次来给出,不能间隔着给。

注意:

  1. 缺省参数不能在函数声明和定义中同时出现,只能出现在函数声明中。
  2. 缺省值必须是常量或者全局变量。

📒5.3缺省参数出现的位置

      缺省参数只能出现在函数声明中,如下面的代码,在声明和定义中都给了缺省参数,而且给定的值不相同,就不知道以哪个值为准。

//a.h
void Func(int a = 10);

  
//a.cpp
void Func(int a = 20)
{}

      不能只在声明处给缺省参数,如下面的代码,如果只在声明处给缺省参数,在其他的文件中没有缺省参数,就不知是什么值。

//a.cpp
void Func(int a = 10)
{}
  
//b.cpp
void Func(int a)
{}

 本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

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

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

相关文章

Bootstrap的small标签

Bootstrap 中的 <small> 标签是用来标记和渲染小文本的 HTML 元素。它通常用于表示与主要文本内容不同的次要信息、注释、版权声明、法律声明、或者其他需要更小字号的文本。在 Bootstrap 中&#xff0c;<small> 标签可以进一步定制样式以适应您的设计需求。 以下…

如何用工业树莓派和MQTT平台打通OT和IT?

一、应用设备 OT端设备&#xff1a;步进电机&#xff0c;MODBUS TCP远程I/O模块&#xff0c;PLC设备 边缘侧设备&#xff1a;宏集工业树莓派&#xff1b; IT端设备&#xff1a;PC、安卓手机&#xff1b; IT端软件&#xff1a;宏集HiveMQ MQTT通信平台 二、原理 宏集工业树…

Autodesk_Revit2022安装图文教程_Revit2022建筑信息模型BIM软件图文教程

下载地址&#xff1a;https://pan.92zl.cn/ 1、先下载文件&#xff0c;不同版本的安装注册方式是不一样的步骤。 2、运行安装文件。 3、安装过程请等待 4、和常用软件一样安装&#xff0c;注意安装路径即可 5、直到出现安装完成界面 6、接下来打开Crack文件夹的Autodesk Licen…

Redis之UV统计

HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。PV&#xff1a;全称Page View&#xff0c;也叫页…

C++类与对象 (上)

C类与对象 &#xff08;上&#xff09; 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1权限限定符4.2封装 5.类的作用域6.类的实例化7.类的对象大小的计算7.1如何计算类的大小7.2类对象的储存方式 8.类成员函数的this指针8.1this指针的引出8.2thi…

C语言动态内存管理———超级全!快来看!

C语言动态内存管理———超级全&#xff01;快来看&#xff01; 文章目录 C语言动态内存管理———超级全&#xff01;快来看&#xff01;一、为什么要用动态内存二、动态内存函数1.malloc和free①malloc②.free③举例a.内存的空间b.栗子 2.calloc3.realloc 三、动态内存分配常…

遇到工厂索赔你是一竿子处理方式吗?

最近听到一个博主说关于客户索赔的事情&#xff0c;说是自己以前的处理方式要么就是将事情推给工厂&#xff0c;以工厂的态度为原则&#xff0c;工厂赔付给我们&#xff0c;然后我们就同意赔付给客户。如果工厂敷衍我们&#xff0c;那么我们就敷衍客户&#xff0c;这样最起码能…

蓝桥杯每日一题2023.10.19

题目描述 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 题目分析 我们以每一个节点的坐标来将这一深度的权值之和相加从而算出权值和 要清楚每一个深度的其实节点和末尾节点&#xff0c;使用双指针将这个深度节点的权值和计算出来&#xff0c;记录所 需要的深度即可 #includ…

QT基础 柱状图

目录 1.QBarSeries 2.QHorizontalBarSeries 3.QPercentBarSeries 4.QHorizontalPercentBarSeries 5.QStackedBarSeries 6.QHorizontalStackedBarSeries 从上图得知柱状的基类是QAbstractBarSeries&#xff0c;派生出来分别是柱状图的水平和垂直类&#xff0c;只是类型…

1688拍立淘接口,按图搜索商品接口,图片识别接口,图片上传搜索接口,图片搜索API接口,以图搜货接口

1688拍立淘接口的作用是让用户通过上传图片或输入图片链接的方式&#xff0c;调用1688的图片搜索引擎&#xff0c;返回与该图片相关的所有1688商品。 使用该接口需要先获取一个key和secret&#xff0c;然后参考API文档里的接入方式和示例&#xff0c;查看测试工具是否有需要的…

h5的扫一扫功能 (非微信浏览器环境下)

必须在 https 域名下才生效 <template><div><van-field label"服务商编码" right-icon"scan" placeholder"扫描二维码获取" click-right-icon"getCameras" /> <div class"scan" :style"{disp…

互动超2800万!小红书涌现大批“听劝人”,关键词数据发掘内容玩法

听说一身反骨的年轻人&#xff0c;最近开始听劝了&#xff1f;不知道你有没有注意到&#xff0c;小红书上被“旅游听劝、穿搭听劝、改妆听劝”等各种“听劝”刷屏&#xff0c;诸多品牌纷纷入局&#xff0c;迂回种草。 一、预估互动量超2800万&#xff0c;小红书“听劝体”爆火 …

大数据高级面试题

大数据高级面试题 Kafka的producer如何实现幂等性? Producer 幂等性 Producer 的幂等性指的是当发送同一条消息时&#xff0c;数据在 Server 端只会被持久化一次&#xff0c;数据不丟不重&#xff0c;但是这里的幂等性是有条件的&#xff1a; 只能保证 Producer 在单个会话内…

最新最全大数据专业毕业设计选题精华汇总-持续更新中

文章目录 0 前言1 大数据毕设选题推荐2 开题指导3 最后 0 前言 大家好&#xff01;大四的同学们&#xff0c;毕业设计的时间即将到来&#xff0c;你们准备好了吗&#xff1f;为了帮助大家更好地开始毕设&#xff0c;我作为学长给大家整理了最新的计算机大数据专业的毕设选题。…

内网穿透的应用-通过内网穿透技术实现PLSQL远程访问Oracle数据库

文章目录 前言1. 安装postgreSQL2. 本地连接postgreSQL3. Windows 安装 cpolar4. 配置postgreSQL公网地址5. 公网postgreSQL访问6. 固定连接公网地址7. postgreSQL固定地址连接测试 前言 PostgreSQL是一个功能非常强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;,下…

企业如何有效搭建呼叫中心系统?

通讯是企业运营的重要组成部分&#xff0c;尤其是大型企业&#xff0c;必须采取有效的通讯方式&#xff0c;以便于与客户保持良好的沟通。为了满足这个需求&#xff0c;许多企业已经开始搭建自己的呼叫中心系统。 呼叫中心是什么&#xff1f; 呼叫中心系统是一种用于处理大量电…

OnlyOffice集成Springboot以及web端

上次我们已经搭建好了onlyoffice的服务&#xff0c;不知道如何搭建的伙伴可以看看上篇文章。 以下是springboot和前端web简单集成的页面&#xff0c;亲测jdk8和jdk17都适用。 结构 前端页面 index.html <!DOCTYPE html> <html lang"en" xmlns:th"h…

虹科Pico技术交流会上海站启程 | 2+2课程新模式,入门汽车波形免拆诊断

虹科与Tech Gear免拆诊断学院即将于9月在上海举办汽车示波器交流会&#xff0c;本次交流会报名人满即开班&#xff0c;旨在为汽车示波器的基础入门和初阶选手提供学习机会。 本次交流会将在Tech Gear免拆诊断学院的车间进行。课程的安排灵活多样&#xff0c;包括理论课程和实践…

自定义内核模块读取进程的线性地址

打印指定进程的线性地址段 利用procfs查看进程的线性地址自定义内核模块读取进程的线性地址编译并加载内核模块 利用procfs查看进程的线性地址 自定义内核模块读取进程的线性地址 #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h…

双线性插值详解

双线性插值的原理网上资料非常多,本文重点介绍双线性插值实现的两种方式: 角对齐(coner_align = True) 和 边对齐(coner_align = False)。两种不能的方式下去实现双线性插值,目标图像中的每个像素点,它是如何计算取值的,本文会通过原理结合代码的方式将实现细节讲清楚。 1…