[英]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之间的唯一区别是相关性 - 如果相关,则概要分析会找到它。
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.