缺省参数是在 C++函数
声明时就给其参数赋值。
C++支持函数的重载,在同一个类中,具有相同名字的函数可以通过定义不同的参数列表来实现多态。
为了简化编程时的工作,函数的缺省参数也是在这个背景下产生的。它最大好处就是为编程时提供简化。
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函数都使用了缺省参数。
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 )。这种语法允许我们把一个参数当作占位符而不去用它。
目的: 消除变量未使用的告警,及修改方便
在于我们以后可以修改函数定义而不需要修改所有的函数调用。当然,用一个有名字的参数也能达到同样的目的,但如果我们定义的这个参数在函数体内没有使用,
多数编译器会给出一条警告信息,并认为我们犯了一个逻辑错误。用这种没有名字的参数就可以防止这种警告产生。
更重要的是,如果我们开始用了一个函数参数,而后来发现不需要用它,我们可以高效地将它去掉而不会产生警告错误,而且不需要改动那些调用该函数以前版本的程序代码。
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 )。这种语法允许我们把一个参数当作占位符而不去用它。
目的: 消除变量未使用的告警,及修改方便
在于我们以后可以修改函数定义而不需要修改所有的函数调用。当然,用一个有名字的参数也能达到同样的目的,但如果我们定义的这个参数在函数体内没有使用,
多数编译器会给出一条警告信息,并认为我们犯了一个逻辑错误。用这种没有名字的参数就可以防止这种警告产生。
更重要的是,如果我们开始用了一个函数参数,而后来发现不需要用它,我们可以高效地将它去掉而不会产生警告错误,而且不需要改动那些调用该函数以前版本的程序代码。