C++:这是一个有效的常量成员函数吗?

标签 c++ methods constants member

我目前正在研究 C++ 类(class)。该类的目的是进行一些 http 查询。您创建一个实例指定

  • 目标网址
  • 一些其他参数

使用此实例,您可以调用名为“getChildren”的方法,该方法连接到 HTTP 服务器、执行查询并返回子项列表。所以基本上,它看起来类似于:

class HttpRequest
{
   public:
   // omitted constructor, ...
   const std::list<Child> getChildren() {
      // do the http query
      // build a list
      return(list);
   }
}

“getChildren”返回的列表可能会因每次调用而改变——这取决于在 HTTP 服务器上完成的其他操作。现在你有什么看法:我应该如何声明方法:

  • const std::list<Child> getChildren();
  • const std::list<Child> getChildren() const;

它将以两种方式编译,因为“getChildren”不会修改 HttpRequest。

感谢您的帮助, 乌力

最佳答案

  • const std::list<Child> getChildren();
  • const std::list<Child> getChildren() const;

It will compile in both ways, since "getChildren" doesn't modify HttpRequest.

  1. 不,它不会以两种方式编译。 (如果可以,那会有什么区别?) 需要第二个表格才能调用getChildren()对于 const HttpRequest对象(或引用或指针):

    void f(const HttpRequest& req)
    {
       const std::list<Child>& list = req.getChildren(); // requires const
       // ...
    }
    

    这需要尾随 const .

  2. 顶级const在返回类型 ( const std::list<Child> ) 上没有任何区别。返回的对象是一个右值。您所能做的就是制作拷贝或将其绑定(bind)到 const std::list<Child>& - 不管它是const或不。

  3. 您很可能不想每次都复制这样的列表getChildren()被调用,所以你应该返回一个引用:

    const std::list<Child>& getChildren() const;
    

    (当然,如果涉及异步,您可能想要复制,而不是分发对可能异步更改的对象的引用。)

  4. 您可以根据尾随 const 重载.鉴于此,您可以有两个版本:一个用于更改列表,另一个用于获取 const。列表引用:

    const std::list<Child>& getChildren() const;
          std::list<Child>& getChildren();
    

    我不知道这对您的情况是否有意义。

关于C++:这是一个有效的常量成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7515819/

相关文章:

javascript - 在javascript中声明一个const变量而不进行初始化

c++ - 取消引用迭代器时出现段错误

c++ - Docker 中的 Microsoft 编译器

java - 在自身内部调用方法

Java泛型选择性返回值

ruby-on-rails - 如何在 Rails 3 中汇总记录?

c++ - QPainter 保存状态

c++ - R 包中的 TMB c++ 代码和 CRAN 检查

c++ - QString 到 Const Char*

C:将常量字符串转换为常规字符串