3、搞清楚成员函数和成员变量是否都是隶属于具体对象
从面向对象的角度看,对象由属性(成员变量)和方法(成员函数)构成
从程序运行的角度来看,对象由数据和函数构成,而数据可以位于栈、堆、全局数据区;而函数只能位于代码段,而代码段是只读的,在程序运行过程中是不可以被改变的,而对于数据来说,他们处于栈、堆,是可以动态的创建和动态的删除;
4、this指针
不知大家是否注意到在拷贝构造函数里面的这条语句,参数里面是引用,那么t也相当于是一个对象,所以会有t.mi这样的写法,这里要明白:
Test(const Test& t) { mi = t.mi; }
所以这里我就引出了this指针,他表示方法中的隐藏参数代指当前对象,为了说明这个,下面我们来看一个代码示例:
#include <stdio.h>
class Test{ int mi;public: int mj; Test(int i); Test(const Test& t); int getMi(); void print();};
Test::Test(int i){ mi = i;}
Test::Test(const Test& t){ mi = t.mi;} int Test::getMi(){ return mi;}
void Test::print(){ printf("this = %p", this);}
int main(){ Test t1(1); Test t2(2); Test t3(3); printf("t1.getMi() = %d", t1.getMi()); printf("&t1 = %p", &t1); t1.print(); printf("t2.getMi() = %d", t2.getMi()); printf("&t2 = %p", &t2); t2.print(); printf("t3.getMi() = %d", t3.getMi()); printf("&t3 = %p", &t3); t3.print(); return 0;}
输出结果:
root@txp-virtual-machine:/home/txp# ./a.outt1.getMi() = 1&t1 = 0x7ffec3f5e750this = 0x7ffec3f5e750t2.getMi() = 2&t2 = 0x7ffec3f5e758this = 0x7ffec3f5e758t3.getMi() = 3&t3 = 0x7ffec3f5e760this = 0x7ffec3f5e760
分析:
在类的成员函数当中,有一个隐含的参数,就是我们刚才说的this指针,它的值就是调用这个函数所对应的对象的地址,说白了,this指针指向当前对象。
每一个对象都有一套自己的成员变量,对象和对象之间的成员变量是独立的、不同的;但是每一个对象都共享一个类的成员函数
三、总结:
对象的析构顺序与构造顺序相反
const 关键字能够修饰对象,得到只读对象
只读对象只能调用 const 成员函数
所有对象共享类的成员函数
隐藏的 this 指针用于表示当前对象
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流活动,一起进步。我是txp,下期见!