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

news/2024/11/29 7:35:23/

目录

一,命名空间

1.何为命名空间

2.命名空间的使用

​编辑

4.::作用域限定符

3.命名空间的展开

全局展开:

局部展开: 

4.嵌套命名空间

二,缺省参数与函数重载

1.什么是缺省参数

2.什么是函数重载

3.两者的冲突 


一,命名空间

1.何为命名空间

在C++中,变量、函数和类的名称都将作用于全局作用域中,可能会导致很多命名冲突。使用命名空间的目的就是对标识符和名称进行本地化,以避免命名冲突或名字污染。定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对 {}即可, {}中即为命名空间的成员。命名空间将全局作用域分成不同的部分,不同命名空间中的标识符可以同名而不会发生冲突,命名空间可以发生嵌套,全局作用域也叫默认命名空间。

2.命名空间的使用

故主要作用是为了防止名字冲突,例如包含某个头文件展开后,自己定义的变量与之冲突就会报错,想要避免这种错误,我们会命名一片空间放入其中。

例如这种情况

#include<iostream>
#include<stdlib.h>
using namespace std;int rand = 0;
int mian()
{cout << rand << endl;return 0;
}

namespace myspace
{int rand = 0;
}

添加空间之后了,相当于给定了附属关系,现在有两个rand,一个是函数里的,一个就使myspace里的,命名就无法冲突了。

命名空间中可以定义变量,函数,类型。

namespace myspace
{int rand = 0;int ADD(int x,int y){return x + y;}struct intdata{int data=1;};}

4.::作用域限定符

其次通过作用于限定符可以表明某个成员的属于关系,格式为空间名::空间成员 

namespace myspace
{int rand = 0;int ADD(int x,int y){return x + y;}struct intdata{int data;};}
int main()
{cout << myspace::rand << endl;cout << myspace::ADD(1,2) << endl;struct myspace::intdata a;a.data = 2;cout << a.data << endl;return 0;
}

3.命名空间的展开

为了防止冲突,定义在命名空间后,由于多次频繁使用这个变量,每次加作用于限定符很麻烦,于是我们可以展开命名空间,编译器在调用时可以直接访问空间中的成员。

全局展开:

格式 using namespace 空间名;

但这种写法人存在弊端,因为命名冲突我们才利用空间分隔开,但若存在冲突的情况,直接展开的话,编译器还是不知道应该先用哪一个。

namespace myspace
{int rand = 0;int ADD(int x,int y){return x + y;}struct intdata{int data;};
}
using namespace myspace;
int main()
{cout << rand << endl;//cout << myspace::rand << endl;cout << ADD(1,2) << endl;struct intdata a;a.data = 2;cout << a.data << endl;return 0;
}

这里的rand 还是会报错,编译器选择冲突,此时还是要利用作用域限定符表明我是这个空间里的。 因此展开命名空间比较危险,我们一般还是需要作用域限定符比较安全。

局部展开: 

其次除了全局展开外,我们也可以利用局部展开,格式 using 空间名:: 成员名;

namespace myspace
{int ADD(int x,int y){return x + y;}struct intdata{int data;};
}using myspace::ADD;
using myspace::intdata;
int main()
{cout << ADD(1,2) << endl;struct intdata a;a.data = 2;cout << a.data << endl;return 0;
}

局部展开与全局展开也是有同样的风险。 

其次我们经常写的这两行就可以得到解释

#include<iostream>
using namespace std;

首先std是c++标准库中的命名空间,包含输出输入流头文件以后,全局展开std这个空间中的cout,cin等。

当然我们也可以不展开,利用作用域限定符有依然可以。

4.嵌套命名空间

命名空间可以嵌套使用,一般我们也就嵌套一两层,

namespace father
{int x = 1;namespace son{int y = 2;}
}
int main()
{cout << father::x << " " << father::son::y << endl;return 0;
}

其次,相同的命名空间会自动合并在一起。

二,缺省参数与函数重载

1.什么是缺省参数

缺省参数是c++对于函数声明或定义时伟函数的参数提供一哥缺省值,在调用函数时如果没有指定实参,那么函数会调用提供的缺省参数。例如:

int ADD(int x=1,int y=2)
{return x + y;
}
int main()
{cout << ADD() << endl;//3cout << ADD(2,4) << endl;//6return 0;
}

如以上ADD函数设置了缺省参数,在未给有实参时,我们 会默认调用设值得缺省参数,若有实参,先调实参。

 缺省参数分为全缺省和部分缺省,即所给定的实参的个数是否满足形参的个数。

