C++ C++;通过引用返回
比方说,我有一个返回引用的函数,我想确保调用方只将其作为引用获取,而不应将其作为副本接收。 C++中是否可能? 为了更清楚。我有一节这样的课C++ C++;通过引用返回,c++,reference,C++,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; }
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;
}
A类
{
私人:
std::向量m_值;
A(A&A){m_值=A.m_值;}
公众:
A(){}
std::vector&get_value(){return m_value;}
};
int main()
{
A A;
std::vector x=a.获取_值();
x、 推回(-1);
std::vector&y=a.get_value();
std::cout通过使类不可复制,您可以为自己的类执行所需的操作
通过将copy构造函数和operator=作为私有或受保护的成员,可以使类不可复制
class C
{
private:
C(const C& other);
const C& operator=(const C&);
};
这里有一个很好的例子,可以为您自己的类型生成一个
如果您正在使用boost,也可以使用
Alt解决方案:
另一种解决方案是使用void返回类型,并使调用方通过引用传递其变量。这样,当您获得对调用方对象的引用时,将不会进行复制。通过使类不可复制,您可以为自己的类执行所需操作
通过将copy构造函数和operator=作为私有或受保护的成员,可以使类不可复制
class C
{
private:
C(const C& other);
const C& operator=(const C&);
};
这里有一个很好的例子,可以为您自己的类型生成一个
如果您正在使用boost,也可以使用
Alt解决方案:
另一种解决方案是使用void返回类型,并使调用者通过引用传递其变量。这样,当您获取对调用者对象的引用时,将不会进行复制。这取决于“情况”。是的,您可以隐藏复制构造函数(和赋值运算符),并且对象将变得不可复制:
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)))))); // :[
如果您的调用者想要执行某项操作,您无法做很多事情来阻止它。这“取决于”。是的,您可以隐藏复制构造函数(和赋值运算符),并且您的对象将变得不可复制:
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,生成的代码会更难看,因此这取决于您是否值得。您是否试图防止导致意外复制大型对象的常见打字错误?如果是,您可以通过指针返回。取消&
非常简单,但从指针复制对象需要一点努力。OTOH生成的代码会更难看,因此这取决于您是否值得。如果您的函数返回对不应该复制的对象的引用,那么您的函数已经做了可以防止复制的事情。如果其他人调用您的函数并复制返回值,则
这是调用者所犯的一个错误,因为对象永远不应该被复制(在这种情况下,返回类型可能一开始就不应该被复制),或者
这与调用方无关,因为函数一周只调用一次(在这种情况下,您不能试图破坏调用方的代码),或者
对调用方来说,这是一个相当愚蠢的疏忽(在这种情况下,将通过分析发现错误)
对于#1,要么你返回自己的类型,要么你可以用自己的类型包装你的任何返回。请注意#2和#3之间的唯一区别是相关性-如果相关,分析将找到它
在我看来,当你需要的是引用时,你不应该通过返回指针来破坏你的代码。有经验的程序员看到指针后,会立即询问他们是否需要检查NULL
返回值,对象是否是动态分配的,如果是,谁负责清理它
如果你不能消除需要复制的可能性,你也不应该盲目地禁止复制你返回的任何东西
<> P>最后,这是一个古老的座右铭,C++继承了C:信任用户知道他们在做什么。 < P>如果你的函数返回了一个不应该被复制的对象的引用,那么你的函数已经做了它可以做的来防止复制。如果有人调用你的函数并复制返回值,那么/p>
这是调用者所犯的一个错误,因为对象永远不应该被复制(在这种情况下,返回类型可能一开始就不应该被复制),或者
这与调用方无关,因为函数一周只调用一次(在这种情况下,您不能试图破坏调用方的代码),或者
对调用方来说,这是一个相当愚蠢的疏忽(在这种情况下,将通过分析发现错误)
对于#1,要么你返回自己的类型,要么你可以用自己的类型包装你的任何返回。请注意#2和#3之间的唯一区别是相关性-如果相关,分析将找到它
在我看来,当你需要的是引用时,你不应该通过返回指针来破坏你的代码。有经验的程序员看到指针后,会立即询问他们是否需要检查NULL
返回值,对象是否是动态分配的,以及