-2

在我的代码中,我只是使用格式字符串打印相同的对象。但是,结果并不相同。根据我的洞察力,我认为结果应该是97 97 97,但结果是97 98 99

输出发生了什么?我真的不明白发生了什么。你能解释一下吗?

class A {
public:
    int a, b, c;
    A() {
        this->a = 97;
        this->b = 98;
        this->c = 99;
    };
};

int main(int argc, char **argv) {
    A a;
    printf("%d %d %d\n", a, a, a);
    return 0;
}
4

3 回答 3

7

a是类型的对象A,而不是整数,这是%d需要的。这会导致未定义的行为,这意味着任何事情都会发生。在这种情况下,似乎正在发生的事情是a格式字符串之后的一个 s 占据了堆栈上三个int参数将占据的相同位置,因此它的数据成员(abc是三个%ds 的最终结果使用。

要打印存储A::a3 次的值 97,您应该这样做:

printf("%d %d %d\n", a.a, a.a, a.a);
于 2013-07-13T09:55:13.897 回答
1

对您的代码进行小幅改写:

class A
{
public:
    int a;
    int b;
    int c;
    A(){
        a = 97;
        b = 98;
        c = 99;
    }
void AFunction(int a, int b, int c){
        this->a = a;
        this->b = b;
        this->c = c;
    }
};
int main(int argc, char **argv){
    A a;
    printf("(Expect: 97 97 97) %d %d %d\n", a.a, a.a, a.a);
    printf("(Expect: 97 98 99) %d %d %d\n", a.a, a.b, a.c);

    a.AFunction(1,2,3);
    printf("(Expect: 1 2 3) %d %d %d\n", a.a, a.b, a.c);

    return 0;
}

this->在构造函数中使用语法并没有错,只是没有必要。在示例AFunction()中,有必要使用,以便编译器可以确定您所指的是this->哪个。a, bc

请参阅 Marcelo 的回答,了解您的代码错误的原因。

一本很好(而且免费!可下载)的书是Bruce Eckel 的 Thinking in C++

于 2013-07-13T10:21:59.263 回答
1

我刚刚清理了您的代码,使其看起来更像 C++:

class A {
public:
    // google for "constructor initialization list"
    A(): a_(97), b_(98), c_(99) 
    {}

    void print() const {
        // any member variable reference "a" implies "this->a"
        printf("%d %d %d\n", a_, b_, c_);
    }

// Having public member variables in a class is rarely a good idea
private:
    int a_;
    int b_;
    int c_;

    // In C++11 you can specify default values for the members like this:
    //
    // int a_ = 97;
    // int b_ = 98;
    // int c_ = 99;
    //
    // Then you can omit the constructor definition.
};

int main(int argc, char **argv){
    A a;
    a.print();
    return 0;
}
于 2013-07-13T10:36:57.753 回答