"成员变量的秘密"的笔记

什么是学习笔记?

你在学习中想写的批注、摘抄及随感。
成员变量的秘密, 《课时6 成员变量的秘密》 在我们的程序里面,我们由字段 Fields 也就是成员变量,有参数 parameters, 有本地变量 local variables。 parameters 和 local variables的属性都是一样的,它们都被放在一个stack堆栈里面,但它们的具体位置是不同。 字段处于哪里呢? 声明的时候我们不知道字段在哪里,编译器只知道有一个成员变量。 声明 和 定义不一样哦!!! 类的声明我们给出了成员变量和成员函数,在类的所有成员函数里面,我们可以自如使用成员变量,不需要考虑它们在哪里,真好。 class A { private: int i; // 把类比作源文件的话,成员变量对成员函数的关系,就相当于源文件里面的全局变量的对普通函数的关系,它告诉了编译器,我在,直接用! public: void f(); }; void A::f() { i = 20; cout << i << endl; } int main() { A a; B b; cout << a.i; a.f(); b.f(); } 这个类知识声明了成员变量而已,类是人类的一种概念性的东西,不具有内存属性。 如果 成员变量 的属性是 public,就可以直接通过对象来调用。 但是,函数是属于类的啊! 结构体做函数参数时,我们传递的是结构体指针,->取成员符号。 a.f(); 让 a 对象做函数 f(), 然后我们到了 f() 函数里面,那里面使用的 成员变量就是 a 对象的变量实体啊!不就是类似 普通函数 对结构体指针的调用吗! 也就对象啊,让成员函数来调用它的数据/属性,而C语言里面则是函数调用对象,这就是 两者的思维差别,导致了程序结构的差别,当然了最后的结果都是一样,没什么区别。 类的不同对象,调用的是同一个函数,就好比张三、李四、王五三个人类的不同对象,它们的眼睛、耳朵、鼻子等等数据都不相同,但是看、听、说、感受这些对数据的处理方法,也就是函数都是相同的,这些方法都属于人类。 倘若你用过程性来思考,那么就分割了对象,只考虑的动作,这样就没有通用性了! 比如 张三.哭(); // 张三用自己的成员变量眼睛来执行人类的哭的成员函数。 哭是 class 人{}的成员函数,张三是对象 从这里可以看出,物件导向其实做的事情是对函数的封装,而对象则是对函数的二次分类封装。 成员函数其实是类域的全局函数,而成员变量是对象的结构体,把对象结构的指针传递给全局成员函数,这就是OOP对C干的事情。所以成员函数实际上在C语言的层面是有参数的,就是调用它的对象的结构体指针而已。 比如: void A::f(A* p) // 注意括号里面的参数,也就是A类其实就是结构体类型,而对象名其实就是结构体A定义的一个结构体,所以有 a.i 的写法,但我门也发现了,C++ 里面这个结构的数据它做了分类,这也是符合对象特点的啊! { cout << p->i << endl; p->i = 20; cout << p->i << endl; } 在C++里面同样可以使用C的库函数,因为编译后还是会转成C程序,但是不要在一个程序里面同时使用C和C++的输入输出函数。 对象里面只有成员变量,没有其他东西,这是C++的安排,不同对象有不同的地址。 函数会知道是哪个对象调用的,至于怎么做到的呢? 背后有一个黑手 this:the hidden parameter 。this 是一个隐藏参数,所有的成员函数都有一个this指针,它的类型就是类 void Point::print() 其实就是: void Point::print(Point *p) // this 就是对象指针,p是形参 this是配合对象调用的,i 就是 this->i ,当然了不同的this又是如何区分的呢?学习编译原理可能会懂哈。 this是一个自然生成的本地变量,属于每个成员函数。, http://img0.ph.126.net/Ue88PcI5bIjV7zZXVOka8Q==/6619106178700075365.jpg