草庐IT

深浅拷贝

全部标签

c++ - 了解虚拟拷贝构造函数

我无法理解我用来学习C++的书中的代码到底发生了什么。这是代码:classBase{public:Base(){};virtual~Base(){};virtualBase*Clone(){returnnewBase(*this);}};classDerived{public:Derived(){};virtual~Derived(){};virtualBase*Clone(){returnnewDerived(*this);}};所以在这个Clone()函数我知道函数返回一个指向基类对象的指针。我不明白的是该功能中发生了什么。当我以前使用过new如int*pInt=newint,我的

c++ - 为什么不在默认拷贝构造函数中实现深拷贝?

所有人都提醒我们在使用默认复制构造函数和默认赋值运算符时要小心,因为它们是卷影复制。但是,我总是很困惑,为什么c++中的默认拷贝构造函数和默认赋值运算符之间默认不做深拷贝,这样就不用自己写拷贝构造函数实现来防止意外了? 最佳答案 C++实现按值复制,这​​意味着它基本上执行x=y;。在许多情况下,这就足够了。但是,在指针的情况下,编译器对所指向的内容一无所知。它将复制指针的值,但不会因此复制基础项。例如,如果您有这样的类(class):classFoo{char*data;};那么编译器应该如何处理data呢?它不知道它指向的是单个

c++ - move 语义只是一个浅拷贝并将其他指针设置为空吗?

我一直在阅读C++中的move语义,在解释中人们给出了很多类比来帮助简化它,在我的脑海中我能看到的是人们所说的“move”而不是“复制”“只是对象的浅表拷贝,并将“移出”对象中的任何指针设置为空。这基本上是要点吗?浅拷贝并将其他指针设置为空? 最佳答案 Shallowcopyandsetother'spointerstonull?浅拷贝-是的。将其他人的指针设置为null-并非总是如此。最低要求是被移出的对象处于“未定义但有效的状态”,也就是说你可以重新分配给它,再次move它或删除它而不会导致程序失败,但不执行其他状态相关的操作。

c++ - 如何在 C++ 中返回数据的拷贝

我正在尝试在C++模板类中返回数据的新拷贝。以下代码出现此错误:从“int”到“int*”的无效转换。如果我删除newT,那么我不会返回数据的拷贝,而是返回指向它的指针。templateTOrderedList::get(intk){Node*n=list;for(inti=0;iget_link();}returnnewT(n->get_data());//Thislineisgettingtheerror**********} 最佳答案 new创建并返回一个指针。您只需要一个将被隐式创建的拷贝,因为return语句将调用对象T的

c++ - 返回标准容器会导致容器内容的拷贝吗?

如果我有一个返回STL容器的函数,我是否会得到标准容器全部内容的拷贝?例如这是:voidFoo(std::vector*string_list);比这更好:std::vectorFoo();容器里装的东西重要吗?例如会返回这样的容器:structbuzz{inta;charb;floatc;}std::mapFoo();比这更昂贵的操作:std::mapFoo();谢谢,保罗H编辑:这是C++03。遗憾的是,C++0x解决方案是NotAcceptable。编辑2:我正在使用MicrosoftVisualStudio2008编译器。 最佳答案

c++ - 对于具有 char[] 的结构,浅拷贝是否足够?

我有一个包含字符数组的结构,没有任何其他成员函数。我正在这些结构的两个实例之间进行赋值操作。如果我没记错的话,它正在做浅拷贝。在这种情况下浅拷贝安全吗?我已经在C++中尝试过它并且它有效,但我只想确认这种行为是否安全。 最佳答案 如果通过“浅拷贝”,你的意思是在分配一个包含数组的struct之后,该数组将指向原始struct的数据,然后:它不能。数组的每个元素都必须复制到新的struct中。如果你的结构有指针,“浅拷贝”就会出现。否则,您不能进行浅拷贝。当您将包含数组的struct分配给某个值时,它不能进行浅拷贝,因为这意味着分配给

c++ - 抽象类,拷贝构造函数

在具有纯虚方法的类中或仅在派生类中定义复制构造函数/运算符=是否有意义? 最佳答案 像普通类:是的,如果您有特定的实现需求。 关于c++-抽象类,拷贝构造函数,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/5593168/

c++ - 这个拷贝构造函数有什么问题?

我一直在努力想出一个树的复制构造函数。我发现了很多建议。这个让我很感兴趣。classTreeNode{intascii;TreeNode*left;TreeNode*right;public:TreeNode(){ascii=0;left=right=0;}TreeNode*clone();//...};TreeNode*TreeNode::clone(){if(TreeNode*tmp=newTreeNode){tmp->ascii=ascii;if(left)tmp->left=left->clone();if(right)tmp->right=right->clone();ret

c++ - 为什么需要 move 语义来消除临时拷贝?

所以我对move语义的理解是,它们允许您覆盖用于临时值(右值)的函数,并避免可能昂贵的拷贝(通过将状态从未命名的临时值move到您命名的左值)。我的问题是为什么我们需要特殊的语义?为什么C++98编译器不能省略这些拷贝,因为是编译器决定给定表达式是左值还是右值?例如:voidfunc(conststd::string&s){//Dosomethingwiths}intmain(){func(std::string("abc")+std::string("def"));}即使没有C++11的move语义,编译器仍然应该能够确定传递给func()的表达式是右值,因此不需要从临时对象进行复制

c++ - const ref lvalue to non-const func return value 是否专门减少拷贝?

我遇到了一个C++习惯,我试图研究它以了解它的影响并验证它的用法。但我似乎找不到确切的答案。std::vectorgetThings();voiddo(){conststd::vector&things=getThings();}这里我们有一些返回非const&值的函数。我看到的习惯是在分配函数的返回值时使用const&左值。提出这个习惯的原因是它减少了拷贝。现在我一直在研究RVO(返回值优化)、复制省略和C++11移动语义。我意识到给定的编译器可以选择阻止通过RVO进行复制,不管这里是否使用了const&。但是,在防止复制方面,const&左值的使用对非const&返回值有任何影响吗