C++之命名空间,程序在翻译过程中的四个步骤,函数重载,缺省参数

今天,我们进入了C++的学习之旅。首先,我们来写一个简单的代码:
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
	cout<<"hello,C++"<<endl;
	system("pause");
	return 0;
}
下面我们展开来讲述一下上面每一步的含义:
如果我们不使用using namespace std;
std:标准库中所有得对象都在std中;
那么,我们就要在输出的时候这样输出:std::cout<<"hello,C++"<<std::endl;

下面我们重点来讲述一下命名空间:namespace
我们知道,在一个函数中不可以同时使用名称相同的变量:因为名称如果相同,在使用时就不知道访问存储的是哪一块空间。
所以C++中引入了namespace用来避免由于名称相同而带来的麻烦:下面我们通过一个例子来看看:
namespace P  //定义自己的命名空间
{
	int beg = 20;
}
int main()
{
	int beg = 10;
	cout<<beg<<endl;
	cout<<P::beg<<endl;   //这样就可以有效的区分beg变量了。有一点点像C语言中的数据结构。
	system("pause");
	return 0;
}
不但如此,namespace还可以嵌套使用。例如:
using namespace std;
namespace P  //定义自己的命名空间
{
	int beg = 20;
	namespace Q
	{
		int beg = 30;
	}
}
int main()
{
	int beg = 10;
	cout<<beg<<endl;
	cout<<P::beg<<endl;
	cout<<P::Q::beg <<endl;
	system("pause");
	return 0;
}


运行结果为:
好,现在我们来复习一下程序在翻译过程中的四个步骤:
①预处理:作用是:1.头文件的展开2.去注释3.宏替换4.条件编译
②编译:作用:把C语言翻译为汇编语言
③汇编:作用:汇编语言并不能被计算机识别,所以汇编就是把汇编语言编程二进制语言
④链接:作用:当程序变大变多时,就会出现很多文件,但是在链接前那些文件并没有交汇,链接就是把所有文件聚集然后生成一个可执行文件。
以上就是一个程序跑起来的所有步骤。
下面我们来讲C++中的重载函数:重载函数:就是函数名称相同,但是函数的参数个数以及参数类型不同(函数返回值可相同也可不同)。
 
  
using namespace std; int Sub(int a,int b) { return a - b; } int Sub(int a,int b,int c) { return a - b - c; } float Sub(float a,float b) { return a - b; } int main() { int a = 3; int b = 5; int c = 1; float a1 = 3.5; float b1 = 2.1; cout<<Sub(a,b)<<endl; cout<<Sub(a,b,c)<<endl; cout<<Sub(a1,b1)<<endl; system("pause"); return 0; }
那么,为什么在C语言中却没有函数重载呢?而C++却可以。
首先我们要明白,程序在编译的过程中,当从C语言转变为汇编语言时,其实是由函数的名称去查找函数的地址,那么当函数名相同时,寻找地址时那不就无法找到那个正确的函数。但是在C++中函数名在汇编中保存的形式并不是函数名,而是添加了前缀和后缀的名称。下面我们就来见证一下这个奇迹的时刻:
在VS2010下我们可以这样查看:
先右击文件名,然后点开属性。。。。。。。最后打开Debug个终究可以看到后缀为.map的文件,打开就可以找到:如下图所示:
我们看到,在C++中函数名在汇编中并不是以名称存在,所以C++有重载函数,而C语言没有。
接下来我们来讲参数缺省:分为半缺省和全缺省(半缺省参数只传一部分,而全缺省所有的参数都不传)代码和讲解如下图所示:
以上都是在Vs2010的环境下编译的。



猜你喜欢

转载自blog.csdn.net/yinghuhu333333/article/details/79534210