不能想当然

来源:互联网 发布:在线影视站源码 编辑:程序博客网 时间: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". 
还有就是指针也是有地址的,指针赋值的时候是将指针的指向的值放在指针的地址的空间中,而这句
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();
}
运行结果这才是正确的,真是不能想当然啊

原创粉丝点击