zoukankan      html  css  js  c++  java
  • 关于C++类定义中不能声明该类对象,而Java中可以的原因

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

    例如,在C++中,如下的代码会出错:

    class A
    {
        private:
            A a;
    };

    而在Java当中,这样一段代码可以却可以使用:

    class B{
        private B b;
    }

    要理解这样一个问题,首先要知道的是,在Java中,只有基本数据类型和引用数据类型。对于一个类对象,都是使用引用的概念。而Java的引用和C++的引用是不同的,具体内容可以参考这篇博客 https://blog.csdn.net/WaitForFree/article/details/51030013 。

    C++中的引用更像是一种“别名”(实质上是个指针常量),例如: Test & test2 = test1 ,test2就可以访问和修改test1内存中存储的内容。当改变test2的值时,改变的是存储在test1内存中的值。

    Java中的引用实际上是一种隐藏的指针,例如:Test test2 = test1,这样的语句只是声明了一个名叫test2的引用,并将这个引用指向test1,可以通过test2这个名称访问test1内存中的值。但当改变test2的值时,是将test2这个引用指向一个新的位置,这一点类似于C++的指针。

    在上面两段代码中,C++ 的A a是声明了一个A类对象,并为这个对象分配了内存空间,这就造成了无限递归创建对象,不停的分配内存空间,最后堆栈溢出。

    而Java中引用数据类型的声明和分配内存是分开的,B b只是声明了B类的一个引用,并没有为它指定一个内存空间,因此不存在无限递归分配空间的问题。

    而C++中的指针可以将声明和内存分配分开,因此,如果将上面那段C++代码改成指针形式,则不会出现问题:

    class A
    {
        private:
            A *a;
    };

    当然,如果在类声明中将指针指向new A()的内存空间,则还会出现堆栈溢出的问题。

    同理,如果在Java中,为B的对象b new一个内存空间就会出错,此时Java会抛出一个异常。

    class B{
        private B b = new B();
    }

    所以,不论是Java还是C++,在实际使用过程中,如果想要在类定义中声明该类的一个对象,则应该使用引用/指针,且不能分配内存,否则在定义中无限递归分配内存会造成堆栈溢出的问题。

  • 相关阅读:
    从零开始webpack4.x(十)区分不同环境
    从零开始webpack4.x(九)watch、resolve、小插件、跨域问题、环境变量
    从零开始webpack4.x(八)配置source-map
    从零开始webpack4.x(七)图片处理及打包文件分类
    浏览器:输入url,到页面加载的过程
    从零开始webpack4.x(六)全局变量引入
    JS 闭包
    PHP 回调函数call_user_func和 call_user_func_array()的理解
    面试总结之谈谈你对面向对象的理解
    maven私有库配置
  • 原文地址:https://www.cnblogs.com/ssjxx98/p/12307193.html
Copyright © 2011-2022 走看看