本次课算是c++的第一节正式课,老师讲了一条小技巧或是一个基本原则吧
----------------------------------c++每增加一个语法大多是对c语言不足之处的一个补充
1.命名空间
为什么要有命名空间
主要是为了防止命名冲突,可能自己刚学习编程感触不大,但以后难免会遇到一个大的工程,当你的命名与别人冲突了怎么办,这里就需要命名空间
命名空间怎么解决命名冲突
顾名思义就是在一处空间里命名,我在自己的空间里定义需要的变量,函数,类,结构体,,,,这样就避免了冲突
怎么定义
namespace xxc //(xxc)自己起的名字
{
int rand;
int Add(int a,int b);
namespace Xxc //命名空间的嵌套定义
typedef struct Stack
{
int* a;
int top;
int capacity;
}ST;
//......
}
这样,一个自己的命名空间就定义好了
当然还可以在多个源文件和头文件中定义同一个命名空间,只需包含同样的头文件最后的命名空间会合并成一个,但需注意:不能重复定义,虽然在不同的位置,但是同一个空间。
怎么使用
1.全展开
初学c++经常遇到以下代码
#include<iostream>
using namespace std;
这就是命名空间的第一种使用方法,相当于你的定义都是全局的定义
优点:方便。
缺点:和没用命名空间差不多
2.指定访问
cout<<xxc::rand<<endl;
优点:不会命名冲突
缺点:麻烦
3.半展开
using xxc::Add;
缺省参数
什么是缺省参数
void testFun1(int a = 0,int b = 0,int c = 0) //全缺省
{
}
void testFun2(int ,int b = 0,int c = 0) //半缺省
{
}
void testFun3(int ,int b ,int c = 0) //半缺省
{
}
main()
{
testFun(); //可以传参,也可以不传
testfun(1); //可以传一个,0个,多个
testfun(1,2); //但必须从左到右依次传
testfun(1,2,3); //从右到左传编译器没法区分你要怎么赋值,赋第几个值
return 0;
}
没传参的就用了缺省值
函数重载
为什么要函数重载
eg:一个函数要完成交换,整形交换,长整型交换,浮点型交换,,,,,等交换。
C语言只能定义好几个交换
既然都是交换,我为什么不能函数名一样,参数和和返回值不同,
什么是函数重载
同一作用域中,函数名相同,形参(参数个数,类型,顺序)不同
int Add(int left, int right) {
return left + right;
}
double Add(double left, double right) {
return left + right;
}
long Add(long left, long right) {
return left + right;
}
int main()
{
Add(10, 20);
Add(10.0, 20.0);
Add(10L, 20L);
return 0;
}
错误示例
short Add(short left, short right) {
return left + right;
}
int Add(short left, short right) {
return left + right;
}
int main()
{
Add(3l,7l); //那么问题来了,到底调用那个函数呢??????
return 0;
}
不能参数相同返回值不同,这样编译器改调用那个函数,有歧义
c++为什么能支持函数重载
---------------------------------------------名字修饰
wendows下的名字修饰规则
程序->预处理(头文件展开,宏替换,条件编译)->编译(只要有函数定义,就可以通过)
->汇编(因为名字修饰使重载的函数名不同,函数地址不同,编译器链接的时候就可以区别出来)->链接(生成可执行文件)、