Thinking in C++ -- 函数的缺省参数

缺省参数是在 C++函数 声明时就给其参数赋值。


C++支持函数的重载,在同一个类中,具有相同名字的函数可以通过定义不同的参数列表来实现多态。


为了简化编程时的工作,函数的缺省参数也是在这个背景下产生的。它最大好处就是为编程时提供简化。


一个简单的例子

#include <iostream>

using namespace std;

sample.h
class Sample
{
public:
Sample();
Sample(int a=1, float b = 2, char c = 'O');

void print();
void print(int a=4, float b = 5, char c = 'P');
private:
int   m_nA;
float m_nB;
char  m_nC;
};

sample.cpp
#include "comm.h"


Sample::Sample()
{
    cout << "Sample()" << endl;
};


Sample::Sample(int a, float b, char c)
{
m_nA = a;
m_nB = b;
m_nC = c;
    cout << "Sample(a,b,c)" << "a= " << m_nA << " b= " << m_nB << " c= " << m_nC<< endl;
};


void Sample::print()
{
    cout << "print()" << "a= " << m_nA << " b= " << m_nB << " c= " << m_nC<< endl;
}


void Sample::print(int a, float b, char c)
{
    cout << "print(a,b,c)" << "a= " << m_nA << " b= " << m_nB << " c= " << m_nC<< endl;
}

main.cpp
#include "comm.h"


int main()
{
Sample s(1);


s.print(4);


    return 0;
}


在这个小例子中类Sample的构造函数和print函数都使用了缺省参数。

使用缺省参数的规则:

1)  只有在参数列表后部的参数才可以使用缺省参数。也就是说在缺省参数后面不能再有非缺省参数。


2)  一旦我们开始使用缺省参数,那么这个参数后面的所有参数都必须是缺省的


3)   使用缺省参数不能引起二义性。

以程序来解释一下: 类Sample 的一个构造函数定义了三个缺省参数,如果在main函数中,我们定义一个Sample的实例  "Sample s;"
这时系统是无法分清我要使用 Sample(); 还是 Sample(int a=1, float b = 2, char c = 'O'); 来构造Sample 的对象。

sample.h
#include <iostream>

using namespace std;

class Sample
{
public:
Sample();
Sample(int a=1, float b = 2, char c = 'O');


void print();
void print(int a=4, float b = 5, char c = 'P');
private:
int   m_nA;
float m_nB;
char  m_nC;
};


sample.cpp
#include "comm.h"


Sample::Sample()
{
    cout << "Sample()" << endl;
};


Sample::Sample(int a, float b, char c)
{
m_nA = a;
m_nB = b;
m_nC = c;
    cout << "Sample(a,b,c)" << "a= " << m_nA << " b= " << m_nB << " c= " << m_nC<< endl;
};

void Sample::print()
{
    cout << "print()" << "a= " << m_nA << " b= " << m_nB << " c= " << m_nC<< endl;
}


void Sample::print(int a, float b, char c)
{
    cout << "print(a,b,c)" << "a= " << m_nA << " b= " << m_nB << " c= " << m_nC<< endl;
}



main.cpp
#include "comm.h"


int main()
{
Sample s;   <---- 这时程序已经无法分清使用的是无参数的构造函数还是,有缺省参数的构造函数

s.print(4);

        return 0;
}


使用缺省参数的技巧:



有时人们为了阅读方便在函数定义处放上一些缺省的注释值


void fn(int x /* =0*/ ) { //...



缺省参数可以让声明的参数没有标识符,这看上去很有趣。我们可以这样声明:


void f(int X, int = 0, float =1.1);


在C++中,在函数定义时,我们并不一定需要标识符,像: void f(int X, int,float f) {/*...*/} 也是合法的,


但在函数体中,x和f可以被引用,但中间的这个参数值则不行,因为它没有名字。这种调用还必须用一个占位符 (place holder), 有f( 1 ) 或 f( 1 , 2 , 3.0 )。这种语法允许我们把一个参数当作占位符而不去用它。


目的:  消除变量未使用的告警,及修改方便
在于我们以后可以修改函数定义而不需要修改所有的函数调用。当然,用一个有名字的参数也能达到同样的目的,但如果我们定义的这个参数在函数体内没有使用,
多数编译器会给出一条警告信息,并认为我们犯了一个逻辑错误。用这种没有名字的参数就可以防止这种警告产生。


更重要的是,如果我们开始用了一个函数参数,而后来发现不需要用它,我们可以高效地将它去掉而不会产生警告错误,而且不需要改动那些调用该函数以前版本的程序代码。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值