C++通过对构造函数的引用传递.成员将是一个完整的私人副本
C++ pass by reference to constructor. Will member be a full private copy?
在C++中,我有一个接受descriptor
类对象的构造函数。这个班最近规模越来越大,我需要更多地通过参考。如果我通过引用将其传递到下面的ctor中,那么在未声明为引用类型的情况下,该成员是否仍会创建自己的副本?
descriptor taskedStats;
public:
CWorkerThread(int ticketNumber, int threadNumber, descriptor taskedStats) :
_pPaginatableForm(pPaginatableForm), ticketNumber(ticketNumber)
, threadNumber(threadNumber), taskedStats(taskedStats) {}
或
descriptor taskedStats;
public:
CWorkerThread(int ticketNumber, int threadNumber, descriptor &taskedStats) :
_pPaginatableForm(pPaginatableForm), ticketNumber(ticketNumber)
, threadNumber(threadNumber), taskedStats(taskedStats) {}
您的构造函数将生成一个副本,不管怎样。如果您传递值,那么您可能会生成两个副本,但是编译器可能会优化掉其中一个副本。
不过,更好的选择是接受常量引用,即
CWorkerThread(int ticketNumber, int threadNumber, descriptor const& taskedStats) :
_pPaginatableForm(pPaginatableForm),
_ticketNumber(ticketNumber),
_threadNumber(threadNumber),
_taskedStats(taskedStats)
{}
当然,一旦我们进入C++11的世界并移动构造函数,您就不需要制作任何副本,只要不再需要传入的那个。即使现在也有一些方法可以做到这一点,但需要在对象内部进行特殊的"黑客攻击",或者使用智能指针。
类成员被声明为对象,因此它是一个对象。
传递给构造函数的引用将用于初始化成员,使用其复制构造函数。
在可能的情况下,最好通过const
参考;这表明构造函数不会修改参数,还允许您传递一个临时值。
参数从descriptor
更改为descriptor&
仍将导致成员变量taskedStats
从参数taskedStats
复制(使用复制构造函数)。
为了避免复制,可以将成员变量taskedStats
设为descriptor&
,但这意味着参数taskedStats
必须在CWorkerThread
对象的生存期内有效(在这种情况下,不将参数taskedStats
设为const descriptor&
将阻止临时对象的传递)。
编译器提供的默认或隐式副本构造函数生成所有成员的浅层副本,并具有以下签名:
descriptor(const descriptor &other);
因此,传递对描述符的引用与尝试(用C语言来说)传递副本没有什么不同——它们实际上都只是通过引用传递的。
如果成员被声明为引用类型,那么,就像指针一样,它的类型在上面的隐式复制构造函数中不匹配,并且将执行引用赋值,从而使在每个对象中创建本地副本的任何尝试都无效。
- 检查注册表项是否链接到(或副本)另一个注册表项
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 如何告诉 Cppdepend 一个目录有多个本地副本
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- 一个静态变量多副本
- 我如何创建一个双重指针的深层副本,涉及其他类(C )
- C++全局常量数组:是否保证合并(优化)到一个副本中
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 'std::any_cast' 返回一个副本
- 构造向量时如何摆脱(一个)不必要的副本
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- unique()似乎正在添加最后一个元素的另一个副本
- c++类的函数是否对所有对象只有一个副本?
- Objective-C:如果我在ARC的函数中返回一个c++对象,它会创建一个副本吗?我是否必须手动释放该副本?
- 用ref. parameter初始化ref. field:是一个副本
- 我如何推堆栈unqiue_ptr不做一个副本