浅析C++中的this指针[VC/C++编程]
本文“浅析C++中的this指针[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
有下面的一个简单的类:
classCNullPointCall
{
public:
staticvoidTest1();
voidTest2();
voidTest3(intiTest);
voidTest4();
private:
staticintm_iStatic;
intm_iTest;
};
intCNullPointCall::m_iStatic=0;
voidCNullPointCall::Test1()
{
cout<<m_iStatic<<endl;
}
voidCNullPointCall::Test2()
{
cout<<"VeryCool!"<<endl;
}
voidCNullPointCall::Test3(intiTest)
{
cout<<iTest<<endl;
}
voidCNullPointCall::Test4()
{
cout<<m_iTest<<endl;
}
那么下面的代码都精确吗?城市输出什么?
CNullPointCall*pNull=NULL;//没错,就是给指针赋值为空
pNull->Test1(); //call1
pNull->Test2();//call2
pNull->Test3(13);//call3
pNull->Test4();//call4
你必定会很奇特我为什么这么问.一个值为NULL的指针怎么可以用来调用类的成员函数呢?!但是实事却很让人吃惊:除了call 4那行代码以外,别的3个类成员函数的调用都是成功的,都能精确的输出后果,并且包含这3行代码的程序能非常好的运行.
经过细心的对比便可以发现,call 4那行代码跟其他3行代码的本质辨别:类CNullPointCall的成员函数顶用到了this指针.
关于类成员函数而言,并非一个对象对应一个单独的成员函数体,而是此类的全部对象共用这个成员函数体. 当程序被编译之后,此成员函数地址即已肯定.而成员函数之所以能把属于此类的各个对象的数据辨别开, 就是靠这个this指针.函数体内全部对类数据成员的拜候, 城市被转化为this->数据成员的方法.
而一个对象的this指针并非对象本身的一部份,不会影响sizeof(“对象”)的后果.this作用域是在类内部,当在类的非静态成员函数中拜候类 的非静态成员的时刻,编译器会自动将对象本身的地址作为一个隐含参数传送给函数.也就是说,即便你没有写上this指针,编译器在编译的时刻也是加上 this的,它作为非静态成员函数的隐含形参,对各成员的拜候均通过this举行.
关于上面的例子来说,this的值也就是pNull的值.也就是说this的值为NULL.而Test1()是静态函数,编译器不会给它传送this指 针,所以call 1那行代码可以精确调用(这里相当于CNullPointCall::Test1());关于Test2()和Test3()两个成员函数,固然编译器会 给这两个函数传送this指针,但是它们并没有通过this指针来拜候类的成员变量,因此call 2和call 3两行代码可以精确调用;而关于成员函数Test4()要拜候类的成员变量,因此要利用this指针,这个时刻发现this指针的值为NULL,就会造成 程序的崩溃.
其实,我们可以想象编译器把Test4()转换成以下的情势:
voidCNullPointCall::Test4(CNullPointCall*this)
{
cout<<this->m_iTest<<endl;
}
而把call 4那行代码转换成了下面的情势:
CNullPointCall::Test4(pNull);
所以会在通过this指针拜候m_iTest的时刻造成程序的崩溃.
以上是“浅析C++中的this指针[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |