C++类/函数默认参数

经典C++笔试题解析8

--默认参数在哪指定?函数声明还是定义?

 

Sailor_forever sailing_9806@163.com 转载请注明

http://blog.csdn.net/sailor_8318/archive/2008/11/19/3337236.aspx

 

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

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<<a << b << c << endl;

        return a;

}

 

int CAbc::m_abc=1000;

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

{

        CAbc a;

        a.fn(6);

        a.set(10);

        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<<a << b <<c<< endl;

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

//325

}

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

 

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

 

 

经典C++笔试题解析7

 

--如何利用成员变量作为成员函数的默认参数

 

 

 

Sailor_forever sailing_9806@163.com 转载请注明

 

http://blog.csdn.net/sailor_8318/archive/2008/11/19/3337236.aspx

 

 

 

如何在类成员函数中默认引用类成员?

 

class CAbc;

 

class CAbc

 

{

 

private:

 

int m_abc;

 

public:

 

void fun0(int &p=NULL)//编译错误

 

{

 

printf("%d",p);

 

}

 

 

 

void fun1(const int &p=NULL)//编译通过

 

{

 

printf("%d",p);

 

}

 

void fun2(int &p=this->m_abc)//编译错误

 

{

 

printf("%d",p);

 

}

 

 

 

void fun3(const int &p=m_abc)//编译错误

 

{

 

printf("%d",p);

 

}

 

};

 

引用必有初始值,且不能为Null

 

 

 

class CAbc;

 

class CAbc

 

{

 

        public:

 

        int m_abc;

 

        CAbc(){}

 

        void set(int abc);

 

        void fun( const int &p=m_abc) // const只是表示其为输入参数而已,可以去掉

 

        {

 

                printf("%d/n",p);

 

        }

 

};

 

 

 

//提示:   error   C2648   将成员作为默认参数使用要求静态成员。

 

一个类中,为什么不能将数据成员做为成员函数的默认参数?

 

标准规定这么一个限制条件是有其理由的,非静态成员如果在成员函数被调用前没有被初始化,此时编译器无法确认函数参数的默认值是多少。而标准这样做就把错误的发现提前到编译期。

 

 

 

解决办法是将缺省参数值是静态绑定在静态类型成员上面。

 

 

 

以下代码通过了

 

class CAbc;

 

class CAbc

 

{

 

        public:

 

        static int m_abc;

 

        CAbc(){}

 

        void set(int abc);

 

        void fun( const int &p=m_abc) // const只是表示其为输入参数而已,可以去掉

 

        {

 

                printf("%d/n",p);

 

        }

 

};

 

 

 

void CAbc::set(int abc)

 

{

 

        m_abc=abc;

 

}

 

 

 

int CAbc::m_abc=1000;

 

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

 

{

 

        CAbc a;

 

        a.fun();

 

        a.set(10);

 

        a.fun();

 

        return 0;

 

}

 

posted on 2017-02-09 19:44  zhangyz017  阅读(4324)  评论(0编辑  收藏  举报

导航