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".
还有就是指针也是有地址的,指针赋值的时候是将指针的指向的值放在指针的地址的空间中,而这句
void GetA(A* p_a) {
p_a = creatA();
}
只是将指针指向的值按值传过去,p_a只是一个局部变量。
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();
}
运行结果这才是正确的,真是不能想当然啊
如果觉得《不能想当然》对你有帮助,请点赞、收藏,并留下你的观点哦!