面向对象编程中的类与new关键字

在面向对象的编程中,总是先定义一个类,然后在定义一个对象并用new来构建它.类是抽象的,也就是给编译器看的,编译器照着类的样子在程序中"画"出一个对象.这到也说的过去.但... 在面向对象的编程中,总是先定义一个类,然后在定义一个对象并用new来构建它.
类是抽象的,也就是给编译器看的,编译器照着类的样子在程序中"画"出一个对象.这到也说的过去.
但是,很多时候,构建对象往往是在程序运行时构建的.那么既然说类是抽象的,在内存中并不存在.那应该也不存在于exe文件里面,要是他存在于exe文件里面,那系统加载程序就把它加载进去了,又怎能说在内存中不存在呢。而如果在exe里面不存在,那程序运行的时候又是怎么得知该“类”的大小和数据来构建对象的呢?
而如果在exe里面存在,那么直接调用就行了,为什么还要浪费内存去构建一个副本呢
展开
 我来答
帐号已注销
推荐于2016-09-17 · TA获得超过3954个赞
知道大有可为答主
回答量:1636
采纳率:77%
帮助的人:1242万
展开全部
类是用来定义对象包含哪些数据和支持那些操作,也就是说类规定了对象的内存布局和在这块内存上合法的操作。在编译时如果编译器遇到对象的定义,编译器会根据类的定义为对象分配内存(生成分配内存的机器指令或者汇编指令),如果遇到成员函数调用(或者方法调用)编译器会根据类的定义进行类型检查(检查通过就生成调用函数的汇编代码)。

对象是一个实体或者类的实例,占据着一块内存空间,并且可以对他执行一些操作,你也可以简单理解为对象就是一块内存空间, 分配内存就等于定义对象。

内存如何分配是由类定义来决定的,当遇到对象定义或者new,编译器就根据类的定义直接生成分配内存的汇编指令以及调用构造函数的汇编指令(这些在编译时就可以确定)。C++里面如果在定义的时候找不到类的定义编译器就会报错,因为编译器不知道类对象的内存布局和构造函数。

关于你说的类在不在exe里面,这要看是什么语言!有的语言类型信息只存在于编译时、有的语言的类型信息在运行时也存在。
更多追问追答
追问
我只想知道如果自己做操作系统和编译器,这些东西怎么实现你说的这些木什么用,比如,那个new 操作符你用汇编语言解释一下,分配内存这事情不是操作系统干的吗,不是说每个进程都有固定独立的地址空间吗,既然地址空间都有了,那还需要你分配什么内存?难道你还能动物理内存?这应该是内核才能干的吧
追答
C++代码:

int a;
int b;
int c;
a = 1;
b = 2;
c = 3;
new int[2];
汇编代码:
//push ebp // ebp入栈
//mov ebp, esp // ebp保存栈顶指针
//sub esp, 12 // 为局部变量a、b、c分配12个字节的栈内存
//mov [ebp - 4], 1 // 变量a赋值1
//mov [ebp - 8], 2 // 。。。
//mov [ebp - 12], 3 //。。。
//push 8 // 压入8
//call operator new[] (01F102Fh) // 调用全局new[]函数 分配8个字节的空间。

操作系统是给每个进程创建了一个独立的地址空间,但是这个空间只是你可以引用的地址范围,你在程序里面需要规定那些地址对应的虚拟内存空间用来保存数据(这叫做分配内存),当时实际保存数据的时候,操作系统会将这块虚拟内存对应的页面映射到物理内存。不是给你一个地址范围你就可以随机乱来、随便乱存。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式