gpt4 book ai didi

C++ 通过引用返回和通过常量引用返回值被复制

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:19 26 4
gpt4 key购买 nike

我有一些关于返回类成员变量引用的问题。

我有以下代码:

#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);
}
};
  1. 我注意到如果我这样做:

    std::set<uint32_t> returned = test.GetValues ();

    变量returned得到一份拷贝,而不是引用,为什么?

  2. const std::set<uint32_t> & GetValues () const函数必须包含双const (返回值上的那个和函数名后面的那个)?

编辑:其他问题:

  1. 知道 std::set<uint32_t> returned = test.GetValues ();创建一个拷贝。如果我这样做:

    test.GetValues ().size ();

    为了调用size ()函数(或返回对象的任何其他成员),是临时创建的拷贝还是全部由返回的引用解析?

  2. 按值返回、按常量引用和按引用返回三个函数不好吗?

    // 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;
    }

最佳答案

The variable returned gets a copy, not a reference, why?

例如,当您使用引用来初始化类型不是引用的值时,您会得到一个拷贝

#include <cassert>

int main() {
int a = 1;
const int& a_ref = a;
int b = a_ref;
assert(&b != &a);
}

Does the const std::set<uint32_t> & GetValues () const function must contain the double const

第二个 const 作为成员函数限定符应用,这意味着当您的类的调用实例被 const 限定时,可以调用该方法。例如

Test test;
test.GetValues(); // 1
const Test& test_ref = test;
test_ref.GetValues(); // 2

在这里1将调用非常量版本和 2将调用以 const 限定的方法

进一步const限定方法不会让您返回对其自身值的非常量引用,因此您必须返回 const。引用您的成员变量 m_values .

因此,如果您包括第二个 const那么你必须包括第一个 const ,但是,如果您只是将返回类型设置为 const引用那么你不需要制作方法const .例如

const std::set<uint32_t>& GetValues() // 1
std::set<uint32_t>& GetValues() { return m_values; } // 2

在这里1是允许的,但 2不允许。

如果您好奇的话,之所以会发生这种情况,是因为隐含的 this指针是 const有资格成为指向 const 的指针在const合格的方法。


In order to call the size () function (or any other member of the returned object), is a copy created temporarily or all is resolved with the returned reference?

size()方法将在引用上调用!测试此类事物的最佳方法是在快速测试用例中进行尝试 https://wandbox.org/permlink/KGSOXDkQESc8ENPW (请注意,我已经使测试比演示所需的复杂一点)

Is it bad to have three functions, return by value, by const-reference and by reference?

如果您将用户暴露给可变引用,那么让他们制作拷贝(这就是为什么您使用按值)方法的最佳方法是让他们通过初始化非引用自己制作拷贝合格set使用返回的引用(就像你最初做的那样)

同样在您的代码中,以下两种方法之间存在歧义

std::set<uint32_t> GetValues() const
const std::set<uint32_t>& GetValues () const

因为唯一不同的是返回类型,and you cannot overload a function off the return type .

关于C++ 通过引用返回和通过常量引用返回值被复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44837459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com