同学们在学习的时候经常会遇到一些问题,C++、Java、Delphi他们到底有什么不一样的呢?今天我们来比较C++、Java、Delphi声明类对象时候的相关语法。希望对大家有帮助!

C++中创建对象的两种语法

在c++的类中,我如果要访问类中的成员变量或函数,有2种方法,第一种就是定义一个一个对象,如:

Class A ...

A aa;

aa.xxx();

另外一种就是

Class B ...

B *aa = new B();

aa->xxx();

Java、C++、Delphi中创建对象

在java中,A a = new A();等同于c++中的 A a;

另外在c++中还有另外一种声明和实例化就是使用指针,如:A* a= new A();,在Java中没有对应的形式,最重要的原因是C++中的这种声明形式的内存是需要程序员手动管理的,但是Java有内存回收机制,不需要程序员关心对象的内存的问题。

上面是从内存回收的角度看,这时候:在java中,A a = new A();等同于c++中的 A a;

但是假如从创建对象的时间来看:在java中,A a = new A();也可以看成等同于c++中的 A *a = New A();

c++中的A a;就已经构造了对象。但是在java中 A a; 就只是声明,但是还没有分配空间,java中的A a = new A()才是分配了内存的。而C++中的A *a;也只是声明了一个指针,但是还没有分配指针,a = new A();才是创建了一个实体,并且另指针a指向这个实体的内存地址!

再说说Delphi,假如有一个类ClassA,然后声明一个对象,代码大概如下:

var

ObjectA: ClassA; //这里只是声明了一个变量名,Delphi中变量名其实就是一个指针,此时并没有分配空间

begin

ObjectA:= ClassA.Create; //这里才是创建了一个内存实体,分配了内存空间,并且令ObjectA指向这块内存地址

//注意这里的语法格式不同于C++的ClassA *ObjectA = new ClassA();

//也不同于Java的ClassA ObjectA = new ClassA();

//注意区别三者的语法格式的不同

end;

在Delphi的面向对象的语法中,要注意理解Delphi对象名与对象实体的本质区别,一个Delphi的对象的对象名其实本质上就是一个指针,指向内存中的对象实体。

C++的静态与动态内存分配

在C++中就非常的灵活,A a;是在栈(stack)上分配空间,是静态的。而A * a= new A;是在堆(heap)上分配空间,是动态的。栈上空间自动回收,堆空间需要程序员手动回收

静态分配内存适合于编译时就已经可以确定需要占用内存多少的情况,而在编译时不能确定内存需求量时可使用动态分配内存;但静态分配内存的运行效率要比动态分配内存的效率要高,因为动态内存分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,如果处理不当容易造成内存泄漏。

动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:

1)不需要预先分配存储空间;

2)分配的空间可以根据程序的需要扩大或缩小。

对于C++语言:

A a =new A(); //会报错

A *a=new A(); //这样是对的

详细说明原因:

//只能是

A a;

//或者是

A *a = new A();

//没有

A a = new A(); //这个是Java中的语法,所以要区分C++和Java的语法和机制

如果用A* a = new A();声明了对象

全选复制放进笔记a.run(); //会报错

a->run(); //这才是正确的语法

http://www.qytang.com/
http://www.qytang.com/cn/list/41/
http://www.qytang.com/cn/list/37/
http://www.qytang.com/cn/list/46/
http://www.qytang.com/cn/page/19.htm
http://www.qytang.com/cn/list/32/
http://www.qytang.com/cn/list/28/
http://www.qytang.com/cn/list/25/

比较C++、Java、Delphi声明类对象时候的相关语法的更多相关文章

  1. java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  2. delphi声明类及其调用方法

    {type放在interface下的uses引用单元下面} 1 // 声明类 type TMyclass = class //注意这里不能加';' 因为这是个整体 data: integer; //类 ...

  3. java笔记--String类对象解析与运用

    --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877236.html "谢谢-- 1.String中的equals和==的 ...

  4. Java反射获取类对象的三种方式

    package demo01; /* * 获取一个类的class文件对象的三种方式 * 1.对象获取 * 2.类名获取 * 3.Class类的静态方法获取 */ public class Reflec ...

  5. java之简单类对象实例化过程

    假设现在有这么一个类: public class Person{ public Person(){} String name = "tom"; int age = 1; int s ...

  6. Objective-C 【类对象及SEL存储方式】

    ------------------------------------------- 类的本质--类对象 一段代码: #import <Foundation/Foundation.h> ...

  7. mfc 类对象数组

    知识点 类对象数组定义 类对象数组初始化 一.类对象数组定义 我们声明类对象数组,与我们申明内置类型数组的形式完全相同. 如: ]; ]; Tdate d[]; 二.类对象数组的初始化 .调用默认构造 ...

  8. java类(Class)的概念;对象的概念,声明类的属性 和方法,局部变量和成员变量,面向对象编程思维,抽象的概念

    类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网 ...

  9. 关于C++类定义中不能声明该类对象,而Java中可以的原因

    相信接触过C++的人,在学习Java的过程当中,会遇到这样一个问题:在Java中常常会在类定义中声明一个该类的对象(例如Person类定义中声明一些叫parents之类的Person对象),但是在C+ ...

随机推荐

  1. jeecg中一对多的关系映射

    1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPositi ...

  2. Charles 协助解决 metaweblog 排序问题

    Charles 是 http代理抓包工具,可有效用于手机客户端网络抓包,详见Charles安装说明.这里使用使用Charles的请求转发功能调试metaweblog的最近博文排序功能. 由于OpenL ...

  3. 部署docker

    部署和开发环境不一样,我们不需要频繁地进入到容器内部,所以一般我们会将代码和环境打包到一块,部署到服务器上 Clone 代码 将项目代码克隆到本地 git clone git@git.coding.n ...

  4. JPA基本介绍以及使用

      JPA即Java Persistence Architecture,Java持久化规范,从EJB2.x版本中原来的实体Bean分离出来的,EJB3.x中不再有实体Bean,而是将实体Bean放到J ...

  5. 【洛谷】P2983 [USACO10FEB]购买巧克力Chocolate Buying(贪心)

    题目描述 Bessie and the herd love chocolate so Farmer John is buying them some. The Bovine Chocolate Sto ...

  6. Long.parseLong(String s) 其中s必须是数字形式的字符串,才能运用该函数转化为长整型。

    public class ConverTo { public static void main(String [] args) { String numberIn =args[0]; convertN ...

  7. Python Twisted系列教程19:改变之前的想法

    作者:dave@http://krondo.com/i-thought-i-wanted-it-but-i-changed-my-mind/  译者: Cheng Luo 你可以从”第一部分 Twis ...

  8. EDMX 残余表信息清理方法

    今天出现的edmx报错,怎么也无法删除的问题,解决了.1.打开edxm2.删除所有表模型3.右键,选择模型浏览器4.在实体类型查看是否还有没有删除的模型如果有,点击删除5.重新生成edxm.解决问题.

  9. C# 命名空间(Namespace)

    命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式.在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突. 也即是不同的命名空间可以有相同的类名

  10. ORA-00600: 内部错误代码, 参数: [qctcte1]

    [情景再现] 生产环境,JAVA程序某功能报错: ORA-00600: 内部错误代码, 参数: [qctcte1], [0], [], [], [], [], [], [] [问题排查] 1.检查Or ...