学C++,遇到两个小问题,请指点~
问题一:
// p1-851.cpp 为main()函数文件
#include<iostream.h>
main()
{
int i,s=0;
extern int fact(int x);
for (i=2;i<=6;i=i+2)
s+=fact(i);
cout<<"s="<<s<<endl;
}
// p1-852.cpp为计算阶乘函数文件
//定义fact()函数为外部(extern)函数
extern int fact(int x)
{
int i,t=1;
if(x==0) return(1);
for(i=1;i<=x;i++)
t*=i;
return(t);
}
如何用VC编多个源程序文件?选择--win32 console Application 然后呢?书上没说完,请高手指点啊~
问题二:
书生在线 09:19:54
student& max(student &x,student &y) //swap的参数为引用传递方式
{
return (x.grade>y.grade?x:y);
}
student max(student &x,student &y) //去掉student max的引用,会怎么样呢?
{
return (x.grade>y.grade?x:y);
}
这两个函数在使用有什么不同?
问题点数:20、回复次数:17Top
1 楼cheng19long(龙仔)回复于 2005-05-19 10:48:44 得分 0
up~~高手帮我啊~Top
2 楼zsal(zsal)回复于 2005-05-19 10:54:34 得分 3
新建空白工程:
FILE -> new, projects -> win32 console Application, An empty project -> Finish.
添加源文件:
FILE -> new, Files -> C++ source file, File name: main.cpp -> OK.
FILE -> new, Files -> C++ source file, File name: fact.cpp -> OK.
编译,运行。Top
3 楼predrag(Peja)回复于 2005-05-19 10:54:58 得分 1
我觉得第2个问题,用引用比较高效Top
4 楼zsal(zsal)回复于 2005-05-19 11:09:33 得分 10
问题二:
第二个函数是否为:
student max(student x,student y) //去掉student max的引用,会怎么样呢?
{
return (x.grade>y.grade?x:y);
}
区别在于,参数传递或返回值返回时,默认是值拷贝的,这样如果对象很大时,效率较低,所以引入了引用的概念,这样只拷贝对象的地址,提高了效率。
另外如果不想修改参数值,使用引用参数时,最好用const:
student& max(const student &x,const student &y) //swap的参数为引用传递方式
{
//
}
Top
5 楼cheng19long(龙仔)回复于 2005-05-19 11:22:59 得分 0
zsal(zsal) ( ) 信誉:100 2005-05-19 10:54:00 得分: 0
新建空白工程:
FILE -> new, projects -> win32 console Application, An empty project -> Finish.
添加源文件:
FILE -> new, Files -> C++ source file, File name: main.cpp -> OK.
FILE -> new, Files -> C++ source file, File name: fact.cpp -> OK.
编译,运行。
-----------------------------------------
多谢了,成功运行~~
========================================
predrag(Peja) ( ) 信誉:100 2005-05-19 10:54:00 得分: 0
我觉得第2个问题,用引用比较高效
-----------------------------------------
好像前面调用他的时候有个固定的格式:
student t = max(a,b);
student& max(student &x,student &y) 只是高效?也就是说以后用到的函数里能引用,就引用 ?是这样的吗?Top
6 楼pincer(无关紧要)回复于 2005-05-19 11:26:38 得分 1
尽量以const&的方式而不是传值方式来传递对象,这样会减少临时对象的产生,比较高效Top
7 楼Beover1984(摇滚人生)回复于 2005-05-19 11:37:19 得分 0
#include<iostream.h>
main()
{
int i,s=0;
extern int fact(int x); //extern 可以用在main中吗?
for (i=2;i<=6;i=i+2)
s+=fact(i);
cout<<"s="<<s<<endl;
}
应该是这样吧:
#include<iostream.h>
extern int fact(int x);
main()
{
int i,s=0;
for (i=2;i<=6;i=i+2)
s+=fact(i);
cout<<"s="<<s<<endl;
}
Top
8 楼cheng19long(龙仔)回复于 2005-05-19 11:59:02 得分 0
不知楼上的程序如何运行,我是直接复制过去,有两个main,怎么行啊?Top
9 楼djfu(飞龙在天)回复于 2005-05-19 12:56:21 得分 2
问题二:
第二个函数是否为:
student max(student x,student y) //去掉student max的引用,会怎么样呢?
{
return (x.grade>y.grade?x:y);
}
区别在于,参数传递或返回值返回时,默认是值拷贝的,这样如果对象很大时,效率较低,所以引入了引用的概念,这样只拷贝对象的地址,提高了效率。
---------------------------------------
其实这样的高效对于内置的数据类型(built-in types),几乎对效率没有什么影响。
它的高效是相对于一些类对象和一些大的对象来说的。
Top
10 楼djfu(飞龙在天)回复于 2005-05-19 12:57:33 得分 1
不知楼上的程序如何运行,我是直接复制过去,有两个main,怎么行啊?
------------------------------------
我真是服了你了,
#include<iostream.h>
extern int fact(int x);
main()
{
int i,s=0;
for (i=2;i<=6;i=i+2)
s+=fact(i);
cout<<"s="<<s<<endl;
}
才是他给的代码,前面一个是纠正上面的人说的示例。Top
11 楼flyingdancing2005(返璞归C)回复于 2005-05-19 13:06:13 得分 0
有意思..............Top
12 楼ksndyjs()回复于 2005-05-19 13:22:46 得分 2
关于第二个问题,主要是效率的问题,并因此会引出一系列问题比如:
int u = 10;
int& s()
{
return u;
}
void main()
{
int y = s();
y = 10; //if the reference is used for the return value of s(),
//then u =10,otherwise,the u remains no changed.
}
总之记住,引用永远都是另外一个变量的别名而已。如果另外一个变量没有了,那它的引用也不能再用了。所以不要返回栈上变量的引用。Top
13 楼lyld3618(核桃)回复于 2005-05-19 13:35:23 得分 0
上面说得都对!Top
14 楼cheng19long(龙仔)回复于 2005-05-19 16:18:21 得分 0
楼上的楼上,能不能给我一段程序,说明,有和没有的区别,你写的那个英文:
据我翻译是这样的:如果引用作为s()的返回值,那么u等于10,否则,u 没有改变
include <iostream.h>
int u = 10;
int s()
{
return u;
}
void main()
{
int y = s();
cout << y <<'\t' << u << endl;
y = 5; //if the reference is used for the return value of s(),
//then u =10,otherwise,the u remains no changed.
cout << y <<'\t' << u << endl;
}
这是我写的,我真的看不出来,要和不要有什么区别~,请指点~Top
15 楼zsal(zsal)回复于 2005-05-19 17:25:52 得分 0
#include <iostream.h>
int u = 10;
int s()
{
return u;
}
int &t()
{
return u;
}
void main()
{
int y = s();
cout << y <<'\t' << u << endl; //10 10
y = 5;
cout << y <<'\t' << u << endl; //5 10
int &z = t();
cout << z <<'\t' << u << endl; //10 10
z = 5;
cout << z <<'\t' << u << endl; //5 5
}
Top
16 楼cheng19long(龙仔)回复于 2005-05-19 17:58:37 得分 0
楼上的高手,是不是是:
int &t()
{
return u;
}
int &z = t();
这两个地方,要一致,才有效,如果只是int z = t();不能实现上面的功能
如果说程序中有:
student& max(student &x,student &y) //swap的参数为引用传递方式
{
return (x.grade>y.grade?x:y);
}
student t=max(a,b);
cout<<"Max:";
这里,程序并没有在t上加一个&,所以我认识这里面加不都一样~
现在我都越问越糊涂了...
Top
17 楼zsal(zsal)回复于 2005-05-19 18:26:16 得分 0
int w = t();
这里w是int型,只是值拷贝,地址并不会改变,所以w与u不是同一块内存,相互之间不影响。
int &z = t();
这里z是int&型,也就是引用型,引用做的是地址拷贝,这时,z与u的地址是相同的,也就是说,z相当于u的别名,而且引用型定义时必须被初始化,一旦初始化它的地址将不能被改变,也就不能再指向另一个变量了。Top




