`

【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

 

分享到:
评论

相关推荐

    聚合中类的构造函数调用顺序

    在这个主题中,“聚合中类的构造函数调用顺序”是一个关键概念,尤其是在多层嵌套的对象创建时。理解这个顺序对于编写健壮、无错误的代码至关重要。 首先,让我们明确构造函数的作用。构造函数是类的一个特殊方法,...

    Android中C/C++调用Java代码

    在获取了Java类的句柄和构造函数的句柄后,我们可以实例化Java类,然后调用Java类的成员函数。例如: ```c jstring JNICALL Java_com_hm_hello_CActivityMain_stringFromJNI(JNIEnv* env, jobject){ jstring str; ...

    构造函数与静态块的执行顺序

    在Java中,如果子类没有显式地调用父类的构造函数,那么会默认调用父类的无参构造函数。 通过分析给定的代码示例,我们可以清晰地看到这一执行顺序: ```java // Person类的静态块 thisisperson'sstatic // ...

    C++ 调用javaWebService接口代码

    5. **调用服务**:使用生成的C++接口函数,按照WSDL定义的参数类型和结构,构造请求并发送给Java WebService。等待响应,并解析返回的数据。 6. **错误处理**:处理可能出现的网络错误、解析错误或其他异常情况。 ...

    面向对象-构造函数-调用&内存图解

    总结来说,"面向对象-构造函数-调用&内存图解"涵盖了构造函数在对象创建过程中的角色,以及构造函数调用如何影响内存分配和对象实例化。理解这些概念对于编写高效、健壮的面向对象代码至关重要,特别是在处理大量...

    C++代码转java工具

    3. **结构转换**:处理C++的类和对象到Java的类和对象的转换,包括构造函数、继承、多态等面向对象特性。 4. **异常处理**:将C++的错误处理机制(如返回错误码)转换为Java的异常处理机制。 5. **内存管理**:C++...

    java构造函数及相关知识[借鉴].pdf

    Java构造函数是编程中至关重要的概念,特别是在面向对象编程中。它们主要用于初始化新创建的对象的状态。构造函数在类中定义,其名字与类名完全相同,并且没有返回类型,连void也不包含。当通过`new`关键字创建一个...

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

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

    在C或C++中调用JAVA方法

    this("缺省构造函数"); } public Demo(String msg) { System.out.println("&lt;init&gt;:" + msg); this.msg = msg; this.counts = null; } // 省略其他方法... } ``` 在C/C++中调用这些Java方法时,我们需要...

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

    1. **构造函数调用**: - **隐式调用**:如果基类有默认构造函数,子类在不显式指定的情况下会隐式调用它。 - **显示调用**:通过初始化列表`BaseClass(param)`在子类构造函数中显式调用基类的特定构造函数。 ...

    C++和Java多态的区别

    - **性能考量**:C++中的虚函数调用可能会导致额外的间接寻址开销,而Java中的方法调用由JVM优化处理,可能通过内联等技术减少调用成本。 - **语法糖**:Java提供了更多语法上的支持来简化多态的使用,如接口和抽象...

    参数传递的总结——构造函数

    这通常通过`super`关键字(在Java中)或直接调用父类的构造函数(在C++中)实现。 总之,参数传递在构造函数中扮演着关键角色,它影响着对象的初始化过程。理解并掌握各种参数传递方式的差异和应用场景,能帮助我们...

    NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例

    4. **调用Java方法**:有了方法ID,就可以通过`env-&gt;CallObjectMethod`、`env-&gt;CallVoidMethod`等函数调用Java的构造方法或方法。 关于调用Java构造方法,你可以这样做: ```c++ jclass javaClass = env-&gt;FindClass...

    java kok 构造与析构函数

    在Java编程语言中,"构造函数"和"析构函数"是两个关键概念,它们在对象的生命周期管理中起着至关重要的作用。首先,我们来深入理解这两个概念。 构造函数,顾名思义,是在创建类的对象时被调用的特殊方法。它的主要...

    C++箴言:避免析构函数调用虚函数[归类].pdf

    在C++编程中,有一条重要的原则是避免在构造函数或析构函数中调用虚函数。这条箴言尤其对那些从C#或Java转向C++的开发者来说可能显得有些反直觉,因为在这些语言中,这样的调用通常是允许的。然而,在C++中,这样做...

    JAVA如何调用dll:用JNI调用C或C++动态联接库

    总结来说,调用C或C++ DLL文件的主要步骤包括:准备DLL和JNative库,编写Java代码,使用JNative对象创建函数调用,并设置参数及返回值类型。最后,通过`invoke`方法执行函数并处理返回值。这种方法使得Java程序能够...

    java PHP c++ 证书调用事例(微信支付)

    "java PHP c++ 证书调用事例(微信支付)"这个主题涉及到的是如何在不同编程语言环境下,如Java、PHP和C++,安全地调用微信支付的API进行支付操作。微信支付作为一个广泛使用的移动支付平台,它的API调用通常需要...

    c,c++,java笔试题大全

    - **类与对象**:类的定义、对象的创建、构造函数、析构函数。 - **模板**:函数模板、类模板,以及模板特化。 - **STL(Standard Template Library)**:容器(如vector、list、set)、算法(如排序、查找)和...

Global site tag (gtag.js) - Google Analytics