紧急求救!!!

caoyun 2003-08-27 07:15:18
钱能的C++的书上关于类的静态成员有这么一个程序:
#include <iostream.h>
class Student
{
public:
static int noOfStudents;
Student& nextStudent()
{
noOfStudents++;
return *this;
}
};
int Student::noOfStudents=0;
void fn(Student& s)
{
cout<<s.nextStudent().noOfStudents<<endl;
}
void main()
{
Student ss;
fn(ss);
}
其运行结果为:1。
书上说:成员函数nextStudent()实际上并没有被调用执行。
对于这句话我不是很明白,大家帮帮忙,谢谢!!
...全文
23 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoyun 2003-08-29
  • 打赏
  • 举报
回复
我用的事TC++`~
sandrowjw 2003-08-29
  • 打赏
  • 举报
回复
抱歉,纠正我自己的一个错误,这里++操作符是先收集后运算的,所以结果可能是0。
也就是说内联成了这种形式(好像编译器太强了吧):
cout<<ss.noOfStudents++<<endl;
或者这种形式(就有点古怪了)
cout<<ss.noOfStudents<<endl;
ss.noOfStudents++;
谁用过别的编译器吗?我手头只有vc。
caoyun 2003-08-29
  • 打赏
  • 举报
回复
我自己UP~~~
xiaoliuzi 2003-08-28
  • 打赏
  • 举报
回复
mark
sandrowjw 2003-08-28
  • 打赏
  • 举报
回复
你用的什么编译器,怎么是0哪?如果是0的话只能说明你的编译器后收集了++操作符,这好像有点奇怪。
你改成这样哪?
void main()
{
Student ss;
fn(ss);
cout<<ss.noOfStudents;
}
返回是0,1还是0,0。如果是0,1就说明后收集了++操作符,这应该是违反标准的,如果是0,0我也无话可说了。
我在vc下是1,1。如果内联展开的话可能相当于
cout<<(ss.noOfStudents++, ss.noOfStudents)<<endl;
caoyun 2003-08-28
  • 打赏
  • 举报
回复
Up~~
aflyinghorse 2003-08-28
  • 打赏
  • 举报
回复
s.nextStudent().noOfStudents
应该会被转化为
s.nextStudent();
Student::noOfStudents;

而上面的s.nextStudent();会被内联展开
caoyun 2003-08-28
  • 打赏
  • 举报
回复
Totomsx(浪潮左灵--狼) 能详细的说一下你的回帖中说的记忆功能是怎么回事吗?
tomsx 2003-08-28
  • 打赏
  • 举报
回复
在一个class 里有static type的话则这个static type编译器就把它放到静态存储区,其实这个区也是全局变量的存储区,所以static类型和别的一般变量在本质上是不一样的,我没有说过他的书,对于这句话也不太了解,不过你了解了它的本质理解也就不难了一般来说在类里用到static的主要是应该用它的这个记忆功能。这个功能其实就是因为它是放在静态区里,而不像一般的成员变量放在堆栈里。
yuanjinming 2003-08-28
  • 打赏
  • 举报
回复
我是vc的初学者,看到这个问题也想说两句,不一定正确希望大家来讨论。
先说一说caoyun(风明)的看法,我认为你这句话有些不太妥当“类静态成员的内存分配并不随着对象的构造和析够而改变”例如这个程序(这是我先编的,语法上可能有错误):
Class A
{
piblic:
static int m;
A()
{
m++;
cont<<m;
}
}
int A::m=0;
void main()
{
A a1.a2,a3;
}
我认为它的值肯定改变。
再看看
sandrowjw(伊卡洛斯) 的说法:在我看来内联函数是指在类里面的定义的函数,
外联函数是指在类里面声明,在类外定义的函数, 他说的我看不明白也不懂。请指教
一下
我的看法是,结果应该为1;
我认为fn(ss);调用的时候,本身nextStudent()就被调用,所以应该为1;
不一定对,请大家执教一下

caoyun 2003-08-28
  • 打赏
  • 举报
回复
我UP!!!
caoyun 2003-08-28
  • 打赏
  • 举报
回复
To: bm1408(嗔!我心己乱,万物皆沉,唯伊也!独醉!)
大哥,书不好,你帮忙回答一下问题呀,谢了`~`
bm1408 2003-08-28
  • 打赏
  • 举报
回复
钱能的书,不太好!
caoyun 2003-08-28
  • 打赏
  • 举报
回复
自己再UP一下,呵呵`~
caoyun 2003-08-28
  • 打赏
  • 举报
