C++ 为什么';常数';在这两种情况下表现不同?
我有一个问题,为什么一件事情可以“一步”完成而不能“两步”完成。我有三节课C++ 为什么';常数';在这两种情况下表现不同?,c++,reference,constants,qualifiers,C++,Reference,Constants,Qualifiers,我有一个问题,为什么一件事情可以“一步”完成而不能“两步”完成。我有三节课 class Time { int mTime; int Time::getTimeAsUnix() const {return mTime;} } class Travel { Time mTimestamp; const Time& Travel::getTime() const { return mTimestamp; } Time& Travel::getTime() {
class Time {
int mTime;
int Time::getTimeAsUnix() const {return mTime;}
}
class Travel {
Time mTimestamp;
const Time& Travel::getTime() const { return mTimestamp; }
Time& Travel::getTime() { return mTimestamp; }
}
class Analysis : public Travel {
int Analysis::getUnixTime() const {
// Time& t = Travel::getTime();
// return t.getTimeAsUnix(); // This does NOT compile
return Travel::getTime().getTimeAsUnix(); // This compiles
}
}
有人知道为什么在分析类中,非注释方法会编译,而注释方法会在我尝试时给我一个即时的“c++错误:将'const Time'绑定到'Time&'discards限定符类型的引用”吗
当执行时,这两个不是完全相同的东西吗
Time& t = Travel::getTime();
需要
const Time& t = Travel::getTime();
让它工作。之所以需要这样做,是因为您在一个const限定函数中。在常量限定函数中,类的所有成员都被视为const
。这意味着当您调用getTime
时,您将调用
const Time& Travel::getTime() const { return mTimestamp; }
函数的版本。尝试将
常量时间和分配给时间和将不起作用,因为您将剥离返回类型的常量。在此函数定义中,您应删除分析:
int Analysis::getUnixTime() const {
Time& t = Travel::getTime();
return t.getTimeAsUnix();
}
这就是所谓的函数
const Time& Travel::getTime() const { return mTimestamp; }
返回一个常量引用。之所以使用此重载函数,是因为函数getUnixTime
声明为常量成员函数
但是,常量引用被指定给非常量引用
Time& t = Travel::getTime();
因此编译器发出了一个错误。好的,让我们分析一下工作版本:
int Analysis::getUnixTime() const { // (1)
// (2) --------v v----- (3)
return Travel::getTime().getTimeAsUnix();
}
在(1)
,函数getUnixTime
被定义为处理常量实例。这意味着您只能调用其他常量函数,不能更改任何成员变量
在(2)
,调用了Travel::getTime()
。这将调用一个非静态成员函数,并保留其语法。但这没关系,很清楚,它调用函数的const
版本,返回consttime&
。对常数时间对象的引用
在(3)
,成员函数getTimeAsUnix
在常量时间被调用&
。这非常完美,因为Time
有一个名为that way的成员函数,该函数被标记为处理常量对象
如你们所见,每个对象都是常量,你们只调用常量函数
当你把代码分成两行时,出了什么问题
让我们看一下函数主体中的第一行:
Time& t = Travel::getTime();
如前所述,Travel::getTime()
调用非静态成员函数。由于this
是一个常量对象(您在一个const函数中),因此会像以前一样调用getTime
的const版本
constgetTime
的返回类型是const-Time&
然后执行Time&t=
。这就是你的错误所在<代码>常量时间&
无法修改。可以修改时间&
。如果使用可变引用引用常量对象,则可以对常量对象进行可变。语言禁止这样做
要解决此问题,只需使用常量引用:
const Time& t = Travel::getTime();
您是否尝试过const Time&t=Travel::getTime()代码>相反?我很确定没有编译的行是Time&t=Travel::getTime()代码>因为您所在的方法本身是常量,并且将拒绝调用非常量方法。简而言之,这不是因为您分两步完成,而是因为您显式调用了non-const方法。