更多知识点请点链接:C++知识点目录索引
1.什么是C++?
- C++延续了C语言的语法使用,在其基础上又增加了自己的特性
- 对于C++而言,可以进行过程化的设计,也可以根据抽象数据类型的特点,将其认为是某一对象,基于这种对象进行程序设计
2. C++与C语言的差异
- 数据类型:从基本数据类型来看,C++增加了逻辑型bool;从自定义类型来看,C++增加了类
- 关键字:C语言的关键字只有32个,C++在此基础上将关键字增加到98个关键字
- 命名冲突:C语言不支持全局命名冲突的情况(即重命名);C++存在名字空间域,解决了命名冲突的问题
3. C++中的命名空间
- 以关键字namespace开始,其后接命名空间的名字
- 命名空间相当于作用域,空间里的成员,外部访问时必须指定成员名字存在的作用域中(即命名空间)
- ::是作用域解析符,某成员名字属于哪个作用域;下面的例子中 s1::a;表示a在s1的作用域里
例:
namespace s1
{
int a = 10;
}
namespace s2
{
int a = 20;
}
int main()
{
cout << s1::a << endl;
cout << s2::a << endl;
system("pause");
return 0;
}
4.缺省参数
- 理解:缺省参数指可给函数参数赋值,留做备用,当调用函数时,没有传参时即可使用设置的参数缺省值
规则:设置缺省值的参数只能是最后的几个参数。也就是说某一个参数一旦设置了缺省值,其后而的参数也必须设置缺省值。
例:
int Add1(int x, int y, int z)//没有缺省值
{
return x + y + z;
}
int Add2(int x, int y, int z = 3)//半缺省
{
return x + y + z;
}
int Add3(int x = 1, int y = 2, int z = 3)//全缺省
{
return x + y + z;
}
int Add4(int x, int y = 2, int z)//错误
{
return x + y + z;
}
int main()
{
cout << Add1(3,6,9) << endl;
cout << Add2(6,7) << endl;
cout << Add3() << endl;
system("pause");
return 0;
}
5.函数重载
5.1 什么是函数重载
在同一作用域内,一组函数的函数名相同,参数列表不同(个数不同/类型不同),返回值可同可不同
例如:
void Func1(int a);
void Func1(int a,double c);
int Func1(double c,int a);
这几个函数即为函数重载;和返回值无关,函数名相同,对应参数不同,参数个数也不相同
5.2 为什么需要函数重载
根据函数重载的定义可从函数重载的几个特点来分析:
- 函数名相同:在C语言的语法中,同一作用域中不允许函数名重复,那么在实现一个功能时就需要定义多个函数,例如:1+2,1+2+3,1.0+2.0+3.0+4.0,虽然这些加法只是个数不同,类型不同,但在调用函数就不能使用同一函数名,因此为了减少工作量,引入函数重载可解决这一问题
参数不同:上面的例子只是参数列表(类型,个数)不同,故相同功能的函数只需要设计不同的参数即可
几个例子
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
int Add(int x, int y, double z)
{
return x + y + z;
}
int main()
{
cout << Add(1, 2) << endl;
cout << Add(3.0, 4.0) << endl;
cout << Add(1, 2,3.0) << endl;
system("pause");
return 0;
}
结果:
分析:
上述例子中存在函数重载,几个Add函数实现相同的功能,不会发生命名重复等诸多情况,都能得到相应的结果
5.3 C++支持重载的原因
在说明这个问题之前,我们在linux下查看同一段代码分别用C语言编译和C++编译时的汇编代码
代码:
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int ret=Add(1,2);
printf("%d",ret);
return 0;
}
C语言:
C++:
分析:
- 从上图中可以看出,C++在调用函数时Add函数名已经改变<_Z3Addii>, 不仅仅是函数名,还有参数的类型,而C语言调用时Add函数名< Add >没有改变
- C语言中一个函数就是一个地址,即使参数不同,也是相同的地址,编译器不能识别,故而C语言中没有重载函数的概念
C++中一个函数名可有多个地址,当参数不同时,地址也不相同,编译器可根据不同的地址去调用对应的函数来完成函数的功能,因此C++中支持函数重载的概念
综上所述:C++能够支持重载是因为他有自己的函数名修饰规则,在编译时可以识别相同函数名,不同参数列表的函数