资讯专栏INFORMATION COLUMN

比较C++、Java、Delphi声明类对象时候的相关语法和原理

gaosboy / 1124人阅读

摘要:但是在中就只是声明,但是还没有分配空间,中的才是分配了内存的。对于语言会报错这样是对的详细说明原因只能是或者是没有这个是中的语法,所以要区分和的语法和机制如果用声明了对象会报错这才是正确的语法

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();    //这才是正确的语法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64485.html

相关文章

  • 聊聊Java泛型及实现

    摘要:静态变量是被泛型类的所有实例所共享的。所以引用能完成泛型类型的检查。对于这个类型系统,有如下的一些规则相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。事实上,泛型类扩展都不合法。 前言 和C++以模板来实现静多态不同,Java基于运行时支持选择了泛型,两者的实现原理大相庭径。C++可以支持基本类型作为模板参数,Java却只能接受类作为泛型参数;Java可以在泛型类的方法中取得...

    lewif 评论0 收藏0
  • 秋招——语言篇(C++)

    摘要:语言不支持函数重载,编译后的代码只包含函数名。发布程序无需提供静态库,移植方便。全局和静态变量当且仅当对象首次用到时才进行构造。静态全局变量全局作用域文件作用域,无法在其他文件中使用。求数组数组名数据类型。 ...

    LuDongWei 评论0 收藏0
  • Java 征途:行者地图

    摘要:老实说,当时一进入世界的大门就晕了,各种规范概念和英文缩写词能把人整的晕晕乎乎。等新的英文缩写又出现了,一口老血还没来得及喷出,又重新振作开始新的学习征程。 showImg(http://upload-images.jianshu.io/upload_images/1131767-1c5d16e39435df10.jpg?imageMogr2/auto-orient/strip%7Ci...

    dkzwm 评论0 收藏0
  • 【开发语言】PHP、Java、C语言编译执行过程

    摘要:效率比较低,依赖解释器,跨平台性好语言编译执行过程下面都是鸟哥博客的内容深入理解原理之引擎对这个文件进行词法分析,语法分析,编译成,然后执行。 编译型语言和解释型语言 从PHP,Java和C语言的编译执行过程可以先解释下编译型语言和解释型语言。 编译型语言 程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高...

    gnehc 评论0 收藏0
  • 【开发语言】PHP、Java、C语言编译执行过程

    摘要:效率比较低,依赖解释器,跨平台性好语言编译执行过程下面都是鸟哥博客的内容深入理解原理之引擎对这个文件进行词法分析,语法分析,编译成,然后执行。 编译型语言和解释型语言 从PHP,Java和C语言的编译执行过程可以先解释下编译型语言和解释型语言。 编译型语言 程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高...

    13651657101 评论0 收藏0

发表评论

0条评论

gaosboy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<