c++ 中,函数的默认参数问题
我看到C++的某教程上这么写的:1.默认参数的函数C++允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省略了对应位置上的实参的值时,则...
我看到C++的某教程上这么写的:
1. 默认参数的函数
C++允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省略了对应位置上的实参的值时,则在执行被调函数时,以该形参的默认值进行运算。如:
#include <iostream.h>
void sum(int num=10) //形参默认值
{ int i,s=0;
for(i=1;i<=num;i++)
s=s+i;
cout<<"sum is "<<s<<"\n"; }
void main()
{ sum(100); //提供了实参值,被调函数以100进行运算,
//输出结果为5050
sum(); //省略实参值,使用形参默认值10,输出结果为55
}
2. 使用默认参数的函数的注意事项
(1)默认参数一般在函数说明中提供。如果程序中既有函数的说明又有函数的定义时,则定义函数时不允许再定义参数的默认值。如果程序中只有函数的定义,而没有说明函数,则默认参数才可出现在函数定义中。如:
void point(int x=10,y=20);
void main()
{…………}
void point (int x, int y)
{ cout<<x<<endl;
cout<<y<<endl;
}
我的问题是,这教程第一节和第二节是不是相互矛盾啊?第一节里的SUM函数有定义也有说明,而且在定义里有默认参数。第二节里又说如果函数有定义也有说明,就不能在定义里用默认参数。
这是怎么回事呢?请赐教,谢谢~~~
第一段代码中的{ int i,s=0;
for(i=1;i<=num;i++)
s=s+i;
cout<<"sum is "<<s<<"\n"; }
不算是函数的定义吗? 展开
1. 默认参数的函数
C++允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省略了对应位置上的实参的值时,则在执行被调函数时,以该形参的默认值进行运算。如:
#include <iostream.h>
void sum(int num=10) //形参默认值
{ int i,s=0;
for(i=1;i<=num;i++)
s=s+i;
cout<<"sum is "<<s<<"\n"; }
void main()
{ sum(100); //提供了实参值,被调函数以100进行运算,
//输出结果为5050
sum(); //省略实参值,使用形参默认值10,输出结果为55
}
2. 使用默认参数的函数的注意事项
(1)默认参数一般在函数说明中提供。如果程序中既有函数的说明又有函数的定义时,则定义函数时不允许再定义参数的默认值。如果程序中只有函数的定义,而没有说明函数,则默认参数才可出现在函数定义中。如:
void point(int x=10,y=20);
void main()
{…………}
void point (int x, int y)
{ cout<<x<<endl;
cout<<y<<endl;
}
我的问题是,这教程第一节和第二节是不是相互矛盾啊?第一节里的SUM函数有定义也有说明,而且在定义里有默认参数。第二节里又说如果函数有定义也有说明,就不能在定义里用默认参数。
这是怎么回事呢?请赐教,谢谢~~~
第一段代码中的{ int i,s=0;
for(i=1;i<=num;i++)
s=s+i;
cout<<"sum is "<<s<<"\n"; }
不算是函数的定义吗? 展开
4个回答
展开全部
其实准确的说,你所说的函数说明是指函数的前项声明。也就是在程序前面,一般在main前面用如下格式声明一个函数:类型+函数名+(参数类型或者默认参数)+分号
你给出的这两个程序不矛盾。第一个中并没有前项声明函数,只是sum函数在main前面定义。第二个则不同,point函数在main前面是前项声明(注意void point(int x=10,y=20);这句是加了分号的),仅仅是声明没有定义,而point函数的定义是放在main后才真正定义的。
函数为什么要前项声明呢,这是因为在比较大的程序中,某些地方调用函数的时候,被调用的函数还没被定义,前项声明的作用就是在程序的最开头就声明了函数名和参数要求,那么整个程序在任何地方都可以调用这个函数。即声明的意思就是告诉整个程序,某个函数名是合法的。
换在你给的第二程序的理解为,main函数要调用point函数,如果前面没有声明,那么main函数就不认识point这个函数。你可以尝试注释掉void point(int x=10,y=20);这句,编译就会报错。但因为这个程序是非常简单的小程序,所以你可以把point函数的定义放在main前面,与此同时把oid point(int x=10,y=20);这句删除,程序也是对的。
明白了吧,你所说的第一节的SUM函数是没有你所说的“说明”的,也就是第一节的只是定义没有前项声明。第二节的首先前项声明,然后再定义的。
你给出的这两个程序不矛盾。第一个中并没有前项声明函数,只是sum函数在main前面定义。第二个则不同,point函数在main前面是前项声明(注意void point(int x=10,y=20);这句是加了分号的),仅仅是声明没有定义,而point函数的定义是放在main后才真正定义的。
函数为什么要前项声明呢,这是因为在比较大的程序中,某些地方调用函数的时候,被调用的函数还没被定义,前项声明的作用就是在程序的最开头就声明了函数名和参数要求,那么整个程序在任何地方都可以调用这个函数。即声明的意思就是告诉整个程序,某个函数名是合法的。
换在你给的第二程序的理解为,main函数要调用point函数,如果前面没有声明,那么main函数就不认识point这个函数。你可以尝试注释掉void point(int x=10,y=20);这句,编译就会报错。但因为这个程序是非常简单的小程序,所以你可以把point函数的定义放在main前面,与此同时把oid point(int x=10,y=20);这句删除,程序也是对的。
明白了吧,你所说的第一节的SUM函数是没有你所说的“说明”的,也就是第一节的只是定义没有前项声明。第二节的首先前项声明,然后再定义的。
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void point(int x=10,y=20); //这句是 声明
void point(int x=10,y=20) {} //带函数体没有分号是 定义
所以第一节里只有声明没有定义,
函数在调用前需要声明,但如果在main函数前定义的函数是可以省略声明直接调用的.
简而言之,就是使用默认参数时是把默认参数写道声明里了,省略声明时写到定义里(其实也就是声明和定义合二为一了)
void point(int x=10,y=20) {} //带函数体没有分号是 定义
所以第一节里只有声明没有定义,
函数在调用前需要声明,但如果在main函数前定义的函数是可以省略声明直接调用的.
简而言之,就是使用默认参数时是把默认参数写道声明里了,省略声明时写到定义里(其实也就是声明和定义合二为一了)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询