不能想当然

                       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();
}
运行结果这才是正确的,真是不能想当然啊
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值