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关键字)。这个复制构造函数非常简单:它复制类的每个成员
一个平凡的复制构造函数是特殊的。只有当编译器为您隐式创建复制构造函数时,才能创建普通复制构造函数,并且:- 你班上的所有成员都是可复制的
- 您没有任何虚拟方法或虚拟基类
- 所有基类都是可复制的
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关键字)。这个复制构造函数非常简单:它复制类的每个成员
一个平凡的复制构造函数是特殊的。只有当编译器为您隐式创建复制构造函数时,才能创建普通复制构造函数,并且:- 你班上的所有成员都是可复制的
- 您没有任何虚拟方法或虚拟基类
- 所有基类都是可复制的
union MyUnion {
int x;
ClassA y;
ClassB z;
}
如果y和z有平凡的构造函数和析构函数,C+将为该联合编写一个副本构造函数。如果其中一个有一个非平凡的构造函数/析构函数,我必须自己为联合编写复制构造函数
您可以做的另一件事是快速销毁阵列。通常,删除数组时,必须确保对每个项调用析构函数。如果你