不能想当然
来源:互联网 发布:在线影视站源码 编辑:程序博客网 时间:2024/04/27 14:52
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();}
- 不能想当然
- 做产品不能想当然
- c++,要细心不能想当然
- C++要细心不能想当然
- c++,要细心不能想当然
- 想当然
- 不能想当然的ctrl+c ctrl+v
- 看别人的代码不能想当然
- 分块矩阵求逆不能想当然
- 不要想当然,原来ASP与ASP.NET不能共享会话(Session)
- SQL Server:触发器品读 -- Insert、 Delete、 Update(“updated ”是不存在的,不能想当然)
- 小心“想当然”
- 字典里的value值的类型是是object的类型,不能想当然的去调用其他方法。
- 修电脑,不要想当然
- 一定不要想当然啊!!
- Android: Inflater的想当然
- Java Compiler不会想当然
- 对stc90c52rc想当然了
- 如果你不想一辈子做工程师,必看!
- directx中使用windows 对话框
- 大型机汇编(mainframe assembler/HLASM)之CICS调用
- 数字签名和数字证书
- 高通平台android开发总结
- 不能想当然
- Eclipse的HTML编辑器
- Axure 记住用户的输入内容并显示出来
- 直接数字式频率合成器(DDS)
- ubuntu install software solve
- java NIO非阻塞方式的Socket编程
- webkit(1)
- 2012寒假《C++Primer》学习笔记
- Android入门:SharedPreferences