我在调试练习测试中遇到了这个问题。请帮我理解输出。
foo(a)
产生:“复制”和“foo调用”,其中bar(a)
产生:“bar叫”。任何人都可以解释这两个电话的工作吗?
#include <stdio.h>
#include <stdlib.h>
class A
{
public:
A() : val_(0) {}
~A () {}
A(const A& c)
{
if(&c != this)
{
printf("Copying \n");
this->val_ = c.val_;
}
}
void SetVal(int v) {this->val_ = v;}
int GetVal() {return (this->val_);}
private:
int val_;
};
static void foo(A a)
{
printf("foo called \n");
a.SetVal(18);
}
static void bar(A& a)
{
printf("bar called \n");
a.SetVal(22);
}
int main(int, char**)
{
A a;
a.SetVal(99);
foo(a);
bar(a);
return 0;
}
答案 0 :(得分:0)
签名void foo(A a)
按值传递A,因此它将复制输入参数,然后在函数中使用它。
void bar(A& a)
传递对输入参数的引用,因此您调用函数的参数将在函数中使用。
修改:要获得更完整的说明,此链接可能有所帮助:http://courses.washington.edu/css342/zander/css332/passby.html
答案 1 :(得分:0)
void foo(A a) uses "pass by value". Which invokes copy constructor. Hence printing: "Copying" and then "foo called"
void bar(A& a)uses "pass by reference". Which does not invoke copy constructor. Hence printing only: "bar called"
请参阅difference