从linux开始 发表于 2006-9-13 22:31:56

一个c++问题请教

这是我看到的一个例子,可是不明白贴出来请教一下
#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呢?谢谢!

从linux开始 发表于 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();
}

mozilla 发表于 2006-9-14 08:51:10

size(f-l);
不同编译器赋值循序不一样。如果是从右往左,你的写法就有逻辑错误。

从linux开始 发表于 2006-9-14 09:12:34

我在vc上编译的,得到了结果10 20 0

从linux开始 发表于 2006-9-14 09:23:47

我知道了,应该是声明顺序的问题吧

jeffgeng 发表于 2006-9-16 19:59:49

在为成员变量赋初值时是按照从右到左的顺序执行的,当为size赋值时,first和last的值还为0。

hujiao 发表于 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。

hujiao 发表于 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,是预想的结果。大家说说为什么?

windwiny 发表于 2006-9-19 20:56:58

类成员初始化的顺序是按它被 "声明" 的顺序来的....

jeffgeng 发表于 2006-9-22 09:41:08

可能和编译器有关系吧

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

松心心 发表于 2006-9-24 21:38:06

我也没理解,
在我的机子出来:
10 20 -4555
后面也不是0而是-4555

snnn 发表于 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;


就万事大吉了。
页: [1]
查看完整版本: 一个c++问题请教