代码是什么:
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 ++很新。我运行这两个代码,我认为没有区别......
答案 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.h
和Time.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),或者它可能是 如果已经定义,则在其类定义之外定义 声明但未在其类定义中定义。