`

【C++&Java】构造函数的调用点

阅读更多

      程序员往往在new一个对象后,其构造函数就自动调用了。那么,有心的人会问:类的构造函数到底是由谁在何时、何地调用的呢? 其实,在C++或者Java中,构造函数都是由编译器在生成一个对象后,自动在后面插入了一条调用构造函数的指令。详见下述代码。
一、Java实现
//Tree.java
public class Tree
{
     public Tree( int i)
     {
       System. out.println(i);
     }      
}

//Test.java
public class Test
{

       /**
       * @param args
       */
       public static void main(String[] args)
      {
            Tree tree = new Tree(1);

      }
}


//Test.class
// access flags 9
  public static main([Ljava/lang/String;)V
   L0 (0)
    LINENUMBER 11 L0
    NEW com/Tree    //执行 new一个Tree实例的操作
    DUP
    ICONST_1
    INVOKESPECIAL com/Tree.<init>(I)V      //编译器插入一条指令:调用Tree的构造函数,并有参数1传入
    ASTORE 1
   L1 (6)
    LINENUMBER 13 L1
    RETURN
   L2 (8)
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    LOCALVARIABLE tree Lcom/Tree; L1 L2 1
    MAXSTACK = 3
    MAXLOCALS = 2
}

 
二、C++实现
#include <iostream>
using namespace std;

class Xsd
{
int i;
public:
Xsd();
};

Xsd::Xsd()
{
cout<<"hello xsd"<<endl;
}


int main()
{
Xsd* a = new Xsd();

return 0;
}

//main.s
__ZN3XsdC2Ev:
LFB964:
pushl %ebp
LCFI0:
movl %esp, %ebp
LCFI1:
subl $24, %esp
LCFI2: //chentao:执行cout输出
movl $LC0, 4(%esp)
movl $__ZSt4cout, (%esp)
call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
movl $__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, 4(%esp)
movl %eax, (%esp)
call __ZNSolsEPFRSoS_E
leave
LCFI3:
ret
LFE964:
.globl __ZN3XsdC1Ev
.def __ZN3XsdC1Ev; .scl 2; .type 32; .endef
.set __ZN3XsdC1Ev,__ZN3XsdC2Ev
.def ___main; .scl 2; .type 32; .endef
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB966:
pushl %ebp
LCFI4:
movl %esp, %ebp
LCFI5:
andl $-16, %esp
LCFI6:
pushl %esi
LCFI7:
pushl %ebx
LCFI8:
subl $40, %esp
LCFI9:
call ___main
movl $4, (%esp)
LEHB0:
call __Znwj //chentao: new Xsd()
LEHE0:
movl %eax, %ebx
movl %ebx, %eax
movl %eax, (%esp)
LEHB1:
call __ZN3XsdC1Ev //chentao:插入调用构造函数
LEHE1:
movl %ebx, 28(%esp)
movl $0, %eax
addl $40, %esp
popl %ebx
LCFI10:
popl %esi
LCFI11:
movl %ebp, %esp
LCFI12:
popl %ebp
LCFI13:
ret

 

分享到:
评论

相关推荐

    利用JNI实现Java调用C++库

    利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)

    C++/JAVA/C#子类调用父类函数情况总结

    1.构造函数调用 常用初始化列表 或者显示调用 1.1同一个类中构造函数调用构造函数 尽量不要这样做,因为结果不确定!避免麻烦 可以把共用的代码封装成一个私有的成员函数,然后在构造函数内统一调用。 1.2子类...

    建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄。还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。

    还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。 编程环境:vs2010,语言:...

    NDKDemo.zip

    一个NDK案例项目, 包含了Java调用 NDK C++层的几种解决方案( Java调用单个C++文件中的某个方法、某几个方法, Java调用多个C++文件中的某几个方法); ...5.native C++层代码访问Java构造函数;

    C++中的多态与多重继承实现与Java的区别

    多态也即子类对父类成员函数进行了重写 (Override) 后,将一个子类指针赋值给父类,再对这个父类指针调用成员函数,会调用子类重写版本的成员函数。简单的例子: class Parent1 { public: virtual void sayHello...

    构造函数进行分数约分计算

    构造函数2个 一组get方法 一组set方法 方法: -比较两个分数的大小,结果为boolen的值 -对分数进行约分(分子分母同时除以最大公约数) -对两个分数进行通分(先约分) -两个分数相加,结果为不可约数(先通分,然后...

    定义一个圆类circle,它有一个变量radius(半径)。从键盘输入数据,通过构造函数的参数传递给radius,编程计算并输出圆的的周长和面积。但是,必须确保输入的数据不为复数。

    定义一个圆类circle,它有一个变量radius(半径)。从键盘输入数据,通过构造函数的参数传递给radius,编程计算并输出圆的的周长和面积。但是,必须确保输入的数据不为复数。

    用C++编写不能被继承的类

     首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类...

    Javascript 构造函数详解

    在一些面向对象的语言,如Java、C++、PHP中,构造函数是很常见的。在Javascript中构造函数首先是一个普通的函数,它可以使用new 操作符来调用,并生成一个特殊类型的对象。 代码如下: // “Benjamin” is a ...

    C++复习资料之系列

    在一个C++程序中,main函数的位置( c )。 (a) 必须在程序的开头 (b) 必须在程序的后面 ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) ...

    Java版水果管理系统源码-c-plus-Interview:c-plus-面试

    构造函数可以使用virtual修饰吗(头条) C++ 拷贝构造函数 如何禁用 什么时候要重载拷贝构造函数?(聊了以后发现他的意思是重写overriding) 构造函数的种类 构造函数的常用场景 构造函数和=运算符的区别 拷贝构造...

    visual c++考试大纲

    2.数据的输入与输出,输入输出函数的调用。 3.复合语句。 4.goto语句和语句标号的使用。   (四)选择结构程序设计 1.用if语句实现选择结构。 2.用switch语句实现多分支选择结构。 3.选择结构的嵌套。   (五)...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    jna调取dll示例demo

    java后端springBoot框架使用jna调取C语言的dll接口(停车场道闸接口) 包含构造体的调用, 回调函数的调用,JNA和C / C ++的数据类型映射,Pointer类型的使用

    java开源包1

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    Effective C++ 中文版

    条款09:绝不在构造和析构过程中调用Virtual函数 条款10:令Operator=返回一个referenceto this 条款11:在Operator=中处理“自我赋值” 条款12:复制对象时勿忘其每一个成分 3.资源管理 条款13:以对象管理...

    java开源包4

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包101

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

Global site tag (gtag.js) - Google Analytics