Chinaunix首页 | 论坛 | 博客
  • 博客访问: 616808
  • 博文数量: 201
  • 博客积分: 3076
  • 博客等级: 中校
  • 技术积分: 2333
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:44
文章分类

全部博文(201)

文章存档

2010年(118)

2009年(83)

我的朋友

分类: C/C++

2009-12-10 14:58:47

成员函数参数的默认值是在声明里赋,还是在定义里?

class CAbc

{

        public:

        static int m_abc;

        CAbc(){}

        static void set(int abc);

 

        int fn(int a,int b=0,int c=5);

        //int fn(int a,int b,int c);

};

 

void CAbc::set(int abc)

{

        m_abc=abc;

}

 

//int CAbc::fn(int a,int b=0,int c=5)

//redefinition of default parameter : parameter 3

int CAbc::fn(int a,int b,int c)

{

        cout<

        return a;

}

 

int CAbc::m_abc=1000;

int main(int argc, char* argv[])

{

        CAbc a;

        a.fn(6);

        a.set(10);

1">        return 0;

}

 

声明是用户可以看到的部分,客户非常信任地使用这个特性,希望得到一定的结果,但是你在实现里使用了不同的缺省值,那么将是灾难性的。因此编译器禁止声明和定义时同时定义缺省参数值。  

 

类的成员函数的参数表在声明时默认参数位于参数表右部,如int fn(int a,int b=0,int c=5)之类的,但在它定义的时候则不能加默认参数,只能写int fn(int a,int b,int c);

 

若声明时没有定义缺省参数值,那么在定义成员函数时可以定义缺省参数值。但这种情况通常用户是看不见的,因此应避免。

 

对于非类中的函数,在函数声明中定义默认参数的另外一个好处时,可以利用声明来随意更改默认参数的值。

 

//int fglobal(int a,int b=2,int c=5)

//redefinition of default parameter : parameter 3

int fglobal(int a,int b,int c)

{

cout<

return a;

}

 

int fglobal(int a,int b=2,int c=5); // 全局的申明

 

int CAbc::m_abc=1000;

int main(int argc, char* argv[])

{

CAbc a;

a.fn();

//fglobal(); //此时用的全局申明,无第一个参数不行

fglobal(1);

int fglobal(int a=2,int b=3,int c=5);  // 局部的申明,不管上述默认参数是在定义还是申明中

fglobal();

::fglobal(3); // 此时将采用全局申明

return 0;

}

//205

//125

//235

m 0cm 0pt">//325

}

实践证明,缺省参数可以在定义中,也可以在声明中,只要全局的声明和定义中只有一个带参数即可

 

局部的声明中可以随便改变默认参数(不管上述默认参数是在定义中还是在声明中)。在下一次改变之前,此参数将一直生效,并将覆盖全局的申明。若要使用全局的声明默认参数,可以加::


------------------------------------------------------

一、默认参数
在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。

默认参数的语法与使用:
(1)在函数声明或定义时,直接对参数赋值。这就是默认参数;
(2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。

注意:
(1)默认参数只可在函数声明中设定一次。只有在无函数声明时,才可以在函数定义中设定。
(2)默认参数定义的顺序为自右到左。即如果一个参数设定了缺省值时,其右边的参数都要有缺省值。

如:int mal(int a, int b=3, int c=6, int d=8)    正确,按从右到左顺序设定默认值。
        int mal(int a=6, int b=3, int c=5, int d)  错误,未按照从右到左设定默认值。c设定缺省值了,而其右边的d没有缺省值。
(3)默认参数调用时,则遵循参数调用顺序,自左到右逐个调用。这一点要与第(2)分清楚,不要混淆。
如:void mal(int a, int b=3, int c=5);      //默认参数
        mal(3, 8, 9 );                                      //调用时有指定参数,则不使用默认参数
        mal(3, 5);                  //调用时只指定两个参数,按从左到右顺序调用,相当于mal(3,5,5);
        mal(3);                      //调用时只指定1个参数,按从左到右顺序调用,相当于mal(5,3,5);
        mal(  );                      //错误,因为a没有默认值
        mal(3,  , 9)               //错误,应按从左到右顺序逐个调用
再如: void mal(int a=8, int b=3, int c=5);      //默认参数
             mal(  );                                                      //正确,调用所有默认参数,相当于mal(8,3,5);

(4)默认值可以是全局变量、全局常量,甚至是一个函数。但不可以是局部变量。因为默认参数的调用是在编译时确定的,而局部变量位置与默认值在编译时无法确定。



当重载函数与默认参数共同使用时,要注意出现二义性问题


阅读(3951) | 评论(0) | 转发(0) |
0

上一篇:C语言面试题(转载)

下一篇:static

给主人留下些什么吧!~~