我对返回类成员变量的引用有一些疑问。
我有以下代码:
#include <stdint.h>
#include <string>
#include <iostream>
#include <set>
void
PrintSet (const std::string & str, const std::set<uint32_t> & to_print)
{
std::cout << str << " (" << to_print.size () << "): ";
for (std::set<uint32_t>::const_iterator it = to_print.begin ();
it != to_print.end (); ++it)
{
std::cout << *it << " ";
}
std::cout << "\n";
}
class Test
{
private:
std::set<uint32_t> m_values;
public:
Test () : m_values () { }
void
SetValues (const std::set<uint32_t> & values)
{
m_values = values;
}
const std::set<uint32_t> &
GetValues () const
{
return m_values;
}
std::set<uint32_t> &
GetValues ()
{
return m_values;
}
void
Print () const
{
PrintSet ("TestInst", m_values);
}
};
我注意到如果我这样做:
std::set<uint32_t> returned = test.GetValues ();
变量
returned
得到一个副本,而不是一个引用,为什么?const std::set<uint32_t> & GetValues () const
函数是否必须包含双精度const
(返回值上的一个和函数名后面的一个)?
编辑:附加问题:
知道这
std::set<uint32_t> returned = test.GetValues ();
会创建一个副本。如果我这样做:test.GetValues ().size ();
为了调用
size ()
函数(或返回对象的任何其他成员),是临时创建一个副本还是全部使用返回的引用解析?拥有三个函数,按值返回、按常量引用和按引用返回是不是很糟糕?
// Return by value std::set<uint32_t> GetValues () const { return m_values; } // Return by const-reference const std::set<uint32_t> & GetValues () const { return m_values; } // Return by reference std::set<uint32_t> & GetValues () { return m_values; }