C++对C函数参数的扩展

//C++对C函数的扩展:
//1.inline内联函数:---记住结论就行
/*
C++中的const常量可以替代宏常数定义,如:
const int A = 3;  #define A 3
C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!)将一块代码进行宏替换

C++中推荐使用内联函数替代宏代码片段
C++中使用inline关键字声明内联函数
 

inline void printA() {
	int a = 10;
	cout << "a:" << a << endl;
}
int main()
{
	printA();
	return 0;
}

//说明1:必须:inline int (int a,int b)和函数体实现的地方,写在一块;---不能在之前单独声明;
/*
说明2:    C++编译器可以将一个函数进行内联编译
        被C++编译器内联编译的函数叫做内联函数
        内联函数在最终生成的代码中是没有定义的
        C++编译器直接将函数体插入在函数调用的地方 
        内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)

        //没有压栈出栈,加快速度,定义成内联函数;---短小精悍的
*/
/*
说明3:    C++编译器不一定准许函数的内联请求!
说明4:
        内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)*
        如:g++中的__attribute__((always_inline))属性
*/
/*
说明6:
        C++中内联编译的限制:
        不能存在任何形式的循环语句
        不能存在过多的条件判断语句
        函数体不能过于庞大
        不能对函数进行取址操作
        函数内联声明必须在调用语句之前
*/
/*
编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销。
因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义
*/
/*
结论:
    1)内联函数在编译时直接将函数体插入函数调用的地方
    2)inline只是一种请求,编译器不一定允许这种请求
    3)内联函数省去了普通函数调用时压栈,跳转和返回的开销
*/

#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))  

inline int myfunc(int a, int b)
{
	return a < b ? a : b;
}

int main()
{
	int a = 1;
	int b = 3;
	//int c = myfunc(++a, b);  //头疼系统
	int c = MYFUNC(++a, b);//分别看这两个操作结果的区别;
	//被C++编译器进行机械的宏替换:(++a) < (b) ? (++a) : (b)

	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);

	system("pause");
	return 0;
}

//***********************************************************************************************
//函数参数相关的扩展:

void myPrint(int x = 3) {
	cout << "x" << x << endl;
}

//void myprintA(int x = 3, int y = 4,int m) {//报错
//若存在默认参数,则默认参数必须在参数列表的最后;
//void myprintA(int m,int x = 3, int y = 4)//这是对的
	//cout << "x" << x << endl;
//}

int main()
{
	//若你填写参数,就使用填写的参数,不写就默认;
	myPrint(4);
	myPrint();

	return 0;
}

//***********************************************************************************************
//函数占位参数:
//在参数自定义列表中定义一个参数
//即使是占位参数, 在函数调用时也要写够参数;

void func1(int a, int b, int) {
	cout << "a" << a << "b" << b << endl;
}
int main()
{
	//func1(1, 2);//报错
	func1(1, 2, 3);
	return 0;
}

//*******************************************************************************************
//默认参数和占位参数在一起:

int func2(int a, int b, int = 0)
{
	return a + b;
}
int main()
{
	//如果默认参数和占位参数在一起,都能调用起来
	func2(1, 2);
	func2(1, 2, 3);
	return 0;
}
//没什么用其实。。。。

猜你喜欢

转载自blog.csdn.net/xuchen1230/article/details/81224820
今日推荐