糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 不能想当然

不能想当然

时间:2019-08-14 15:50:46

相关推荐

不能想当然

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();

}

运行结果这才是正确的,真是不能想当然啊

如果觉得《不能想当然》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。