使用格式字符串打印类

时间:2013-07-13 09:48:31

标签: c++ oop

在我的代码中,我只使用格式字符串打印相同的对象。但是,结果并不相同。根据我的见解,我认为结果应为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;
}

3 个答案:

答案 0 :(得分:7)

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

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

printf("%d %d %d\n", a.a, a.a, a.a);

答案 1 :(得分: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的答案,了解您的代码错误的原因。

好的(免费的!可下载的)书籍是Thinking in C++ by Bruce Eckel

答案 2 :(得分: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;
}