Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';常数';在这两种情况下表现不同?_C++_Reference_Constants_Qualifiers - Fatal编程技术网

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版本

const
getTime
的返回类型是
const-Time&

然后执行
Time&t=
。这就是你的错误所在<代码>常量时间&
无法修改。可以修改
时间&
。如果使用可变引用引用常量对象,则可以对常量对象进行可变。语言禁止这样做

要解决此问题,只需使用常量引用:

const Time& t = Travel::getTime();

您是否尝试过
const Time&t=Travel::getTime()相反?我很确定没有编译的行是
Time&t=Travel::getTime()因为您所在的方法本身是常量,并且将拒绝调用非常量方法。简而言之,这不是因为您分两步完成,而是因为您显式调用了non-const方法。