Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过引用返回_C++_Reference - Fatal编程技术网

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

比方说,我有一个返回引用的函数,我想确保调用方只将其作为引用获取,而不应将其作为副本接收。 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;
}
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
    返回值,对象是否是动态分配的,以及