c++ c++-faq copy-constructor assignment-operator rule-of-three
我见过default在类中的函数声明旁边使用过.它有什么作用?
class C {
C(const C&) = default;
C(C&&) = default;
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
virtual ~C() { }
};
Run Code Online (Sandbox Code Playgroud) 编译器为类创建的所有成员函数是什么?这会一直发生吗?像析构函数.我担心的是它是否为所有类创建,为什么需要默认构造函数?
可以为已经有用户定义的构造函数但不是复制构造函数的类调用(隐式)默认 复制构造函数吗?
如果可能的话,假设我们明确定义了类的复制构造函数,现在可以调用(隐式)默认构造函数吗?
我有一个大班,拿着很多STL容器.
编译器会自动创建一个移动构造函数来将这些容器移动到目标,还是我必须自己创建?
这应该是一个微不足道的问题,但我无法在stackoverflow上明确找到它.
如果用户不提供,将隐式定义以下内容.
但是我已经读过某个地方(我现在似乎无法找到),有些情况下编译器不会隐式实现它们.
这些条件是什么?
在定义接口类时声明实例化方法的正确方法是什么?
出于显而易见的原因,抽象基类需要具有虚拟析构函数.但是,然后给出以下编译警告:"'InterfaceClass'定义了一个非默认的析构函数,但没有定义复制构造函数,复制赋值运算符,移动构造函数或移动赋值运算符",这是"五的规则" ".
我理解为什么一般应该遵守"五规则",但是它仍适用于抽象基类或接口吗?
那么我的意思是:
class InterfaceClass
{
// == INSTANTIATION ==
protected:
// -- Constructors --
InterfaceClass() = default;
InterfaceClass(const InterfaceClass&) = default;
InterfaceClass(InterfaceClass&&) = default;
public:
// -- Destructors --
virtual ~InterfaceClass() = 0;
// == OPERATORS ==
protected:
// -- Assignment --
InterfaceClass& operator=(const InterfaceClass&) = default;
InterfaceClass& operator=(InterfaceClass&&) = default;
// == METHODS ==
public:
// Some pure interface methods here...
};
// == INSTANTIATION ==
// -- Destructors --
InterfaceClass::~InterfaceClass()
{
}
Run Code Online (Sandbox Code Playgroud)
它是否正确?这些方法应该= delete …
这只是一个快速的问题,可以正确理解当您使用如下构造函数创建类时会发生什么:
class A
{
public:
A() {}
};
Run Code Online (Sandbox Code Playgroud)
我知道没有生成默认构造函数,因为它已经定义,但是由编译器生成的复制和赋值构造函数,或者换句话说,我是否需要声明私有复制构造函数和私有赋值运算符以防止这种情况发生?
class A
{
private:
// needed to prevent automatic generation?
A( const A& );
A& operator=( const A& );
public:
A() {}
};
Run Code Online (Sandbox Code Playgroud) c++ copy-constructor default-constructor assignment-operator
如果我在类中禁止移动构造函数,我就不能再在向量中使用它:
class Foo
{
public:
Foo(int i) : i_(i) {}
Foo(Foo&&) = delete;
int i_;
};
int main()
{
std::vector<Foo> foo;
foo.push_back(Foo(1));
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
isocpp.org指出:
基于移动的std :: sort()和std :: set :: insert()的测量速度比基于复制的版本快15倍[...]如果你的类型有移动操作,你会自动获得性能优势来自标准算法.
这是否意味着如果调用sort()没有移动构造函数或移动赋值运算符的用户定义类型,那么是否使用了移动语义?换句话说,为了获得C++ 11性能改进的诸多好处,您应该编辑现有代码以显式添加移动操作?
此外,如果要进行排序,是容器还是容器内的类型,或两者都必须定义移动操作?