English 中文(简体)
C++与 Java物体模型之间的差异[封闭]
原标题:Differences between the C++ and the Java object model [closed]
Closed. This question needs to be more focused. It is not currently accepting answers.

  1. 在 Java,对物体进行分类非常容易。 在C++中,只要像C 构件(无聚众)一样,就只能安全(?)至memcpy。 在C++中,如果汇编者能够产生违约(三维)复印件,那么它为什么能够产生自动序列化代码?

  2. In Java,只有固定功能和数据成员才能从校长那里获得。 在C++中,我可以习惯使用非法定成员以及由校长履行的职能。

  3. In Java, I can initialize data members inline, in the class. In C++ it is a compile error.

  4. Java 我可以初步确定在座标的<条码>。 在C++中,我不得不在初始化名单中初步确定<条码>。 在C++中,当控制权到达校长的身上时,所有校长都运行了,正确吗?

  5. 在 Java,一位导师可以叫另一名导师。 在C++中,我们不能这样做。

  6. 在 Java,this在轨迹回归后(>this/code>参比,多管齐下。 在C++生效的<条码>。this在C++和在Java都能轻易逃脱:在轨登记尚未制造的物体。

  7. 在 Java,我无法在衍生产品类别中担任私人基础类别的公职。 我惊讶地看到,在C++中,科索沃甚至有用。

是否有任何人对这些差异作出简短的解释?

<>Update>。 收集答案的工作迄今为止已经结束。

  1. 诱杀会有一些类似序列化的支助。 (姓名)

  2. 尽管我说了这一点,但Alf P. Steinbach举了一个有趣的例子。

  3. C++0x支持比C++98更切合实际的初始化。 (Alf P. Steinbach) #3将在C++0x(Ken Chang)中成为法律。

  4. 在施工人员自己的班子中申报的数据成员在施工人S{人}开始执行时得到全面建设。 (c++-faq-lite)

  5. C++0x将使建筑商能够打电话给其他同侪建筑商(Wikipedia, C++0x)

  6. C++03 在其施工者完成执行(Wikipedia)时将考虑建造一个物体。

  7. 出入控制等事项与标本模式没有什么关系:这是入口控制系统的一个特征,是汇编时间特征。 (Yttrill)

最佳回答

在 Java,对物体进行分类非常容易。 在C++中,只要像C 构件(无聚莫法)一样,就只能安全(吗)。

Java是一种解释性的语言(或最近,如《账单评论》汇编的),因此,它别无选择,只能承载方案内每一种数据类型的元托。 在口译、考试和测验、选编和元数据管理之间, Java方案需要大量记忆。 C++是一种汇编的语文, Java的许多决定都是在汇编时间作出一次,元数据是用于解释的序号,以指导日常的序列化。 一般来说,元数据集甚至在汇编时就暴露了,可能是因为不同的编汇商对该方案的模型大不相同,他们没有集体谈判适当的代表。 它还开展了大量工作。 Bjarne Stroustrup有一些关于如何揭露此类信息的文件,但甚至没有为C++0x提供计划。 与此同时,虽然手工标记C++方案能够编订目标,但可促进良好执行。

在 Java,我可以将数据成员定在网上。 在C++中,这是一种汇编错误。

每个C++建筑商都对如何初步确定目标提出了完全独立的看法。 如果是值得的,可将共同施工步骤纳入日常支助工作,但建筑商对此的呼吁仍然明显。 检查分散在班级的各种任务后,就会失去地方性,尽管这肯定是方便的。 这里有许多,我是危险。

Java 我可以初步确定主人的最后成员。 在C++中,我不得不在初始化名单中初步确定召集成员。

这反映了这样一种想法,即组成成员具有其一、唯一价值,而不是从一些不确定或无效的国家过渡到一个初步的国家。

在 Java,一位导师可以叫另一名导师。 在C++中,我们不能这样做。

是的,它有时在C++中没有什么变化,特别是对于需要列入初步设计人名单的参考资料和构思,但你可将其他共同建筑步骤纳入支助职能。 我认为,C++的立场反映了建筑商在建造基地、成员、点工、虚拟发送表格等方面的工作——在机器编码一级不一定能够从另一个建筑商进入一个建筑商,而且只是执行正确的步骤。 可能要求汇编者制作第二版,从其他建筑材料中提用,或打上所谓的建筑商的正确部分,但这种隐蔽的布道。

在 Java,我无法在衍生产品类别中担任私人基础类别的公职。 我惊讶地看到,在C++中,科索沃甚至有用。

鉴于你承认这一点是有益的,也许 Java应该补充。

Could anyone give a short explanation for these differences?

我曾尝试过。

问题回答

其中许多概念包含在设计理念中。

在许多案件中, Java弃了危险或 t的做法,使大部分时间变得毫无意义。 例如,你不能从建筑商那里找一个方法,因为没有保证这些成员在建筑商离开之前就已经开工。 贾瓦试图在施工者完成之前不提及物体。

在C++中,他们一般认为方案管理员知道其行动的所有潜在影响,并让他们做他们想要的一切。

Java也使C落后的兼容性消失,你可以拿到C案卷,将其交给 Java编辑。

其余差异可能仅仅是在 Java和 Java从人与C++存在的问题中汲取一些 st。 在一些情况下,C'syntax或比 Java多功能,因为它们从 Java学到。

他们使用不同的语言。 并且; 时间越短。

被占领土上的产权是混淆不清的。 出入控制等事项与标本模式没有什么关系:这是入口控制系统的一个特征,是汇编时间特征。 标的构造顺序 是标本模型的一部分。 C++和Java之间的主要区别实际上是, Java是收集的垃圾,而C++不是。

另一项核心差异是,Java利用无政府状态进行多变,而C++则使用一个破碎的模板概念:在C++模板中,时间汇编,对目标模型无影响,在 Java多吗morph,围绕C++中称为动态的 cast。

另一个主要核心差别是, Java支持read,而在C++,你必须使用某种图书馆。

等级制度差异也较低: Java的固定打字很少,但基本上是一种动态的语言。 而C++则几乎完全是固定式的语文,但例外情况除外。

Java角:

class Base
{
    public static void say( String s )
    {
        System.out.println( s );
    }

    public void sayHello()
    {
        say( "Base.sayHello says..." );
        say( "Base hello" );
    }

    public Base()
    {
        sayHello();
    }
}

class Derived
    extends Base
{
    private String[] myWords;   // = new String[]{ "Derived", "hello" };

    public void sayHello()
    {
        say( "Derived.sayHello says..." );
        say( myWords[0] + " " + myWords[1] );
    }

    Derived()
    {
        myWords = new String[]{ "Derived", "hello" };
    }
}

class ConsCallDemo
{
    public static void main( String[] args )
    {
        Derived o = new Derived();
    }
}

产出:

Derived.sayHello says...
Exception in thread "main" java.lang.NullPointerException
        at Derived.sayHello(conscall.java:28)
        at Base.(conscall.java:16)
        at Derived.(conscall.java:32)
        at ConsCallDemo.main(conscall.java:41)

问题在于,在 Java,甚至从该案件开始之前,该物体被瞬间引爆。

C++通过在施工和销毁期间积极调整物体类型来防止这一问题。 在C++中,标的为Base>, 标的为Base. 因此,在<代码>Base内,不论实际的瞬时状态,只要物体从<代码>Base上调,即可发出。

举例来说,仅仅将 Java法翻译成C++:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void say( string const& s )
{
    cout << s << endl;
}

class Base
{
public:
    virtual void sayHello() const
    {
        say( "Base::sayHello says..." );
        say( "Base hello" );
    }

    Base()
    {
        sayHello();
    }
};

class Derived
    : Base
{
private:
    vector< string >    words_;

public:
    void sayHello() const
    {
        say( "Derived::sayHello says..." );
        say( words_[0] + " " + words_[1] );
    }

    Derived()
    {
        words_.push_back( "Derived" );
        words_.push_back( "hello" );
    }
};

int main()
{
    Derived o;
}

产出:

Base::sayHello says...
Base hello

在C++中取得“in 预期效应”的一种方式,这也表明如何在 Java(适当)做到这一点:

#include <iostream>
#include <string>
#include <vector>
#include <boost/shared_ptr.hpp>
using namespace std;

void say( string const& s )
{
    cout << s << endl;
}

class Base
{
protected:
    struct Greeter
    {
        typedef boost::shared_ptr< Greeter >    Ptr;

        virtual void sayHello() const
        {
            say( "Base::sayHello says..." );
            say( "Base hello" );
        }
    };

private:
    Greeter::Ptr    greeter_;

public:
    void sayHello() const
    {
        greeter_->sayHello();
    }

    Base( Greeter::Ptr greeter = Greeter::Ptr( new Greeter ) )
        : greeter_( greeter )
    {
        sayHello();
    }
};

class Derived
    : Base
{
protected:
    struct Greeter
        : Base::Greeter
    {
        vector< string >    words_;

        virtual void sayHello() const
        {
            say( "Derived::sayHello says..." );
            say( words_[0] + " " + words_[1] );
        }

        Greeter()
        {
            words_.push_back( "Derived" );
            words_.push_back( "hello" );
        }
    };

public:
    Derived()
        : Base( Greeter::Ptr( new Greeter ) )
    {}
};

int main()
{
    Derived o;
}

产出:

Derived::sayHello says...
Derived hello

关于你的其他要点,在此讨论得太多。 了解C++0x支持比C++98更切合实际的初始化。 而且,你第7点的正式方面有点争议,但对此有缺陷的报告(如《附加说明的参考手册》所述,在标准C++中不允许它,但显然打算在标准C98中允许它,但措辞只是自成不变的。

Cheers & hth.,

约7:

In Java, I cannot make a public function of the base class private in the derived class. I was shocked to see that in C++ is OK and even useful.

如果你能够隐藏一种不会保证你方法的超流层方法,则不能由用户使用。 人们总是可以向上下流,并称出这一方法,因为 Java的所有非静态方法都是作为C++的虚拟方法,实际上将称作你的子级方法。

它将采用静态方法,但我认为,压倒一切的静态方法是一种良好做法。

The need to hide methods in subclasses usually means bad design, but if you really need to, you should throw an exception. The down side of this is that it s runtime, but when a call occurs it WILL crash. Whereas in C++, if you hide a method but cast to the parent class, if its virtual the method will actually get called and if it s statically linked the parent class method will get called, both are probably not what you want.





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...