今天再介绍一下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,因此,一般公司都会把自己的类,函数,变量等放在一个名字空间中,防止冲突。
命名空间的概念是十分抽象的概念,并且当前我接触和应用的并不是很多。