函数和类的默认参数的位置

普通函数

默认参数指的是形参的默认值。默认参数是在函数声明中提供

  • 在函数声明与函数定义这两个地方,默认参数只能出现一次。
  • 当既有声明又有定义时,如果函数定义是出现在函数调用点的后面,则定义中不允许默认参数。
  • 当既有声明又有定义时,如果函数定义是出现在函数调用点的前面,则可以在定义中使用默认参数。
  • 如果函数只有定义,没有函数声明时,则默认参数可以出现在函数定义中。
对于上述规则,我们可以总结出: 在实际编程中,我们都是把函数定义放在单独的.cpp文件中,所以在实际的情况下, 函数的默认参数一定是放在头文件的函数声明中的

对于带参数列表的函数,必须从右向左添加默认值。也就是说,如果某个参数有默认值,那么它右边的所有参数都要提供默认值,而不能跳过某个参数。

int show(int i, int j = 5, int k = 10);		//OK
int show(int i, int j = 5, int k);			//Error
int show(int i = 3, int j = 5, int k = 10);	//OK

注意,默认参数不是重载,所以上面的这几个声明在同一个作用域中只能出现一个。

再强调一下,在实际编程中,只有函数声明(也叫函数原型)可以指定默认值,函数定义与没有默认参数时完全相同。


类的成员函数的默认形参

类的成员函数的默认形参必须在类定义中声明。也就是说,必须写在类的头文件中。

//testClass.h
#ifndef TEST_CLASS_HEAD_FILE
#define TEST_CLASS_HEAD_FILE
class testBB{
public:
	void show(int i = 10, double j = 8.0);
};

#endif // TEST_CLASS_HEAD_FILE


类的成员变量的默认参数

  • 对于类的非静态成员变量

1. 非const变量:在C++11以前,默认参数是是放在构造函数初始化列表或者构造函数里面。在C++11中,类的非静态成员变量可以在类的头文件中赋值初始化了。

2. const成员变量:在C++11以前,cosnt成员变量只能放在构造函数初始化列表中进行初始化。在C++11中,也可以在类的头文件中进行初始化了。

  • 对于类的静态非const成员变量

只能在类的实现文件.cpp中进行初始化设置默认参数。

#ifndef TEST_CLASS_HEAD_FILE
#define TEST_CLASS_HEAD_FILE
class testBB{
public:
	void show(int i = 10, double j = 8.0);
	static int iNum;
};

#endif // TEST_CLASS_HEAD_FILE

对于类头文件中的静态非const成员变量iNum,如果不进行初始化,会得到下面这个错误:

undefined reference to `testBB::iNum'

而如果在.h头文件中进行初始化,会得到下面这个错误:

error: ISO C++ forbids in-class initialization of non-const static member 'testBB::iNum'

正确的做法是:在实现文件中对静态非const成员变量iNum进行初始化时,要使用下面这样的形式,不要加static

static int testBB::iNum = 10000;//error: 'static' may not be used when defining (as opposed to declaring) a static data member [-fpermissive]|
int testBB::iNum = 10000; //OK

  • 对于类头文件中的静态const成员变量

最好是按照上面讲的const成员变量的赋值方法,即在构造函数的初始化列表中进行赋值。当然,你也可以在头文件中对静态const成员变量进行赋值。


结论

总结上面三小节的全部内容,有如下结论:

1.对于所有函数,包括普通函数和类函数,默认参数都要写在函数声明中,函数定义中禁止写默认参数。

2.对于类的所有const成员变量而言,初始化要写在构造函数初始化列表中。

3.对于类的所有非const 静态成员变量而言,初始化要写在.cpp类的实现文件中,在实现文件中不要加static。

4.对于类的所有非const普通成员变量而言,初始化既可以写在构造函数初始化列表中,也可以写在构造函数的函数体中。

上面这四条是推荐的做法。其他的属于个性化的做法。比如,把const static成员变量的默认值写在类头文件中,也可以。





  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值