Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 平凡赋值_C++_Declaration_Assignment Operator_Member Functions - Fatal编程技术网

C++ 平凡赋值

C++ 平凡赋值,c++,declaration,assignment-operator,member-functions,C++,Declaration,Assignment Operator,Member Functions,在试图理解的过程中,似乎和 我可以发现,如果它是隐式声明的,如果它的类没有虚拟成员函数或虚拟基类,如果它的直接基类和嵌入对象有一个平凡的赋值运算符,那么它是平凡的 我发现了,但令我惊讶的是,它没有回答 读了这篇文章后,我的大脑很痛 此外,我是一个猴子见猴子做程序员,所以我得到这个的唯一方法就是看到它的实际应用。请使用第一个答案中提供的示例解释上述“平凡”的定义,std::string通过使用new或delete或出于不太明显的原因具有平凡赋值运算符。new可以使用复制构造函数,delete使用析

在试图理解的过程中,似乎和

我可以发现,如果它是隐式声明的,如果它的类没有虚拟成员函数或虚拟基类,如果它的直接基类和嵌入对象有一个平凡的赋值运算符,那么它是平凡的

我发现了,但令我惊讶的是,它没有回答

读了这篇文章后,我的大脑很痛


此外,我是一个猴子见猴子做程序员,所以我得到这个的唯一方法就是看到它的实际应用。请使用第一个答案中提供的示例解释上述“平凡”的定义,
std::string
通过使用
new
delete
或出于不太明显的原因具有平凡赋值运算符。

new可以使用复制构造函数,delete使用析构函数。复制构造函数或析构函数可能微不足道

这就是说,很有可能您在很长一段时间内不需要担心构造函数/析构函数是否微不足道

new
调用构造函数来构造对象。如果类型为
T
的构造函数的一个参数是作为复制构造函数的
T
的实例:您正试图从另一个对象构造一个实例

class Foo
{
    public:
        Foo(int x) // not a copy constructor
        : mX(x)
        { }

        Foo(const Foo& inOther) // copy constructor
        : mX(inOther.mX)
        { }
    private:
        int mX;
};

class Bar
{
    public:
        Bar(int x)
        : mX(x)
        { }

        // no copy constructor specified.. C++ will build an implicit one for you
    private:
        int mX;
} 
};

Foo a(1);  // uses the first constructor (not a copy)
Foo b(a); // uses a copy constructor
Foo c = a; // copy constructor

Foo* d = new Foo(1); // construct a new instance of Foo (not a copy)
Foo* e = new Foo(a); // copy

Bar f(1); // normal constructor
Bar g(f); // IMPLICIT copy constructor

如果你的类没有复制构造函数,比如Bar,C++通常提供一个(总是提供给你一个,除非你有一个代码<显式< /Calp>构造函数,或者删除C++构造函数,用C++ 11关键字)。这个复制构造函数非常简单:它复制类的每个成员

一个平凡的复制构造函数是特殊的。只有当编译器为您隐式创建复制构造函数时,才能创建普通复制构造函数,并且:

  • 你班上的所有成员都是可复制的
  • 您没有任何虚拟方法或虚拟基类
  • 所有基类都是可复制的
如果您在类中指定构造函数,根据定义,它并不是微不足道的。Foo没有简单的复制构造函数,因为它是用户定义的。Bar具有隐式复制构造函数,因为它不是用户定义的。隐式复制构造函数很简单,因为复制mX很简单(复制INT很简单)

类似的规则也适用于析构函数。一个平凡的析构函数遵循相同的规则,并删除

这对你有什么好处?该规范列出了一些关于平凡构造函数/析构函数的关键行为。特别是,如果你有一个普通的构造函数和析构函数,那么你可以做一系列的事情,否则它们是非法的。然而,它们都是非常细微的,对于C++代码开发的99.9%来说并不重要。它们都处理这样的情况,即你可以不构造或破坏一个对象而侥幸逃脱

例如,如果我有工会:

union MyUnion {
    int x;
    ClassA y;
    ClassB z;
}
如果y和z有平凡的构造函数和析构函数,C+将为该联合编写一个副本构造函数。如果其中一个有一个非平凡的构造函数/析构函数,我必须自己为联合编写复制构造函数


您可以做的另一件事是快速销毁阵列。通常,删除数组时,必须确保对每个项调用析构函数。如果您可以证明每个元素的析构函数都是微不足道的,那么您可以跳过销毁元素,只释放内存
std::vector
在后台执行此操作(因此您不必)

New可以使用复制构造函数,delete使用析构函数。复制构造函数或析构函数可能微不足道

这就是说,很有可能您在很长一段时间内不需要担心构造函数/析构函数是否微不足道

new
调用构造函数来构造对象。如果类型为
T
的构造函数的一个参数是作为复制构造函数的
T
的实例:您正试图从另一个对象构造一个实例

class Foo
{
    public:
        Foo(int x) // not a copy constructor
        : mX(x)
        { }

        Foo(const Foo& inOther) // copy constructor
        : mX(inOther.mX)
        { }
    private:
        int mX;
};

class Bar
{
    public:
        Bar(int x)
        : mX(x)
        { }

        // no copy constructor specified.. C++ will build an implicit one for you
    private:
        int mX;
} 
};

Foo a(1);  // uses the first constructor (not a copy)
Foo b(a); // uses a copy constructor
Foo c = a; // copy constructor

Foo* d = new Foo(1); // construct a new instance of Foo (not a copy)
Foo* e = new Foo(a); // copy

Bar f(1); // normal constructor
Bar g(f); // IMPLICIT copy constructor

如果你的类没有复制构造函数,比如Bar,C++通常提供一个(总是提供给你一个,除非你有一个代码<显式< /Calp>构造函数,或者删除C++构造函数,用C++ 11关键字)。这个复制构造函数非常简单:它复制类的每个成员

一个平凡的复制构造函数是特殊的。只有当编译器为您隐式创建复制构造函数时,才能创建普通复制构造函数,并且:

  • 你班上的所有成员都是可复制的
  • 您没有任何虚拟方法或虚拟基类
  • 所有基类都是可复制的
如果您在类中指定构造函数,根据定义,它并不是微不足道的。Foo没有简单的复制构造函数,因为它是用户定义的。Bar具有隐式复制构造函数,因为它不是用户定义的。隐式复制构造函数很简单,因为复制mX很简单(复制INT很简单)

类似的规则也适用于析构函数。一个平凡的析构函数遵循相同的规则,并删除

这对你有什么好处?该规范列出了一些关于平凡构造函数/析构函数的关键行为。特别是,如果你有一个普通的构造函数和析构函数,那么你可以做一系列的事情,否则它们是非法的。然而,它们都是非常细微的,对于C++代码开发的99.9%来说并不重要。它们都处理这样的情况,即你可以不构造或破坏一个对象而侥幸逃脱

例如,如果我有工会:

union MyUnion {
    int x;
    ClassA y;
    ClassB z;
}
如果y和z有平凡的构造函数和析构函数,C+将为该联合编写一个副本构造函数。如果其中一个有一个非平凡的构造函数/析构函数,我必须自己为联合编写复制构造函数

您可以做的另一件事是快速销毁阵列。通常,删除数组时,必须确保对每个项调用析构函数。如果你