c++学习笔记(3.函数的升级)(二)

2014-11-24 02:32:53 · 作者: · 浏览: 7
}
int fun(int a,int b = 0)
{
printf("ab %d \n",a*b);
}
int main()
{
fun(10); //此时程序会报错 因为编译器出现二义性 不知道哪个才是fun(10)应该调用的函数
return 0;
}
d.编译器调用重载函数的准则(就是这么多同名函数到底调用哪个):
第一:先将所有的同名函数作为侯选者
第二:尝试寻找可行的候选者(下面的三个条件,有顺序先后,第一种和第二种会产生二义性(属于同级),但是他们和第三种是有顺序先后的)
首先,精确匹配实参
其次,通过默认参数能够匹配实参
最后,通过默认类型转换匹配实参
举个例子:对于fun(1,2)函数,它首先会去匹配Type fun(int a, int b)这类的函数,如果没有精确匹配实参;它会去匹配Type fun(int a, int b, int c = 0)或者Type fun(int a, int b, double c = 0)这类通过默认参数可以匹配的函数;如果都没有,最后可以去匹配Type fun(int a, char b)或者Type fun(double a, char b)通过默认类型转换匹配的函数。
第三:匹配失败,有两个原因,一个是最终寻找的可行候选者函数不唯一,则出现了二义性,编译失败。另一个是无法匹配所有候选者,没有找到合适的候选者,函数未定义,编译失败。
例子代码如下:
[cpp
#include
int fun(int a,char b) //通过默认类型转换匹配实参
{
printf("aaa %d \n",a);
}
int fun(int a,int b) //精确匹配实参
{
printf("hello\n");
}
int fun(int a, int b, double c = 0) //过默认参数能够匹配实参
{
printf("1234567\n");
}
int main()
{
fun(1,2);//Type fun(int a, int b) Type fun(int a, int b, int c = 0) Type fun(int a, double b)
return 0;
}
e.函数重载与函数指针:当使用重载函数名对函数指针进行赋值的时候,重载函数候选者的函数类型一定要与函数指针的函数类型完全相同,包括函数参数列表和函数返回值类型(因为函数类型是由这两个因素决定的),不然编译器会报错。代码如下:
[cpp]
#include //这个程序中三个函数就没有顺序先后了 因为要函数类型完全匹配
typedef int (*funp)(int a);
int fun(double b)
{
printf("hello double\n");
}
int fun(int b, int c = 0)
{
printf("hello bc\n");
}
int fun(int b) //此处就跟函数的返回值类型有关系了~~~~
{
printf("hello int\n");
}
int main()
{
funp p = fun;
p(1);
return 0;
}
f.函数重载的注意事项
第一:重载函数在本质上是相互独立的不同函数
第二:重载函数的函数类型是不同的
第三:函数返回值不能作为函数重载的依据
第四:函数重载是由函数名和参数列表决定的
5.c++和c的相互调用:
a. 在项目中融合c++和c代码是实际工程中不可避免的,虽然c++编译器能够兼容c语言的编译方式,但c++编译器会优先使用c++的编译方式进行编译。所有我们可以利用extern关键字强制c++编译器对代码进行c方式编译。
b.c++编译的文件(main.cpp)调用c编译的文件(add.c)中的函数:
main.cpp代码如下:
[cpp]
extern "C"
{
#include "add.h"
void add(int a,int b); //在c++文件中要使用extern关键字 把所有c文件中的函数声明 都利用c编译方式进行编译 就可以了
}
命令:gcc add.c -o add.o 或者 gcc -c add.c 然后 g++ main.cpp add.o就可以了
c.c编译的文件(main.c)调用c++编译的文件(add.cpp)中的函数:
add.cpp代码如下:
[cpp]
extern "C" //把cpp文件中的全部信息 都用extern关键字 进行c编译方式进行编译
{
int add(int a, int b)
{
return a + b;
}
}
命令:g++ -c add.cpp 然后 gcc main.c -lstdc++ add.o 就可以了
注意:这里说几点关于gcc和g++的问题,首先gcc和g++都可以编译c和c++的代码。只是gcc会把.c文件利用c的编译方式进行编译,而把.cpp文件利用c++的编译方式进行编译。而g++则会把.c文件和.cpp文件都使用c++的编译方式进行编译。第二点,gcc只能自动的链接标准c库,不能自动和c++程序使用的库链接。而要与c++程序使用的库链接应该使用g++或者是gcc -lstdc++
详细的问题可以参考这篇帖子:gcc和g++的区别
d.切记:c++编译器不能以c的方式编译多个重载函数,会编译错误,代码如下:
[cpp]
extern "C" //这段代码是有问题的 是编译不过的
{
int fun(double b)
{
printf("hello double\n");
}
int fun(int b, int c = 0)
{
printf("hello bc\n");
}
int fun(int b)
{
printf("hello int\n");
}
}
但是这里面遗留了一个问题(我没有想明白):就是有好多c语言没有的特性,c++具备的,比如说引用,依然可以使用extern关键词进行c方式编译,不知道会编译成什么!!!所以我觉得最好在实际工程中,还是尽可能的用c++文件去调用c文件中的函数,别反过来。毕竟c++是c的超集,总用extern去强制编译c++的代码不一定会出现什么问题!!!
e.c++和c相互调用的统一解决方案:
__cplusplus是c++编译器内置的标准宏定义,