繁体   English   中英

C ++通过引用返回

[英]C++ Return by reference

说,我有一个返回引用的函数,并且我想确保调用者仅将其作为引用获取,并且不应将其作为副本接收。 这在C ++中可能吗?

为了更清楚。 我有这样的课。

class A
{
private:
    std::vector<int>  m_value;
    A(A& a){ m_value = a.m_value; }

public:
    A() {}
    std::vector<int>& get_value() { return m_value; }
};

int main()
{
    A a;
    std::vector<int> x = a.get_value();
    x.push_back(-1);
    std::vector<int>& y = a.get_value();
    std::cout << y.size();

    return 0;
}

谢谢,高古

通过使类不可复制,您可以为自己的类做所需的事情。

通过将复制构造函数和operator =设置为私有或受保护成员,可以使类不可复制。

class C
{
private:
  C(const C& other); 
  const C& operator=(const C&);

};

这里有一个制作NonCopyable类的好例子,您可以从中为自己的类型派生该类

如果您使用boost,那么也可以使用boost :: noncopyable

替代解决方案:

另一个解决方案是使用void返回类型,并使调用方通过引用传递其变量。 这样,当您获得对调用方对象的引用时,将不会复制任何内容。

如果您的函数返回了对不应复制的对象的引用,则您的函数已经完成了防止复制的操作。 如果其他人调用了您的函数并复制了返回值,则可以

  1. 调用者犯了一个错误 ,因为永远不要复制对象(在这种情况下,返回类型可能一开始就不应该被复制),或者
  2. 调用者无关 ,因为该函数仅一周调用一次 (在这种情况下,您不能尝试破坏调用者的代码 ),或者
  3. 在调用方方面,这是一个相当愚蠢的疏忽 (在这种情况下,将通过分析找到错误)。

对于#1,您可以使用自己的类型返回,也可以使用自己的类型包装任何返回。 请注意,#2和#3之间的唯一区别是相关性 - 如果相关,则概要分析会找到它。

IMO,当您需要引用时,不要通过返回指针来破坏代码。 经验丰富的程序员看到指针后,将立即询问他们是否需要检查NULL返回值,对象是否动态分配,如果是,则由谁负责清理。

如果不能消除需要复制的可能性,也不要盲目地禁止复制返回的任何内容。

最后,这是一个古老的座右铭,C ++继承自C:相信您的用户知道他们在做什么。

在C ++ 11中,可以通过删除复制构造函数来防止调用它:

class A{
    public:
    A(const A&) = delete;
}

这取决于”。 是的,您可以隐藏复制构造函数(和赋值运算符),并且您的对象变为不可复制:

struct foo
{
private:
    foo(const foo&); // dont define
    foo& operator=(const foo&); // dont define
}:

但是,如果您想知道一个特定的功能(即,通常是可复制的,但不适用于该功能),则不会。 实际上,您如何才能处理呼叫者?

const foo& f = get_foo(); // okay, by reference, but...

foo f2 = foo(foo(foo(foo(foo(foo(f)))))); // :[

如果您的呼叫者想做某事,您可以采取多种措施阻止它。

您是否要防止常见的错别字导致大对象被意外复制? 如果是这样,您可以改为通过指针返回。 删除&很简单,但是要从指针复制对象需要花费一些精力。 OTOH,生成的代码将较丑陋,因此是否值得取决于您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM