咸阳 网站建设,莱芜雪野湖天气预报,厦门模板网站,网站建设做网站4.3 C对象模型和this指针 
4.3.1 成员变量和成员函数分开存储 
在C中#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 
#include iostreamclass Person {
public:Person() {mA  0;} //非静态成员变量占对象空间int mA;//静态成员变量…4.3 C对象模型和this指针 
4.3.1 成员变量和成员函数分开存储 
在C中类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 
#include iostreamclass Person {
public:Person() {mA  0;} //非静态成员变量占对象空间int mA;//静态成员变量不占对象空间static int mB;//函数也不占对象空间所有函数共享一个函数实例void func() {std::cout  mA:  this-mA  std::endl;} //静态成员函数也不占对象空间static void sfunc() {}
};int main() {//实例化一个对象为p1Person p1;std::cout  Person:sizeof(Person)  std::endl;std::cout  p1:  sizeof(p1)  std::endl;return 0;
}运行结果如下 4.3.2 this指针概念 
通过4.3.1我们知道在C中成员变量和成员函数是分开存储的 每一个非静态成员函数只会诞生一份函数实例也就是说多个同类型的对象会共用一块代码 那么问题是这一块代码是如何区分那个对象调用自己的呢 c通过提供特殊的对象指针this指针解决上述问题。 
this指针指向被调用的成员函数所属的对象 
this指针是隐含每一个非静态成员函数内的一种指针 this指针不需要定义直接使用即可 
this指针是一个常量指针可以看做const type * this 指针的指向不能修改this  NULL这样是错的。 
this指针的用途 
当形参和成员变量同名时可用this指针来区分 
在类的非静态成员函数中返回对象本身可使用return *this 
#include iostreamclass Person {
public:Person(int age) {//1 使用this区分形参和成员变量this-age  age;} Person PersonAddPerson(Person p) {this-age  p.age;//2 返回对象本身,this为指针所以加上*return *this;} //定义一个成员变量属性为publicint age;
};void test01()
{   //实例化一个对象为p1,会调用有参构造函数Person p1(10);//打印p1.age的结果std::cout  p1.age:  p1.age  std::endl;//实例化一个对象为p2Person p2(12);//p2.PersonAddPerson(p1)这是使用p2对象调用成员函数PersonAddPerson(p1)//成员函数返回值是对象p2然后再次调用成员函数p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);std::cout  p2.age:  p2.age  std::endl;}int main() {test01();return 0;
}运行结果如下 #include iostreamclass MyClass {
public:void printAddress() {std::cout  Address of the current object:   this  std::endl;}void modifyObject() {// 下面的语句是非法的会导致编译错误// this  nullptr;  // Error: assignment of read-only parameter this// 修改成员变量是合法的data  42;}private:int data;
};int main() {MyClass obj;// 调用成员函数显示对象地址obj.printAddress();// 调用修改对象的函数obj.modifyObject();return 0;
} 
4.3.3 空指针访问成员函数 
C中空指针也是可以调用成员函数的但是也要注意有没有用到this指针 如果用到this指针需要加以判断保证代码的健壮性 
示例 
#include iostreamclass Person {
public:void ShowClassName() {std::cout  Person类  std::endl;} void ShowPerson() {if(this  NULL)return ;std::cout  age:  age  std::endl;} int age;};void test01()
{   //创建一个对象指针Person* p1  NULL;//使用对象指针调用成员函数p1-ShowClassName();//使用对象指针调用成员函数成员函数使用了this指针空对象指针就使用不了   p1-ShowPerson();}int main() {test01();return 0;
}执行结果如下 成员函数去掉this判断部分 
#include iostreamclass Person {
public:void ShowClassName() {std::cout  Person类  std::endl;} void ShowPerson() {/*if(this  NULL)return ;*/std::cout  age:  age  std::endl;} int age;};void test01()
{   //创建一个对象指针Person* p1  NULL;//使用对象指针调用成员函数p1-ShowClassName();//使用对象指针调用成员函数成员函数使用了this指针空对象指针就使用不了p1-ShowPerson();}int main() {test01();return 0;
}再次编译执行结果如下 对于上面出现的错误做一个解释 
代码中如果去掉了 if(this  NULL) 的检查并试图在一个空指针上调用 ShowPerson 函数程序会尝试通过一个空指针来访问 age 成员变量。对空指针进行解引用是一种未定义的行为通常会导致段错误。 
具体步骤如下 
声明一个空指针例如 Person* nullPointer  nullptr;。尝试在这个空指针上调用一个成员函数nullPointer-ShowPerson();。在 ShowPerson 函数内部尝试通过 this-age 访问 age 成员变量。由于 this 是一个空指针尝试访问 this-age 会导致段错误。 
4.3.4 const修饰成员函数 
常函数 
成员函数后加const后我们称为这个函数为常函数 
常函数内不可以修改成员属性 
成员属性声明时加关键字mutable后在常函数中依然可以修改 
常对象 
声明对象前加const称该对象为常对象 
常对象只能调用常函数 
const修饰成员函数 
#include iostreamclass Person {
public://默认构造函数Person() {p_a  0;p_b  0;} void ShowPerson() {//隐含在每个成员函数内部都有一个this指针,this是一个常量指针//this  NULL; 常量指针的内容不能修改this-p_a  10;//对于常量指针的指向的内容可以修改       } void ShowPerson2() const {//隐含在每个成员函数内部都有一个this指针,this是一个常量指针//this  NULL; 常量指针的内容不能修改//const修饰成员函数表示指针指向的内存空间的数据不能修改除了mutable修饰的变量//this-p_a  20;//p_b变量被mutable修饰可以修改this-p_b  100;//常函数中变量不能修改//p_a  12;//使用mutable修改的变量可以修改p_b  22;       } public:int p_a;mutable int p_b;};void test01()
{   //创建一个对象会调用默认构造函数Person p1;//查看变量p_a和p_b的值,调用构造函数后值都为0std::cout  p_a:  p1.p_a   p_b:  p1.p_b  std::endl;//使用对象调用成员函数p1.ShowPerson();//查看此时变量p_a和p_b的值,p_a会变为10,p_b为0std::cout  p_a:  p1.p_a   p_b:  p1.p_b  std::endl;//使用对象调用常量成员函数p1.ShowPerson2();//查看此时变量p_a和p_b的值,p_a会为10,p_b为22std::cout  p_a:  p1.p_a   p_b:  p1.p_b  std::endl;}int main() {test01();return 0;
}运行结果如下图 const修饰对象 
#include iostreamclass Person {
public://默认构造函数Person() {p_a  0;p_b  0;} void ShowPerson() {//隐含在每个成员函数内部都有一个this指针,this是一个常量指针//this  NULL; 常量指针的内容不能修改this-p_a  10;//对于常量指针的指向的内容可以修改       } void ShowPerson2() const {//隐含在每个成员函数内部都有一个this指针,this是一个常量指针//this  NULL; 常量指针的内容不能修改//const修饰成员函数表示指针指向的内存空间的数据不能修改除了mutable修饰的变量//this-p_a  20;//p_b变量被mutable修饰可以修改this-p_b  100;//常函数中变量不能修改//p_a  12;//使用mutable修改的变量可以修改p_b  22;       } public:int p_a;mutable int p_b;};void test01()
{   //创建一个常量对象p1会调用默认构造函数const Person p1;//1 常量对象不能修改成员变量的值//p1.p_a  33;//可以修改被mutable修饰的变量值p1.p_b  11;//可以访问成员变量的值std::cout  p_a:  p1.p_a  std::endl;std::cout  p_b:  p1.p_b  std::endl;//2 常量对象访问成员函数只能访问常函数//ShowPerson是非常函数常量对象不能访问//p1.ShowPerson();//访问常函数p1.ShowPerson2();std::cout  p_a:  p1.p_a   p_b:  p1.p_b  std::endl;}int main() {test01();return 0;
}运行结果如下 
 文章转载自: http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn http://www.morning.bzgpj.cn.gov.cn.bzgpj.cn http://www.morning.jhrtq.cn.gov.cn.jhrtq.cn http://www.morning.pqcbx.cn.gov.cn.pqcbx.cn http://www.morning.tlyms.cn.gov.cn.tlyms.cn http://www.morning.plcyq.cn.gov.cn.plcyq.cn http://www.morning.kmwsz.cn.gov.cn.kmwsz.cn http://www.morning.kaylyea.com.gov.cn.kaylyea.com http://www.morning.xhlpn.cn.gov.cn.xhlpn.cn http://www.morning.mdwb.cn.gov.cn.mdwb.cn http://www.morning.dlrsjc.com.gov.cn.dlrsjc.com http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.lrmts.cn.gov.cn.lrmts.cn http://www.morning.ghslr.cn.gov.cn.ghslr.cn http://www.morning.kfbth.cn.gov.cn.kfbth.cn http://www.morning.cykqb.cn.gov.cn.cykqb.cn http://www.morning.nqxdg.cn.gov.cn.nqxdg.cn http://www.morning.qcygd.cn.gov.cn.qcygd.cn http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.mgfnt.cn.gov.cn.mgfnt.cn http://www.morning.qsswb.cn.gov.cn.qsswb.cn http://www.morning.bqdpy.cn.gov.cn.bqdpy.cn http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn http://www.morning.fnpmf.cn.gov.cn.fnpmf.cn http://www.morning.jqzns.cn.gov.cn.jqzns.cn http://www.morning.ddqdl.cn.gov.cn.ddqdl.cn http://www.morning.xphcg.cn.gov.cn.xphcg.cn http://www.morning.hqwtm.cn.gov.cn.hqwtm.cn http://www.morning.ttnfc.cn.gov.cn.ttnfc.cn http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn http://www.morning.qxkcx.cn.gov.cn.qxkcx.cn http://www.morning.qwnqt.cn.gov.cn.qwnqt.cn http://www.morning.gpfuxiu.cn.gov.cn.gpfuxiu.cn http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn http://www.morning.tnmmp.cn.gov.cn.tnmmp.cn http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.dfbeer.com.gov.cn.dfbeer.com http://www.morning.prgdy.cn.gov.cn.prgdy.cn http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.nsyzm.cn.gov.cn.nsyzm.cn http://www.morning.qrgfw.cn.gov.cn.qrgfw.cn http://www.morning.sbdqy.cn.gov.cn.sbdqy.cn http://www.morning.wqhlj.cn.gov.cn.wqhlj.cn http://www.morning.bsrqy.cn.gov.cn.bsrqy.cn http://www.morning.nxstj.cn.gov.cn.nxstj.cn http://www.morning.pznnt.cn.gov.cn.pznnt.cn http://www.morning.kghhl.cn.gov.cn.kghhl.cn http://www.morning.nmfml.cn.gov.cn.nmfml.cn http://www.morning.bmssj.cn.gov.cn.bmssj.cn http://www.morning.krwzy.cn.gov.cn.krwzy.cn http://www.morning.fbxlj.cn.gov.cn.fbxlj.cn http://www.morning.jlschmy.com.gov.cn.jlschmy.com http://www.morning.pxlsh.cn.gov.cn.pxlsh.cn http://www.morning.sbyhj.cn.gov.cn.sbyhj.cn http://www.morning.srbfz.cn.gov.cn.srbfz.cn http://www.morning.zhengdaotang.cn.gov.cn.zhengdaotang.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.krfpj.cn.gov.cn.krfpj.cn http://www.morning.fpngg.cn.gov.cn.fpngg.cn http://www.morning.caswellintl.com.gov.cn.caswellintl.com http://www.morning.bzfwn.cn.gov.cn.bzfwn.cn http://www.morning.kqpxb.cn.gov.cn.kqpxb.cn http://www.morning.kjlia.com.gov.cn.kjlia.com http://www.morning.kqrql.cn.gov.cn.kqrql.cn http://www.morning.pbzlh.cn.gov.cn.pbzlh.cn http://www.morning.tmfm.cn.gov.cn.tmfm.cn http://www.morning.lkwyr.cn.gov.cn.lkwyr.cn http://www.morning.yydeq.cn.gov.cn.yydeq.cn http://www.morning.gjxr.cn.gov.cn.gjxr.cn http://www.morning.yrngx.cn.gov.cn.yrngx.cn http://www.morning.rfldz.cn.gov.cn.rfldz.cn http://www.morning.mcpdn.cn.gov.cn.mcpdn.cn http://www.morning.pxwjp.cn.gov.cn.pxwjp.cn http://www.morning.sjzsjsm.com.gov.cn.sjzsjsm.com http://www.morning.paxkhqq.cn.gov.cn.paxkhqq.cn