C++的命名空间、输入输出以及缺省参数

一、C++的命名空间

1.1命名空间的意义

在C语言大型代码编辑的过程当中,我们常常遇到命名冲突的问题,比如我们在使用了<stdlib.h>的头文件后,就不能再定义名为rand的变量了,因为在这一头文件下有rand()函数的定义,会发生命名冲突。

因此,命名空间namespace就是为了解决这一问题而生,而命名空间本身是作为一个独立的域存在的,与全局域,局部域并列,我们可以在他的内部定义函数,变量或类型(例如结构体,枚举类型,联合体类型等等)。

1.2命名空间的例子

namespace me
{
     int rand=0;
}

这样做以后,我们就可以实现在有头文件<stdlib.h>的情况下照常定义变量rand了。

1.2-补充说明

在C语言中,我们允许不同的域定义同名变量,例如

int a=0;
int main()
{
    int a=1;
    printf("%d",a);
    printf("%d",::a);//如果域作用限定符左侧为空,则默认访问全局域
    return 0;
}

1.3使用命名空间的方式

1.3.1使用举例

例如,针对1.2中定义的命名空间,我么应该如何使用它呢?

printf("%d/n",me::rand);

1.3.2命名空间可以嵌套使用

比如在定义的时候

namespace me
{
    namespace you
    {
        int rand=0;
    }
}

则可以这样使用

printf("%d\n",me::you::rand);

1.3.3多个文件中的同名命名空间可以合并

例如在定义一个.h头文件和一个.cpp源文件的时候,我们可以在两个文件下都使用名为me的命名空间,在.h中实现函数声明,在.cpp中实现函数的定义,这样以后,在我们运行程序的时候会发现他们自动合并了,并不会报错。

1.3.4命名空间的展开

如果我们在写代码的时候没有命名冲突的问题,并且经常用到同一个命名空间内的某些变量,类型或函数,我们则可以把这一命名空间全部展开或部分展开

1.3.4.1命名空间的全展开

例如

using namespace me;

这样以后我们就可以正常使用命名空间“me”内部的函数,类型和变量而不加me::的前提了,但需要注意的是一旦展开,那么就不能在其他位置有相同的函数名/变量名了

1.3.4.2命名空间的部分展开

例如:

using me::rand;

这样以后就可以正常使用命名空间内部的变量rand而不加me::的前提了,但同样不能再其他位置有名为rand的定义了。

1.3-补充说明

Ⅰ.在我们使用一个变量/函数的时候,编译器会默认按照如下顺序进行查找

①当前局部域

②全局域&&展开的命名空间域

当我们在其中一个层次中找到了我们需要的变量/函数定义,就不再进入下一层次寻找了;当同一层次有多个定义,会报错

Ⅱ.::为域作用限定符,在命名空间的访问过程中常使用。

二、C++中的cin和cout

2.1关于iostream

是C++新增的一套新的输入/输出流,它里面有包含cout和cin的命名空间std,在VS编译器下还包含有<stdio.h>

2.2cout的使用方式

2.3.1 简介cout

c指的是console(控制台),out指的是输出,顾名思义:输出到控制台,cin也是同理。

2.3.2<<运算符的新含义

在C语言中,<<运算符只有一个含义:位的左移

而在C++中,为其新增了一个新的含义:流插入

2.3.3使用举例

int i=0;
double j=1.12;
cout<<i<<" "<<j<<endl;

这一代码可以在控制台上输出

0 1.12

证明了cout可以自动识别变量类型。

2.3.4使用前提

①指定访问std命名空间中的cout

std::cout<<//...

②展开整个域std

在整个主函数之前加

using namespace std;

③指定展开std域中的cout与endl

using std::cout;
using std::endl;
//也可以合并为(合并操作需要C++17标准以及更高)
//using std::cout,std::endl;

2.2-补充说明

cout输出方式在换行时有两种操作,其一是‘\n',其二是endl,他们的作用是等价的。

2.3cin的使用方式

2.3.1>>运算符的新定义

在C语言中,<<运算符只有一个含义:位的右移

而在C++中,为其新增了一个新的含义:流提取

2.3.2使用举例

int i=0;
double j=1.1;
cin>>i>>j;

这个代码可以实现i和j的输入;

2.3.3其余规则与cout相同

三、C++中的缺省参数(又名默认参数)

3.1缺省参数的使用举例

void F1(int a=0)
{
    cout<<a<<endl;
}
int main()
{
    F1(2);
    F1();
    return 0;
}

其中,参数a因为加了“=0”这一缺省值,就成为了缺省参数。

运行起来我们会发现打印了两行

2

0

因此,对于含有缺省参数的函数有两种可能

①传参,则接收传入参数的值

②不传参,用缺省值传入

3.3缺省参数的不同应用方式

3.3.1全缺省

缺省参数可以有多个,全缺省意味着所有参数都有一个缺省值

但是我们在使用的时候,例如

void F2(int a=10,int b=20,int c=30);
int main()
{
    F2(1,2,3);//传入参数位1,2,3
    F2(1,2);//传入参数为1,2,30
    F2(1);//传入参数为1,20,30
    F2();//传入参数为10,20,30
    return 0;
}

像注释中标注的这样,只能从左向右进行参数的传递

3.3.2部分缺省

缺省参数可以有多个,部分缺省意味着只有部分参数有缺省值

在C++中,我们规定部分缺省的参数列表的缺省值只能从右向左写,以避免出现不知道传给谁的情况。

3.3-补充说明

缺省参数中缺省值的添加要在函数声明中进行,而不是在函数定义中。

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值