一些构造函数代码之间的C ++差异

时间:2014-11-14 02:18:28

标签: c++

代码是什么:

class Time {
    private:
        int hours;
        int minutes;
        int seconds;
    public:
        Time() { hours = 0; minutes = 0; seconds = 0; }
};

与以下不同:

class Time {
    public:
        Time();

    private:
        int hours;
        int minutes;
        int seconds;
};

Time::Time() {
    hours = 0;
    minutes = 0;
    seconds = 0;            
}

很抱歉,如果问题过于简单,但我对C ++很新。我运行这两个代码,我认为没有区别......

4 个答案:

答案 0 :(得分:1)

class Time {
    private:
        int hours;
        int minutes;
        int seconds;
    public:
        Time() { hours = 0; minutes = 0; seconds = 0; }
};

此代码声明并定义Time类的默认构造函数。

class Time {
    public:
        Time();

    private:
        int hours;
        int minutes;
        int seconds;
};

Time::Time() {
    hours = 0;
    minutes = 0;
    seconds = 0;            
}

此代码在类定义中声明Time类'默认构造函数,然后在类定义之外定义它。通常情况下,这两者会分为Time.hTime.cpp,如下所示:

<强> time.h中

class Time {
    public:
        Time();

    private:
        int hours;
        int minutes;
        int seconds;
};

<强> Time.cpp

#include "Time.h";

Time::Time() {
    hours = 0;
    minutes = 0;
    seconds = 0;            
}

答案 1 :(得分:1)

从功能上讲,你所看到的,没有区别。两者都会做同样的事情。

现在,如果您不熟悉编程,不确定是否理解实际差异,但是,汇编代码存在差异,它没有更高级别的方法或非全局变量。

第一个是内联的,这意味着你在汇编代码中执行Time timeObj的任何地方,你实际上都会在那里放置内联代码。这就像下面发生的那样。请注意,在您的代码中,它将无法编译。

Time timeObj;
timeObj.hours = 0;
timeObj.minutes = 0;
timeObj.seconds = 0;

在你的例子中,这很好,因为它很简单。但是,在更复杂的类中,您可以为您创建该对象的新版本的每个位置添加几百行,这会使代码更长,效率更低。

第二个定义为非内联,这意味着每次创建Time对象时,汇编代码将跳转到代码中的其他某个点,执行代码,然后跳回。同样,您实际上无法执行以下操作,但它与发生的情况类似。

Time timeObj;
timeObj.Time();

这是解释它的一种非常基本的方式,如果它没有意义,那就不要过多地关注它了。一般来说,内联定义很好,如果它们只是几行简单的代码,就像你的那样。但任何更长的时间都不应该作为内联函数实现。

顺便说一句,通过执行以下操作,您可以使您的内联版本更加出色:

Time() { hours = minutes = seconds = 0; }

答案 2 :(得分:1)

可能是offtopic,但我相信在初始化列表中这样做是个好习惯。对于原始类型,如果你有对象成员,这将不会产生影响。

Time() 
    : hours(0)
    , minutes(0)
    , seconds(0) {}

答案 3 :(得分:0)

如果你运行代码,他们会做同样的事情。

但是在第1版中,默认的ctor将成为内联函数,因为它是在类中定义的。

根据工作草案标准,[class.mfct](N3337中的9.3 / 2)

  

可以在其类定义中定义成员函数(8.4)   在哪种情况下,它是内联成员函数(7.1.2),或者它可能是   如果已经定义,则在其类定义之外定义   声明但未在其类定义中定义。