在我的代码中,我只使用格式字符串打印相同的对象。但是,结果并不相同。根据我的见解,我认为结果应为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;
}
答案 0 :(得分:7)
a
是A
类型的对象,而不是整数,这是%d
所需要的。这会导致未定义的行为,这意味着任何事情都会发生。在这种情况下,似乎正在发生的事情是格式字符串之后的a
之一占据了堆栈上的三个int
参数将占用的相同位置,因此其数据成员( a
,b
和c
)是三个%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, b
或c
。
请参阅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;
}