Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++,有以下的类… class Client { public: Window getWindow() { return window; }; private: Window window; };_C++_Pointers - Fatal编程技术网

C++;通过成员字段 这是一个愚蠢的简单问题,我正在学习C++,有以下的类… class Client { public: Window getWindow() { return window; }; private: Window window; };

C++;通过成员字段 这是一个愚蠢的简单问题,我正在学习C++,有以下的类… class Client { public: Window getWindow() { return window; }; private: Window window; };,c++,pointers,C++,Pointers,我想知道的是getWindow()会返回对我的私有window对象的引用还是一个副本?我应该在这里使用指针吗 让我头疼的是,在Java中,new关键字使创建对象的时间和位置变得非常清楚,而在cpp中,这一点就不那么清楚了,而我使用C的经验使事情变得更糟 谢谢- Cody < P>默认值C和C++返回值。 它将返回您的成员的副本。一个好的编译器可能会使用N/RVO优化复制构造函数的额外调用 如果您需要返回成员本身(这不是一个好主意),那么您需要返回一个引用: Window& getWin

我想知道的是
getWindow()
会返回对我的私有
window
对象的引用还是一个副本?我应该在这里使用指针吗

让我头疼的是,在Java中,new关键字使创建对象的时间和位置变得非常清楚,而在cpp中,这一点就不那么清楚了,而我使用C的经验使事情变得更糟


谢谢- Cody

< P>默认值C和C++返回值。 它将返回您的成员的副本。一个好的编译器可能会使用N/RVO优化复制构造函数的额外调用

如果您需要返回成员本身(这不是一个好主意),那么您需要返回一个引用:

 Window& getWindow() 
      ^^^ 

除非明确声明返回引用,否则它将返回一个副本。请注意,至少在c语言中,返回指针不是一个好主意++

要返回引用,必须向返回类型添加
&

class Client
{
public:
    Window& getWindow() { return window; };

private:
    Window window;
};
注意,如果您担心返回值的开销,您可以放心,所有最新的编译器都会在某种程度上进行
返回值优化
。 此外,如果您使用的是C++11,还可以利用移动语义。

按值返回是可以的。无论您做什么,都不要返回指针。这完全不合适。你想实现什么?是否要返回
窗口的副本
,或对现有
窗口
对象的引用?两者都可以,所以这取决于你的意图。如果您返回副本,调用方对其所做的任何修改都不会传播回您的成员。否,无法在此处应用NRVO,因为没有所有权转移–必须复制对象。因为何时返回引用是个坏主意?这不取决于一个人想要实现什么吗?此外,我相信最初的问题正是关于返回引用的,因为提到了Java。@dragonroot:什么时候返回引用是个坏主意?事实并非如此。但是当你返回对成员的引用时,这就变成了一个坏主意。@dragonroot:也许你应该考虑一下可能的原因是什么?@dragonroot:如果你返回对成员的引用,你基本上是给了函数用户杀死你的许可证,合法。调用方可能会更改成员的状态,这对您来说几乎毫无用处。通常,您不想向调用方公开对象,而是提供一些setter方法,这些方法将使您能够控制修改类成员的状态,同时也为调用方提供修改成员状态的机会。请留下评论很快,因为我打算在我的脑海中删除这个答案。我认为正确的指针在C++中几乎总是被避免的,我是正确的吗?看起来C是需要的,并且大部分被C++中的引用替换。返回值优化在这里完成,但是它并没有按照你的想法去做:特别是,因为必须复制,所以没有执行NRVO。<代码>我正确地假设指针在C++ < /代码>中几乎总是被避免。这是一个独立的问题,但是在C++中,你必须在使用指针时做出判断。在某些情况下,你无法避免它。@CodySmith一般来说,是的。这是我的看法(我可以补充,大部分C++的人都同意这个陈述):