IT评测·应用市场-qidao123.com
标题:
C++[函数]
[打印本页]
作者:
笑看天下无敌手
时间:
2025-1-13 12:27
标题:
C++[函数]
2023-3-5首次编辑
2024-3-7第一次修改(增加目录)
复制代码
Unit 3:函数
一.内联函数
#define _CRT_SECIRE_NO_WARNINGS
#include <iostream>
using namespace std;
//1.宏函数:
#define ADD(x,y) x+y
//2.内联函数:
//普通函数前加上inline,向编译器申请成为内联函数
//加上inline可能成为内联函数,可能不成为内联函数
inline int Add(int x, int y)
{
return x + y;
}
void test1()
{
int ref1 = ADD(10, 20) * 2; //err:宏函数编译为:10+20*2
cout << "ref1=" << ref1 << endl;
int ref2 = Add(10, 20) * 2;//内联函数编译为(10+20)*2
cout << "ref2=" << ref2 << endl;
}
//1.宏函数结合三目运算符与自增运算符
#define COMAPD(x,y)((x)<(y)?(x):(y))
//2.内联函数结合三目运算符与自增运算符
inline int func(int x, int y)
{
return x < y ? x : y;
}
void test2()
{
int a = 1;
int b = 3;
//((++a)<(b)?(++a):(b))
//cout << "宏函数计算结果:" << COMAPD(++a, b) << endl;//err:优化掉了一次++a
cout << "内联函数计算结果:" << func(++a, b) << endl;
}
int main()
{
test1();
test2();
system("pause");
return 0;
}
复制代码
内联函数申请失败:
存在过多的条件判定语句
存在任何形式的循环语句
函数体过大
对函数进行取值操作
内联函数优点:
有宏函数的效率,没有宏函数的缺点
留意:
类的成员函数默认加上inline
在普通函数前面加上inline是
申请成为内联函数
二.函数的默认参数
函数的默认参数就是给函数的形参赋值
#define _CRT_SECIRE_NO_WARNINGS
#include <iostream>
using namespace std;
//此处int b = 0;就是函数的默认参数(不一定是0)
int myFunc1(int a, int b = 0)
{
return a + b;
}
void test1()
{
//函数的默认参数的作用:
//当函数内经常要用到形参的某个值,但偶尔要使用其他值
//增加函数的灵活性
cout << myFunc1(10, 20) << endl;
cout << myFunc1(10) << endl;
}
//注意1:函数的默认参数后面的参数必须都是默认参数
int myFunc2(int a, int b = 0, int c = 2, int d = 3)
{
return a + b + c + d;
}
//注意2:函数声明和实现不能同时有函数默认参数
void myFunc3(int a, int b);
void myFunc3(int a, int b = 0)
{
}
int main()
{
test1();
system("pause");
return 0;
}
复制代码
三.函数的占位参数
#define _CRT_SECIRE_NO_WARNINGS
#include <iostream>
using namespace std;
//函数的占位参数在运算符重载时区分前++和后++
//占位参数也有默认值
void func1(int a, int = 10)
{
}
void test1()
{
func1(10);
}
//占位参数和默认参数混搭
void func2(int = 10, int a = 20)
{
}
void test2()
{
func2();
func2(30);
func2(30, 40);
}
int main()
{
system("pause");
return 0;
}
复制代码
四.函数重载
答应函数名类似
作用:
为了方便使用函数名
条件:
同一个作用域
参数的个数不同
参数的顺序不同
参数的范例不同
留意1:
调用重载函数时,有着严格的范例匹配
如果范例不匹配,那么尝试转换
转换乐成就调用,失败就报错
留意2:
函数重载和函数的默认参数一起使用时
需要留意二义性问题
留意3:
函数的返回值不作为函数重载的条件
编译器是通过调用函数时
传入的参数来判定调用重载的哪个函数
我们调用函数时不需要写返回值
所以返回值不能成为函数重载的条件
#define _CRT_SECIRE_NO_WARNINGS
#include <iostream>
using namespace std;
void func()
{
cout << "func()" << endl;
}
//参数的个数不同
void func(int a)
{
cout << "func(int a)" << endl;
}
//参数的类型不同
void func(char c)
{
cout << "func(char c)" << endl;
}
//参数的顺序不同
void func(int a, double b)
{
cout << "func(int a, double b)" << endl;
}
void func(double b, int a)
{
cout << "func(double b, int a)" << endl;
}
void test1()
{
int a = 10;
double b = 3.14;
char c = 'c';
func();
//func(b);
//err:double转换不了int或char
func(c);
//char转换int成功,调用int参数的函数
func(a, b);
func(b, a);
}
//函数重载和函数的默认参数一起使用
void myfunc(int a, int b = 10)
{
cout << "myfunc(int a, int b = 10)" << endl;
}
void myfunc(int a)
{
cout << "myfunc(int a)" << endl;
}
void test2()
{
//myfunc(10); //err:二义性问题(不知调用哪个函数)
}
int main()
{
test1();
test2();
system("pause");
return 0;
}
复制代码
五.函数重载的原理
函数重载的原理:
在汇编时
给各个函数取别名
C语言不能重载的愿意时没有取别名
汇编文件天生:
gcc -S test.c -o test.s
g++ -S test.cpp -o test.s
检察文件内容:
type 文件名
六.C++调用C语言的函数
C++的函数在汇编时,会给函数取别名
C语言的不会
如果C++来调用C语言的函数
C++会去找取了别名的函数
但是C语言没有取别名
此时就会报错
1.test.h
//这是告诉C++编译器,找下面的函数时,要以C语言的方式去寻找
#ifdef __cplusplus
extern "C"
{
#endif
void func(); //C语言的函数声明
}
复制代码
2.test.c
#define _CRT_SECIRE_NO_WARNINGS
#include <stdio.h>
void func()
{
printf("C语言\n");
}
复制代码
3.main.cpp
#define _CRT_SECIRE_NO_WARNINGS
#include <iostream>
using namespace std;
#include"test.h"
int main()
{
func();//调用.c中的函数
system("pause");
return 0;
}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4