做微信营销网站建设,seo顾问公司,宁波网站建设设计制作公司,做翻译赚钱的网站概述 默认参数是C中新增的特性。在C中#xff0c;可以为函数的参数指定默认值。调用函数时#xff0c;如果没有指定实参#xff0c;则自动使用默认参数。默认参数的基本语法这里就不作介绍了#xff0c;下面重点介绍使用默认参数的一些知识要点。 基本规则 1、当函数中某个…概述 默认参数是C中新增的特性。在C中可以为函数的参数指定默认值。调用函数时如果没有指定实参则自动使用默认参数。默认参数的基本语法这里就不作介绍了下面重点介绍使用默认参数的一些知识要点。 基本规则 1、当函数中某个形参有默认值时该形参右边的所有形参都必须有默认值。在下面的示例代码中形参a有默认值但右边的形参b没有默认值这是不合法的会报编译错误。
int Add(int a 5, int b, int c 6); 2、只能在函数声明和函数定义其中一处给形参指定默认值不能在两处同时指定通常在函数声明时指定。比如下面的示例代码就是不正确的。
// 函数定义和声明时不同同时指定默认参数值否则编译出错
int Add(int a 5, int b 6);int Add(int a 5, int b 6)
{return a b;
} 修改后的代码如下
int Add(int a 5, int b 6);int Add(int a /* 5 */, int b /* 6 */)
{return a b;
} 3、形参的默认值可以是常量、常量表达式、全局变量和函数指针但不能是局部变量。因为默认值一般在编译期就会确定下来而局部变量需要到运行时才能确定其值。
typedef int (*CALLBACK_TEST)(const char *pszText);static int s_nData 1;int Test(const char *pszText);int Add(int a 66, int b 88 99, int c s_nData, CALLBACK_TEST d Test); 默认参数与占位参数 占位参数是指参数只声明了类型没有声明名称。由于没有指定参数名在函数内部无法使用占位参数但调用函数时却必须给占位参数指定实参。占位参数可以与默认参数结合起来使用此时可以不传实参主要用于程序扩展和对C代码的兼容。示例代码如下
int Test(int a, int 88)
{return a;
}Test(1);
Test(1, 2); 默认参数与函数重载 在重载的多个函数中如果有的函数指定了默认参数则很容易发生二义性的问题导致编译器无法确定到底使用哪个重载函数进而发生编译错误。可参看下面的示例代码。
class CBase
{
public:void Show(int a){printf(CBase Show: %d\n, a);}void Show(int a, int b 88){printf(CBase Show: %d, %d\n, a, b);}
};CBase base;
base.Show(66); // 产生二义性编译报错 可以看到调用base对象的函数Show(66)时编译器不知道该调用哪一个重载版本的函数因为两个版本都能匹配上故编译器会报错。解决该问题的最佳方案为尽量不要在函数重载时指定默认参数。 默认参数与虚函数 在有派生关系的类中如果基类和派生类的虚函数中都指定了默认参数且默认参数的值不一致则会出现一些不符合用户预期的结果。具体可参看下面的示例代码。
class CBase
{
public:virtual void Show(int a 66){printf(CBase Show: %d\n, a);}
};class CDerived : public CBase
{
public:virtual void Show(int a 88){printf(CDerived Show: %d\n, a);}
};CDerived *pDerived new CDerived();
pDerived-Show(); // 输出为CDerived Show: 88
CBase *pBase pDerived;
pBase-Show(); // 输出为CDerived Show: 66 可以看到调用函数时发生了多态行为均调用了派生类的Show函数但输出值不一样为什么会这样呢我们知道虚函数具有多态行为是动态绑定的但函数的默认参数却是在编译时就静态绑定的。使用派生类的指针调用函数时绑定的是派生类中声明的函数的默认参数。使用基类的指针调用函数时绑定的是基类中声明的函数的默认参数。