int ADD(int x=1,int y=2)
{return x + y;
}
int main()
{
//传参从左往右cout << ADD() << endl;//全缺省 3cout << ADD(2) << endl;//部分缺省  4cout << ADD(2,3) << endl;//无缺省  5cout << ADD(, 3) << endl;//错误写法return 0;
}

2.什么是函数重载

函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数、类型、顺序)的函数,这组函数被称为重载函数。(注意无返回类型)

当调用一个重载函数时,编译器通过比较传递给函数的参数类型和数量来确定要调用哪个函数。如果找不到匹配的函数,则编译器会发出错误消息。

通俗的来说,利用函数重载可以做到,相同的函数名,但可以写多个函数,实现多种操作。

int  ADD(int x,int y)
{return x + y;
}
int  ADD(int x)
{return x;
}
double ADD(double x, double y)
{return x + y;
}
int main()
{cout << ADD(1) << endl;// 1cout << ADD(1,2) << endl;// 3cout << ADD(1.0,2.0) << endl;// 3return 0;
}

根据参数的个数 ,类型,顺序,调用实参对应的函数,一般重载函数的大部分功能是相同的。

3.两者的冲突 

之后我们会发现,同时存在函数重载和缺省参数,此时会出现冲突/例如:

int  ADD(int x,int y)
{return x + y;
}
int  ADD(int x)
{return x;
}
int  ADD(int x=0, int y)
{return x + y;
}
int main()
{cout << ADD(1) << endl;cout << ADD(1,2) << endl;return 0;
}

此时编译器调用函数时就会发生冲突不知道是应该调用缺省参数,还是重载函数。


http://www.ppmy.cn/news/937571.html

相关文章

Ubuntu18.04编译高通LK刷机后无法开机

vendor/qcom/proprietary/common/scripts/SecImage/signed/sign_and_encrypt/default/appsbl/SecImage_log.txt ERROR: SHA algorithm OU field is missing from certificate. 查看Ubuntu18.04系统openssl版本&#xff1a; openssl version: OpenSSL 1.1.1 11 Sep 2018 //可能…

诺基亚S60手机格机方法

格式前一点要保证电池电量充足&#xff0c;不要接充电器 1、软格 用指令 *#7370# *#7780# 都可以 2、硬格 格机&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xf…

selinux 权限导致手机无法开机

我们在调试的过程中会push so到手机中复测,但是因为有个别目录存在selinux权限问题,导致push so无法开机. 如我这边push 一个so出现这样的问题,出现这样的selinux权限问题 avc: denied { read } for pid=453 comm="boringssl_self_" name="libcrypto.so…

大神X7手机刷机/救砖/无法开机/请连接手机

一.手机型号 酷派大神X7全网通版&#xff08;8691-00&#xff09; 二.变砖过程 首先使用一键root软件对手机进行了root&#xff0c;然后发现root以后很多功能异常&#xff0c;然后尝试恢复出厂设置&#xff0c;然后就变成板砖了&#xff0c;无法开机启动 三.救砖 1.到大神手…

Flink Environment Variable

序言 我们在使用命令发布Flink任务的时候可以根据根据任务需要来设置环境变量(具体命令就是./flink run-application -t yarn-application),而不需要根据使用默认flink-conf.yaml的默认值,同时因为flink并不能自己根据任务的多少来设置算子的并行度等原因,所以根据任务的实际情…

解决使用fastboot命令时手机断开连接无法刷机的问题

设备信息&#xff1a; 手机&#xff1a;红米note7 pro 电脑&#xff1a;拯救者y7000p&#xff0c;这货三个usb口都是3.2的&#xff0c;问题就出在这里 问题描述&#xff1a; 因为手贱升级了magisk app导致magisk不识别了&#xff0c;超级用户和模块都不用能&#xff0c;只能重…

傻瓜式教学——手把手教你电脑三种方式连接打印机

如何判断打印机和电脑的连接方式&#xff1f; 电脑连接打印机有三种方式情况&#xff0c;一是通过USB直连&#xff0c;二是通过网络连接&#xff0c;三是通过共享连接。可通过下面方法判断连接方式。 如果通过①口和电脑连接&#xff0c;则是USB直连&#xff0c;请看Part1 如…

一次搞定各种打印

每天都使用但却熟悉又陌生&#xff1f;是不是眼花缭乱&#xff1f; fmt.Println fmt.Printffmt.Printfmt.Sprintffmt.Println 他们之间到底有什么区别&#xff1f; 发现个问题&#xff0c;是否经常使用 各种Print 但却经常出错&#xff0c;日志输出经常出现格式不对的问题&am…