1

我有以下类声明,根据我所学到的与 const 成员函数相关的内容,const 对象不能调用非 const 成员函数。在 range-for 循环中,我们使用的是“const auto animal”,假设它使用了一个 const 对象,所以我认为 const 对象在调用非 const 成员函数 speak() 时应该给出编译错误,但是它实际编译,为什么?,也许我不清楚 range-for 循环是如何工作的......谢谢!

#include <iostream>
#include <string>

class Animal {
protected:
     std::string name_;
     std::string speak_;
public:
    Animal(const std::string &name, const std::string &speak) : name_(name), speak_(speak){}
    const std::string &getName() const  { return name_;}
    std::string speak()  { return speak_;}
};

class Cat : public Animal{
public:
 Cat(const std::string &name) : Animal(name, "meow"){}
};

class Dog : public Animal{
public:
 Dog( const std::string &name) : Animal(name, "woof"){}
};

int main() {
    Cat tom{ "tom" };
    Dog felix{ "felix" };

    Animal *animals[]{ &tom, &felix};
     for (const auto &animal : animals)
         std::cout << animal->getName() << " says " << animal->speak() << '\n';


    return 0;
}
4

1 回答 1

6

这里const auto&成为对类型变量的 const 引用Animal*。这意味着您不能更改指针指向的位置,但指向的值本身仍然是可变的。

更换 auto 看起来像:

for (Animal* const& animal : animals)
  // ...
于 2019-12-23T22:35:07.167 回答