std::string x(x);
Run Code Online (Sandbox Code Playgroud)
这对我的编译器崩溃非常严重.这是否意味着我应该this != &that在我自己的拷贝构造函数中进行测试,或者我可以假设没有客户端会如此愚蠢?
我正在使用这两个课程
// This is generic data structure containing some binary data
class A {
public:
A();
A(const A&);
~A();
}
// Main data container
class B {
public:
B();
B( const B&);
~B();
protected:
std::vector<A *> data;
}
// Copy constructor for class b
B::B( const B& orig):data() {
for( std::vector<A *>::const_iterator it = orig.data.begin();
it < orig.data.end(); ++it){
data.push_back( new A( *(*it)));
}
}
Run Code Online (Sandbox Code Playgroud)
我想这堂课会做到这一点,但我找到了如何达到完美的目标.
首先:data() - 这是初始化空向量所需的初始化(这是编写一个好的和干净的代码的一部分)?
如何vector::iterator在复制构造函数中使用,我找到的唯一方法就是我写入代码的方法(对于复制构造函数,const应该是必需的).
仅复制矢量会复制指针值而不是整个对象?
最后新的数据初始化...有什么办法可以用较小的代码替换整个循环和/或是否有任何标准如何为包含对象指针的std :: containers编写复制构造函数?
子问题:我假设使用vector<A …
参考计数究竟是什么?特别是,C++的用途是什么?如果我们不处理它们会遇到什么问题?所有语言都需要引用计数吗?
假设我有一个类,其中复制构造函数是私有的而未实现(使对象不可复制)
class NonCopyable {
// whatever
private:
NonCopyable( const NonCopyable&);
void operator=(const NonCopyable&);
};
Run Code Online (Sandbox Code Playgroud)
现在在同一个类的一些成员函数中,我编写了返回该类对象的代码:
NonCopyable NonCopyable::Something()
{
return NonCopyable();
}
Run Code Online (Sandbox Code Playgroud)
这是RVO可以参与的情况.
RVO仍然要求可以访问复制构造函数.由于可以从同一个类成员函数中对复制构造函数进行可能的调用,因此可以访问复制构造函数.因此技术上RVO是可能的,尽管意图是禁止使用复制构造函数.
在这种情况下是否允许RVO?
我正在学习C++,正在从中读取复制构造函数C++: The Complete Reference.书上写着
允许复制构造函数具有其他参数,只要它们具有为其定义的默认参数即可.但是,在所有情况下,第一个参数必须是对执行初始化的对象的引用.
但我很困惑,我们将如何通过这些额外的参数?我相信应该有一些方法没有在书中给出,我无法弄清楚.谁能帮我吗?
编辑: 也可以在所有三种情况下传递这些额外的参数,即
你能给出一个简单或真实的例子来演示volatile复制构造函数的用法吗?
我只是想不出一个.
在C++ 11之前,我们可以通过编写类似于A a = 1;或多或少相当的东西来进行复制初始化A a = A(1);.也就是说,首先创建临时,然后调用复制ctor.无论版本是否复制,这必须是概念上的,并且必须可以访问复制文件.
使用C++ 11中的列表初始化,我们可以通过写入来进行复制列表初始化A a = {1, 2};.在我看来,这应该或多或少相当于A a = A(1, 2);.但是,在GCC和clang上,A a = {1, 2}即使复制和移动ctor不可访问(通过声明为私有)也会编译.但是,A a = 1;如果相应的复制/移动ctor不可访问,则不会在GCC或clang上编译.所以,A a = {1, 2};似乎或多或少等同于A a{1, 2};直接列表初始化.这与实际直接列表初始化之间的区别在于,A a = {1, 2};如果采用两个整数的ctor是显式的,则不会编译.在这方面,A a = {1, 2};类似于复制初始化.
所以,我的问题是:A a = {1, 2};概念上表达式的确切语义是什么?从概念上讲,复制省略不会妨碍.
c++ copy-constructor copy-initialization c++11 list-initialization
我的问题涉及如何返回没有复制构造函数的对象.举一个例子,让我们想象一下,我有一些bigResource位于堆中,让我们说我用它来跟踪它unique_ptr.现在假设我将此资源的所有权交给了毛毛虫.然后我有一个CaterpillarWithBigResource.现在在某些时候,这CaterpillarWithBigResource将变成一个ButterflyWithBigResource,所以Caterpillar对象必须将所有权转移到Butterfly对象.
我编写了以下代码来模拟情况:
#include <cstdlib>
#include <iostream>
#include <memory>
class ButterflyWithBigResource {
public:
// If I uncomment just this line, I get an error
// ButterflyWithBigResource(const ButterflyWithBigResource& other) = default;
// If I uncomment just this line, I get an error
// ButterflyWithBigResource(const ButterflyWithBigResource& other) = delete;
// With both above lines commented out, I get no errors, and the program runs fine.
ButterflyWithBigResource(std::unique_ptr<int>&& bigResource) :
bigResource(std::move(bigResource)) …Run Code Online (Sandbox Code Playgroud) 我有一个模板类,它有一个模板复制构造函数.问题是当我使用具有相同模板类型的此类的另一个实例来实例化此类时,我的模板复制构造函数未被调用.为什么不匹配?这是代码片段:
#include <iostream>
template <typename T>
class MyTemplateClass
{
public:
MyTemplateClass()
{
std::cout << "default constructor" << std::endl;
}
/*
MyTemplateClass(const MyTemplateClass<T>& other)
{
std::cout << "copy constructor" << std::endl;
}
*/
template <typename U>
MyTemplateClass(const MyTemplateClass<U>& other)
{
std::cout << "template copy constructor" << std::endl;
}
};
int main()
{
MyTemplateClass<int> instance;
MyTemplateClass<int> instance2(instance);
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
输出是
default constructor
Run Code Online (Sandbox Code Playgroud)
但是如果我显式地编写默认的复制构造函数(通过取消注释它),那么输出就变成了
default constructor
copy constructor
Run Code Online (Sandbox Code Playgroud)
我真的不明白.我用我的本地编译器(clang-500.2.79)和这个(gcc 4.9.2)测试了它并得到了相同的结果.
我们有以下方法来测试我们的结构是否是POD.它总是返回true:
bool podTest() {
struct podTest {
int count;
int x[];
};
return std::is_pod<podTest>::value; //Always returns true
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我们进行一次更改并删除复制构造函数:
bool podTest() {
struct podTest {
podTest(const podTest&) = delete;
int count;
int x[];
};
return std::is_pod<podTest>::value; //Always returns false
}
Run Code Online (Sandbox Code Playgroud)
这总是返回false.在阅读了is_pod我的定义后,我仍在努力了解它违反了什么要求.我错过了什么?
这是使用gcc 6.1在godbolt上编译的 -std=c++14
c++ ×10
copy-constructor ×10
c++11 ×2
c++14 ×1
constructor ×1
containers ×1
rvo ×1
struct ×1
templates ×1
vector ×1