我无法弄清楚以下情况: 我有3个课程:
AA.h
class AA
{
public:
AA();
static CC *i;
};
BB.h
class BB
{
public:
BB();
void static setI(CC *i);
};
CC.h
class CC
{
public:
CC();
};
AA.cpp
AA::AA(){}
CC *AA::i= nullptr;
BB.cpp
BB::BB(){}
void BB::setI(CC *i)
{
i = new CC();
cout<<i<<endl;
cout<<AA::i;
}
CC.cpp
CC::CC(){}
所以我在A类中有一个CC类型的静态pointe。 我以下列方式开始主攻:
int main(int argc, char *argv[])
{
BB::setI(AA::i);
return 0;
}
我得到的输出是
//0xaeed70
//0
为什么AA::i
不等于i
?
答案 0 :(得分:4)
BB::setI
的参数类型为CC *i
,指针本身按值传递,i
从参数中复制。对函数内i
的任何修改都与原始参数AA::i
无关。
你想要的可能是传递参考,即
void BB::setI(CC *&i)
{
i = new CC();
cout<<i<<endl;
cout<<AA::i;
}
答案 1 :(得分:1)
在表达式i = new CC()
中,变量i
是函数BB::setI
的局部变量,它使用AA::i
的值进行初始化,因为您调用的函数类似BB::setI(AA::i);
。将任何值分配给i
只会更改此局部变量的值,而不会更改在调用函数时用于初始化它的其他变量的值。
答案 2 :(得分:0)
与这个较小的例子完全相同:
int i = 0;
void setI(int x)
{
x = 1234;
cout << x << endl;
cout << i;
}
int main()
{
setI(i);
}
正如您在此处可以更清楚地看到的那样,您正在为函数的参数指定一个新值
此参数与AA
的成员无关。
无论其类型如何,如果您想要一个函数来修改对象,您需要将一个引用(或指针)传递给该对象;你不能传递对象的价值。