您的位置:首页 > 编程语言 > C语言/C++

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

2014-08-20 08:21 281 查看
缺省参数是在 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 )。这种语法允许我们把一个参数当作占位符而不去用它。

目的: 消除变量未使用的告警,及修改方便

在于我们以后可以修改函数定义而不需要修改所有的函数调用。当然,用一个有名字的参数也能达到同样的目的,但如果我们定义的这个参数在函数体内没有使用,

多数编译器会给出一条警告信息,并认为我们犯了一个逻辑错误。用这种没有名字的参数就可以防止这种警告产生。

更重要的是,如果我们开始用了一个函数参数,而后来发现不需要用它,我们可以高效地将它去掉而不会产生警告错误,而且不需要改动那些调用该函数以前版本的程序代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: