找回密码
 注册
查看: 1771|回复: 11

一个c++问题请教

[复制链接]
发表于 2006-9-13 22:31:56 | 显示全部楼层 |阅读模式
这是我看到的一个例子,可是不明白贴出来请教一下
#include <iostream.h>

class A{
        int zise;
        int first,last;
public:
        A(int f, init l):first(f), last(l),size(first - last){}
        ~A(){}
        void print()
        {
                cout << first << " " << lasr << " " << size <<endl;
        }
};

void main()
{
        A a(10, 20);
        a.print();
}
在我看来结果应该是10 20 -10 可是结果却是10 20 0,想不明白,请指点一下,为什么size的赋值会是0呢?谢谢!
 楼主| 发表于 2006-9-13 22:36:54 | 显示全部楼层
程序粘错了,有语法错误,重新贴一次
#include <iostream.h>

class A{
   int size;
   int first,last;
public:
   A(int f, int l):first(f), last(l),size(first - last){}
   ~A(){}
   void print()
   {
       cout << first << " " << last << " " << size <<endl;
   }
};

void main()
{
   A a(10, 20);
   a.print();
}
回复

使用道具 举报

发表于 2006-9-14 08:51:10 | 显示全部楼层
size(f-l);
不同编译器赋值循序不一样。如果是从右往左,你的写法就有逻辑错误。
回复

使用道具 举报

 楼主| 发表于 2006-9-14 09:12:34 | 显示全部楼层
我在vc上编译的,得到了结果10 20 0
回复

使用道具 举报

 楼主| 发表于 2006-9-14 09:23:47 | 显示全部楼层
我知道了,应该是声明顺序的问题吧
回复

使用道具 举报

发表于 2006-9-16 19:59:49 | 显示全部楼层
在为成员变量赋初值时是按照从右到左的顺序执行的,当为size赋值时,first和last的值还为0。
回复

使用道具 举报

发表于 2006-9-19 17:44:18 | 显示全部楼层
#include <iostream.h>

class A{
int size;
int first,last;
public:
A(int f, int l):size(first - last),first(f), last(l){}
~A(){}
void print()
{
cout << first << " " << last << " " << size <<endl;
}
};

void main()
{
A a(10, 20);
a.print();
}


//这样的结果还是10,20,0,  为什么??  如果把first改为f,last  改为l,则无论什么顺序,结果都是10,20,-10。
回复

使用道具 举报

发表于 2006-9-19 17:46:49 | 显示全部楼层
#include <iostream.h>

class A{
int size;
int first,last;
public:
A(int f, int l):first(f), last(l){size=(first - last);}
~A(){}
void print()
{
cout << first << " " << last << " " << size <<endl;
}
};

void main()
{
A a(10, 20);
a.print();
}


/这样结果就是10,20,-10,是预想的结果。大家说说为什么?
回复

使用道具 举报

发表于 2006-9-19 20:56:58 | 显示全部楼层
类成员初始化的顺序是按它被 "声明" 的顺序来的....
回复

使用道具 举报

发表于 2006-9-22 09:41:08 | 显示全部楼层

可能和编译器有关系吧

可能你用的编译器的赋值方法就是在声明时不传入真实值吧,在实现时就会按照真实值计算了
回复

使用道具 举报

发表于 2006-9-24 21:38:06 | 显示全部楼层
我也没理解,
在我的机子出来:
10 20 -4555
后面也不是0而是-4555
回复

使用道具 举报

发表于 2006-10-24 12:13:59 | 显示全部楼层
写这代码的人大概就想说一句话,"我就是NB,我故意玩死你!"

A(int f, int l):first(f), last(l),size(first - last)

你知道他们的初始化顺序是如何吗?
如果你用gcc 3.4及以上版本编译,这样的代码一定会给一个warning,不知道你注意没有?

上面的朋友已经说过了,类成员初始化的顺序是按它被 "声明" 的顺序来的....
而你在构造函数中写的顺序与类成员被声明的顺序不同,所以最后的结果是不确定的。
有一条原则,如果类的构造函数的初始化成员列表中的某个成员变量的初始化需要用到该类的其他非静态成员变量。那么这个成员变量不应该被写在初始化成员列表中。
例如

A(int f, int l):first(f), last(l){
size=first - last;


就万事大吉了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-5-19 17:44 , Processed in 0.032969 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表