回复
To sandrowjw(伊卡洛斯):你所说的对于静态成员变量的引用没有通过成员函数的形式,而是看成对于一个全局变量的操作了。但是我对这个程序进行了处理,将引用符号都去掉,再次运行程序,其结果还是0呀,怎么解释呢?
To aflyinghorse():你所说的转换是什么样的一个机制呀~~
谢谢两位的回答,我希望能得到更为详细的答案,运行的结果有的为1,有的为0。如果运行结果为1的话,又怎么能说不调用函数nextStudent()了呢?到底如此的结果是和noOfStudent这个类成员是静态成员有关还是也与引用有关呢?
sandrowjw 2003-08-27
  • 打赏
  • 举报
回复
呀,第二次看到这个问题呀,实际上这是一个内联优化的问题,也就是对于静态成员变量的引用没有通过成员函数的形式,而是看成对于一个全局变量的操作了。不过我觉得作者的表述还是不太好,调用不调用不是主要的,关键是是否引用了该变量,如何引用的。
caoyun 2003-08-27
  • 打赏
  • 举报
回复
大家帮着UP一下,谢谢`~~
caoyun 2003-08-27
  • 打赏
  • 举报
回复
TurboC++应该使标准C++来处理的吧`~~~OK,刚才我又进行了一次变化,我把noOfStudents这个类数据成员变成了不是静态成员而是个局部变量,这一变在TurboC++中的运行结果就是1了`~
所以我认为这个程序的运行结果还是和static有关,大家能不能也试一下,一个是这个原程序,一个是将程序中的引用的符号&都去掉,即返回类型和函数参数都是类对象而不是类对象的引用,第三个是将这个程序中的static int noOfStudents变成int noOfStudents,使其不作为静态成员变量出现在数据中~~
谨待大家的结论和思考过程,谢谢`~~
Tinybaby 2003-08-27
  • 打赏
  • 举报
回复
我根Jinhao(辣子鸡丁)一样的效果(使用的是同一种编译器,可以说是很很标准的)
我认为原因是VC的问题
因为在VC中,在类体内定义的(不仅是声明)函数,不是按照标准C++处理的,不一定作内联函数处理
caoyun 2003-08-27
  • 打赏
  • 举报
回复
我用的是TC++3。0,运行时,结果是0;
在钱能的书上的这段程序中的后面说明里有这么一段解释:
“s.nextStudent()返回Student类对象的引用,该引用作为后面的点操作符左操作数,而右操作数是静态数据成员noOfStudents。
成员函数nextStudent()实际上未被调用执行。引用静态成员时,C++系统只关心静态成员的类类型。”
我认为这段解释的关键在“引用静态成员时,C++系统只关心静态成员的类类型”。但我把程序中引用的符号&都去掉的时候,也就意味这,nextStudent()返回的是一个类而不是一个类的引用;fn(Student s)函数的参数也就不是类的引用而是一个类了。这样之后我再运行程序其结果还是0!!!!
所以我认为,这个结果和函数的参数与函数的返回类型是否是类的引用没有关系,而是和类静态成员本身有关,类静态成员的内存分配并不随着对象的构造和析够而改变,它的空间是任何类对象所共享的,所以s.nextStudent()在这里就相当于Student,所以也就是Student::noOfStudents,故结果直接输出0,而没有调用执行nextStudent()函数`~`
各位,不知我说的对不对,大家都来讨论讨论这个程序和类的静态成员吧~~~~~
加载更多回复(10)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