#include <iostream>
using namespace std;
//宏定义是由预处理器处理
//斜杠的作用是换行,连接下段代码
#define MAX(a, b) \
(a) > (b) ? (a) : (b)
//inline为内联函数关键字,内联函数由编译器处理,当函数为内联函数时,编译器会把主代码中内联函数名直接替换为内联函数的代码,这样运行起来会减少内存开销
inline int printAB(int a, int b)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
//函数有默认形参时,调用此函数时,可以不传递值进来,当传递值进来,默认值就会被替换
int func1(int a = 666)
{
cout << "a=" << a << endl;
return 0;
}
//函数有多个参数且包含默认形参时,默认形参一定要定义在最右边,不然报错,可以定义多个默认参数,但一定要从右向左连续
int get_volume(int width, int height, int len = 100)
{
int volume = len * width * height;
cout << "volume=" << volume << endl;
return 0;
}
//函数的形参有占位参数(本质是c++设计时为了可拓展性发明的,但其实是c++典型的一个坑,发展成熟后发现确实没有什么作用),但在主函数中调用时,需要用值去填补占位参数的空间,尽管这个值根本用不到
int func2(int a, int)
{
return 0;
}
//函数的重载:函数名相同,参数列表不同(参数个数不同,参数类型不同,参数顺序不同),但只有返回值不同,其他都相同时,并不能构成重载,会报错误
//当使用函数重载时,尽量不要写函数默认形式参数,为了避免歧义,出现函数调用冲突
//函数重载的调用是由规则的,当可以完全匹配的时候匹配完全匹配的,如果不可以完全匹配,先进行隐式转换,进行匹配,如果还是匹配不成功,则会报错
//函数重载的原理是c++根据符合条件的重载函数,对函数进行重新命名,这样就不会发生歧义了
int func3(int a, int b)
{
return 0;
}
int func3(int a, char b)
{
return 0;
}
/*
float func3(int a, int b)
{
return 0;
}
int func3(int a, int b, int c = 100)
{
return 0;
}
*/
//函数重载与函数指针是完全不冲突,不歧义的,不论用下面3种方法中的哪一种,它们都是包含两个形参函数的指针,而不是包含三个形参函数的指针
int func4(int a, int b)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
int func4(int a,int b,int c)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
return 0;
}
//1.定义函数类型
typedef int (MY_FUNC)(int, int);
//2.定义函数指针类型
typedef int (* MY_FUNC_P)(int, int);
//3.直接定义成函数指针类型
int (* p3)(int, int);
int main()
{
int a = 10;
int b = 20;
for (int i = 0; i < 10; i++)
{
a++;
b++;
printAB(a, b);
/*
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
*/
}
func1();
int len = 10;
int width = 20;
int height = 30;
get_volume(len, width);
func2(a, 10);
//函数类型指针
MY_FUNC *p1 = NULL;
p1 = func4;//直接赋值函数名字,不需要加括号,即为指针p指向了函数func4
p1(111, 222);
MY_FUNC_P p2 = NULL;
p2 = func4;//p1与p2类型其实是完全相同的,都为函数指针
p2(222, 333);
p3 = func4;
p3(333, 444);
return 0;
}
using namespace std;
//宏定义是由预处理器处理
//斜杠的作用是换行,连接下段代码
#define MAX(a, b) \
(a) > (b) ? (a) : (b)
//inline为内联函数关键字,内联函数由编译器处理,当函数为内联函数时,编译器会把主代码中内联函数名直接替换为内联函数的代码,这样运行起来会减少内存开销
inline int printAB(int a, int b)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
//函数有默认形参时,调用此函数时,可以不传递值进来,当传递值进来,默认值就会被替换
int func1(int a = 666)
{
cout << "a=" << a << endl;
return 0;
}
//函数有多个参数且包含默认形参时,默认形参一定要定义在最右边,不然报错,可以定义多个默认参数,但一定要从右向左连续
int get_volume(int width, int height, int len = 100)
{
int volume = len * width * height;
cout << "volume=" << volume << endl;
return 0;
}
//函数的形参有占位参数(本质是c++设计时为了可拓展性发明的,但其实是c++典型的一个坑,发展成熟后发现确实没有什么作用),但在主函数中调用时,需要用值去填补占位参数的空间,尽管这个值根本用不到
int func2(int a, int)
{
return 0;
}
//函数的重载:函数名相同,参数列表不同(参数个数不同,参数类型不同,参数顺序不同),但只有返回值不同,其他都相同时,并不能构成重载,会报错误
//当使用函数重载时,尽量不要写函数默认形式参数,为了避免歧义,出现函数调用冲突
//函数重载的调用是由规则的,当可以完全匹配的时候匹配完全匹配的,如果不可以完全匹配,先进行隐式转换,进行匹配,如果还是匹配不成功,则会报错
//函数重载的原理是c++根据符合条件的重载函数,对函数进行重新命名,这样就不会发生歧义了
int func3(int a, int b)
{
return 0;
}
int func3(int a, char b)
{
return 0;
}
/*
float func3(int a, int b)
{
return 0;
}
int func3(int a, int b, int c = 100)
{
return 0;
}
*/
//函数重载与函数指针是完全不冲突,不歧义的,不论用下面3种方法中的哪一种,它们都是包含两个形参函数的指针,而不是包含三个形参函数的指针
int func4(int a, int b)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
int func4(int a,int b,int c)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
return 0;
}
//1.定义函数类型
typedef int (MY_FUNC)(int, int);
//2.定义函数指针类型
typedef int (* MY_FUNC_P)(int, int);
//3.直接定义成函数指针类型
int (* p3)(int, int);
int main()
{
int a = 10;
int b = 20;
for (int i = 0; i < 10; i++)
{
a++;
b++;
printAB(a, b);
/*
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
*/
}
func1();
int len = 10;
int width = 20;
int height = 30;
get_volume(len, width);
func2(a, 10);
//函数类型指针
MY_FUNC *p1 = NULL;
p1 = func4;//直接赋值函数名字,不需要加括号,即为指针p指向了函数func4
p1(111, 222);
MY_FUNC_P p2 = NULL;
p2 = func4;//p1与p2类型其实是完全相同的,都为函数指针
p2(222, 333);
p3 = func4;
p3(333, 444);
return 0;
}