C++真不能想当然。
#include <iostream>
using namespace std;
class A{
public:
A(){}
void doSomeThing(){cout<<" is A";}
};
A* creatA(){
return new A;
}
void GetA(A* p_a) {
p_a = creatA();
}
int main()
{
A *data = NULL;
GetA(data);
data->doSomeThing();
return 0;
} 运行结果#include <iostream>using namespace std;class A{public:
A(){}void doSomeThing(){cout<<" is A";}};A* creatA(){return new A;}void GetA(A* p_a) {p_a = creatA();}int main(){A *data = NULL;// GetA(data);data->doSomeThing();
return 0;} 结果这是掉眼镜啊,怎么回事。其实代码一的GetA(data); 没有效果,代码一和二是一样的。 这就是c++对象模型问题了。编译器会把data->doSomeThing()这行代码改成类似这样:doSomeThing(data),data就是this指针。 因为doSomeThing()函数里没有用到this指针,他为null,也无所谓,所以会打印出“is A".还有就是指针也是有地址的,指针赋值的时候是将指针的指向的值放在指针的地址的空间中,而这句只是将指针指向的值按值传过去,p_a只是一个局部变量。void GetA(A* p_a) {p_a = creatA();}void GetA(A* p_a) {cout<<&p_a<<endl;
p_a = creatA();}int main(){A *data = NULL;cout<<&data<<endl;
GetA(data);
data->doSomeThing();
return 0;}我改成这样,请看结果地址不一样,只有这样才行,运行结果这才是正确的,真是不能想当然啊void GetA(A* &p_a) {cout<<&p_a<<endl;
p_a = creatA();}