我目前正在研究 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.
不,它不会以两种方式编译。 (如果可以,那会有什么区别?) 需要第二个表格才能调用
getChildren()
对于const HttpRequest
对象(或引用或指针):void f(const HttpRequest& req) { const std::list<Child>& list = req.getChildren(); // requires const // ... }
这需要尾随
const
.顶级
const
在返回类型 (const std::list<Child>
) 上没有任何区别。返回的对象是一个右值。您所能做的就是制作拷贝或将其绑定(bind)到const std::list<Child>&
- 不管它是const
或不。您很可能不想每次都复制这样的列表
getChildren()
被调用,所以你应该返回一个引用:const std::list<Child>& getChildren() const;
(当然,如果涉及异步,您可能想要复制,而不是分发对可能异步更改的对象的引用。)
您可以根据尾随
const
重载.鉴于此,您可以有两个版本:一个用于更改列表,另一个用于获取const
。列表引用:const std::list<Child>& getChildren() const; std::list<Child>& getChildren();
我不知道这对您的情况是否有意义。
关于C++:这是一个有效的常量成员函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7515819/