《c++对象内存模型》读书笔记
这本书大二第一次接触,刚开始由于功力不够不能很好的消化这本书的内功,多读几遍就会对自己的语言思想有很大的提升。这本书出版很久了,但一直没被淘汰。记录自己的学习笔记,温故知新。
C语言不是面向对象的计算机编程语言,它主要由基本数据类型,struct结构体,和函数,数据块和函数是没有关联的,函数就相当于服务指令,你想加工什么数据,就通过调用函数传人数据参数,从而获得该函数的服务。这样的话当工程很大的时候就就会定义很多的函数很多的结构体,这些结构体和函数根据去功能通过.h .m文件进行划分,成百上千的函数结构体会让头文件的引用变得非常的复杂,从而降低开发效率,和程序设计的难度。
C++是面向对象编程的计算机高级语言,封装,继承,多态。数据块和处理数据块的功能函数就关联起来,以前用文件的形式来划分数据块和函数变成的用类的形式。提高开发效率,用面向对象的程序设计思想来设计程序使得更加的清晰。
对于计算机语言,与其说高级语言牛叉到不如说是编译器牛叉,从本质上来讲,计算机高级语言写出来的源代码都逃不过编译器的掌心,它们都会被编译成对应的CPU指令,对于动态语言无非就是加上一个runtime,既然语言都最后会变成CPU指令,那么计算机语言之间都可以一一对应的关系,那么C++语言编写的程序也无非就是函数的调用,参数的传递,但在语法特性上又存在各自的差异。这就说明了编译器对C++语言做了很多的事。
计算机语言是标准,对应的编译器是标准的实现,编译器越是智能越是强大,它为你做的东西就多,这就为什么java,c#,swift不需要头文件,因为开发环境编译器能动态的检测到你设计的变量和函数,swift甚至不需要main函数,swift是面向对象的语言,如果编译器检测到了函数调用,它就会用这个函数作为main函数作为程序的入口点。
对于不同的书,不同的读者有不同的看法,以下为个人学习记录,不足之处还望见谅。
问题:
1.问什么会有self变量?
2.成员函数和虚函数的区别?
3.为什么虚函数能实现动态调用和多态?
1.c和c++对比
- typedef struct point3d {
- float a;
- float b;
- float c;
- }point3d;
- void printPoint3d(const point3d *pd){
- printf("a= %g,b= %g,c = %g",pd->a,pd->b,pd->c);
- }
- point3d p;
- p.a=4;
- p.b=5;
- p.c=6;
- printPoint3d(&p);
在c语言中我们要完成一个功能函数的调用首先要创建需要的参数,把参数传人到函数中。
- class point3d{
- private:
- float a;
- float b;
- float c;
- public:
- void printPoint3d(){
- printf("a= %g,b= %g,c = %g",a,b,c);
- }
- };
使用时:非虚函数的成员函数在编译时就已经确定它的调用地址,而虚函数的调用是在运行时绑定。
- point3d *p=new point3d();
- p->printPoint3d();
在c++中我们想要对数据块进行操作只需要调用和它包装工能函数就行了,成员变量(data member)可以映射为struct数据块,成员函数 (data function)可以映射为打印功能函数。
2.this的由来
- #include <stdio.h>
- class point3d{
- private:
- float a;
- float b;
- float c;
- public:
- void printPoint3d();
- };
实现文件:
- #include "Point3d.h"
- void point3d::printPoint3d(){
- this->a =1;
- this->b =2;
- this->c =3;
- printf("a= %g,b= %g,c = %g\n",this->a,this->b,this->c);
- }
- #include <iostream>
- #include "Point3d.h"
- int main(int argc, const char * argv[]) {
- point3d *point = new point3d();
- point->printPoint3d();
- return 0;
- }
运行结果:
a= 1,b= 2,c = 3
Program ended with exit code: 0
从上面的例子中我们可以看到成员变量中可以通过this指针使用成员变量。
下面我们来一步一步的分解改例子:
该类经过编译之后就得到:
3.虚函数
- class point3d{
- private:
- float a;
- float b;
- float c;
- public:
- virtual void printPoint3d();
- };
- point->printPoint3d();
4.多态
- class point3d{
- public:
- float a;
- float b;
- float c;
- public:
- virtual void printPoint3d();
- };
class point3d.m
- void point3d::printPoint3d(){
- this->a =1;
- this->b =2;
- this->c =3;
- printf("a= %g,b= %g,c = %g\n",this->a,this->b,this->c);
- }
class point4d.h
- #include <stdio.h>
- #include "Point3d.h"
- class Point4d:public point3d{
- private:
- float d;
- public:
- void printPoint3d();
- };
class point4d.m
- void Point4d::printPoint3d(){
- this->a=1;
- this->b=2;
- this->c=3;
- this->d=4;
- printf("point 4d print :a= %g,b= %g,c = %g ,d= %g\n",this->a,this->b,this->c,this->d);
- }
使用:
- #include <iostream>
- #include "Point3d.h"
- #include "Point4d.h"
- int main(int argc, const char * argv[]) {
- point3d *point = new point3d();
- point->printPoint3d();
- point = new Point4d();
- point->printPoint3d();
- return 0;
- }
运行结果:
- a= 1,b= 2,c = 3
- point 4d print :a= 1,b= 2,c = 3 ,d= 4
- Program ended with exit code: 0