C++缺省参数和命名空间

  今天再介绍一下C++的一些特点,今天要介绍的是C++的缺省参数和命名空间两个特点,

首先介绍一下什么是缺省(sheng)参数,

所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数,即:带缺省值的参数必须放在参数表的最后面。 缺省值必须是常量。显然,这限制了缺省参数的数据类型,例如动态数组和界面类型的缺省参数值只能是 nil;至于记录类型,则根本不能用作缺省参数。 缺省参数必须通过值参或常参传递。声明是带有缺省参数的函数,则缺省值只能写在声明当中。 

#include<iostream>

using namespace std;

class Data {

public:

Data(int year = 1996,int month=12,int day=6)

{

_year = year;

_month = month;

_day = day;

}

void Printf()

{

cout << _year<<endl;

cout << _month << endl;

cout << _day;

}

private:

int _year;

int _month;

int _day;

 

};

 

int main()

{

Data A;

Data B(1998,03,18);

A.Printf();

cout << endl;

B.Printf();

system("pause");

return 0;

}

通过这个程序可以很简单的就能看出来什么叫缺省,这里我们定义了Data的对象A,然后系统自动调用了构造参数,但是我们并没有在构造参数进行传参,而我们B在定义对象的时候进行了构造参数的传参。

 

我们没有进行传参的A对象,使用了构造参数的缺省数据。

  但是缺省函数也是有一定的规则的。调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数

Data(int year = 1996,int month,int day=6)也就是说这样的定义是不能通过编译的,当你从某个参数开始决定缺省的时候,后边的所有参数都要缺省。

Data(int year,int month=12,int day=6)这是正确的

  第二个介绍的是命名空间的概念,其实我认为命名空间是一个很抽象的概念,之前在学习C语言的时候是有全局变量和局部变量的概念,这里的命名空间和之前的是有十份相似的地方的,例如我们现在有两个类,一个类是学生类,一个类是教师类,在这两个类里边我们都可以存在姓名,都可以存在相同名字的变量性别,甚至可以有相同函数名相同变量的函数,因为他们两个是在不同的 命名空间里边的,他们的作用域也是不同的。

  大家都清楚当我们在写C++程序的时候我们经常会在头文件下边写上一句using namespace std;前边两个单词就不过多的介绍了,using namespace 使用命名空间,但是大家有没有了解过std,

C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择: [1] 

直接指定标识符

例如std::iostream而不是iostream。完整语句如下:

1

std::cout<<std::hex<<3.4<<std::endl;

使用using关键字

加入using std::cout; using std::endl; using std::cin; 则前面语句可以写成如下代码:

1

cout << hex << 3.4 << endl;

使用using namespace std

例如:

1

2

3

4

#include<iostream>

#include<sstream>

#include<string>

using namespace std;

这三种方法都可以使用std中的内容,我们常常为了方便选择了第三种,上来直接使用了你的内存空间std,在接下来的程序中,就可以直接使用cout,cin等等内容。

 本质上命名空间就可以理解成一个范围。

#include <iostream> using namespace std;

 // 第一个命名空间 namespace first_space

{ void func()

{ cout << "Inside first_space" << endl; } 

}

 // 第二个命名空间 namespace second_space

{ void func()

{ cout << "Inside second_space" << endl; }

 } 

int main ()

 { // 调用第一个命名空间中的函数 first_space::func();

// 调用第二个命名空间中的函数 second_space::func();

return 0; }

  这种情况下就很大程度的解决了命名冲突的问题,随着源代码规模的增大,产生名字冲突的可能性也会越来越高,如两家公司的类库中都有一个名为“Stack”的类,那么当你需要同时用到这两个公司的类库时,就会产生名字冲突,无法区分是哪一个Stack,因此,一般公司都会把自己的类,函数,变量等放在一个名字空间中,防止冲突。

  命名空间的概念是十分抽象的概念,并且当前我接触和应用的并不是很多。

 

 

 

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/80807026