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