Tag: 复制构造函数

c ++中私有拷贝构造函数的用法是什么?

为什么人们定义一个私人拷贝构造函数? 何时使复制构造函数和赋值运算符私有一个好的devise? 如果在类中没有成员是指向唯一对象(如文件名)的指针或句柄,那么其他情况下,私有拷贝构造函数是一个好主意? 同样的问题适用于赋值运算符。 考虑到大多数C ++围绕着对象的复制和引用而传递,有没有涉及私有拷贝构造函数的好devise?

C ++的默认拷贝构造函数本质上是不安全的? 迭代器从根本上是不安全的?

我曾经认为,遵循最佳实践时,C ++的对象模型是非常强大的。 就在几分钟前,我意识到我以前没有过。 考虑这个代码: class Foo { std::set<size_t> set; std::vector<std::set<size_t>::iterator> vector; // … // (assume every method ensures p always points to a valid element of s) }; 我已经写了这样的代码。 直到今天,我还没有看到它的问题。 但是,再想一想,我意识到这个class很破碎: 它的复制构造函数和复制分配复制 vector 的迭代器 ,这意味着它们仍然指向旧 set ! 毕竟新的不是真的! 换句话说, 即使这个类没有pipe理任何资源(无RAII) , 我也必须手动实现copy-constructor ! 这让我感到惊讶。 我从来没有遇到过这个问题,我不知道有什么优雅的方法来解决它。 再想一想,在我看来, 复制构造默认是不安全的 – 实际上,在我看来,类不应该是默认可复制的,因为它们的实例variables之间的任何耦合都有可能导致默认的复制-constructor无效 。 迭代器从根本上不安全的存储? 或者,类应该默认是不可复制的? 下面我想到的解决scheme都是不可取的,因为它们不让我利用自动生成的拷贝构造函数: 手动实现我写的每个非平凡类的复制构造函数。 这不仅容易出错,而且要写一个复杂的课程也是很痛苦的。 […]

PODtypes的填充字节是否被复制?

假设我有这样的PODtypes: struct A { char a; int b; }; 在我的系统上, sizeof(A) == 8 ,即使sizeof(char) == 1和sizeof(b) == 4 。 这意味着数据结构有3个未使用的字节。 现在假设我们这样做 A x = …; A y =x; 题: 是否保证x和y所有8个字节都是相同的,甚至3个未使用的字节? 等价地,如果我将一些A对象的底层字节传输给另一个不明白其含义或结构的程序,并将它们视为一个8字节的数组,那么其他程序可以安全地比较两个A的相等性吗? 注意: 在一个使用gcc 7的实验中 ,似乎这些字节被复制。 我想知道这是否有保证。

为什么Java没有拷贝构造函数?

为什么Java不支持像C ++这样的拷贝构造函数?

我们什么时候必须使用复制构造函数?

我知道C ++编译器为类创build一个拷贝构造函数。 在这种情况下,我们必须编写一个用户定义的拷贝构造函数吗? 你能举一些例子吗?

禁用复制构造函数

我有一个class级: class SymbolIndexer { protected: SymbolIndexer ( ) { } public: static inline SymbolIndexer & GetUniqueInstance ( ) { static SymbolIndexer uniqueinstance_ ; return uniqueinstance_ ; } }; 我应该如何修改它以禁用代码: SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( ); 并只允许像这样的代码: SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );

std :: thread通过引用调用复制构造函数

那么我有一个使用std :: thread将数据传递到线程的问题。 我以为我明白了复制构造函数等的一般语义,但似乎我不太明白这个问题。 我有一个简单的类叫做Log,隐藏了它的拷贝构造函数: class Log { public: Log(const char filename[], const bool outputToConsole = false); virtual ~Log(void); //modify behavior void appendStream(std::ostream *); //commit a new message void commitStatus(const std::string str); private: //members std::ofstream fileStream; std::list<std::ostream *> listOfStreams; //disable copy constructor and assignment operator Log(const Log &); Log & operator=(const Log &); } 现在我有一个主要依靠http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_server.cpp […]

什么是最可靠的方法来禁止C + +的构造函数?

有时候,有必要禁止C ++类中的拷贝构造函数,以使类变为“不可拷贝”。 当然, operator=应该同时被禁止。 到目前为止,我已经看到两种方式来做到这一点。 方法1是将方法声明为私有,并且不执行: class Class { //useful stuff, then private: Class( const Class& ); //not implemented anywhere void operator=( const Class& ); //not implemented anywhere }; 方法2是将私有方法声明为“空”实现: class Class { //useful stuff, then private: Class( const Class& ) {} void operator=( const Class& ) {} }; 海事组织的第一个更好 – 即使有一些意想不到的原因导致从同一个类成员函数调用复制构造函数将稍后会出现链接器错误。 在第二种情况下,这个场景直到运行时才会被忽略。 第一种方法有没有严重的缺陷? 什么是更好的方法,如果有的话,为什么?

什么是C ++中的转换构造函数? 这是为了什么?

我听说C ++有一些名为“转换构造函数”或“转换构造函数”的东西。 这些是什么,它们是什么? 我看到它提到这个代码: class MyClass { public: int a, b; MyClass( int i ) {} } int main() { MyClass M = 1 ; }

在C ++中复制构造函数和=运算符重载:是一个常用函数吗?

由于复制构造函数 MyClass(const MyClass&); 和一个=运算符重载 MyClass& operator = (const MyClass&); 有几乎相同的代码,相同的参数,只有不同的返回,有可能有一个共同的function,他们都使用?