GNU C++ 编译器 g++ 为 C++ 语言提供了扩展。这两个选项之间的区别在于是否启用这些可能违反 C++ 标准的 GNU 扩展。请注意,即使使用 -std = c++11,某些扩展仍然可能有效,前提是它们不违反标准。GNU 编译器中 C++ 语言扩展的列表可以在这里找到:https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html
简而言之,“就地 new”允许您在已分配给给定变量的内存上“构造”一个对象。这对于优化很有用,因为它比重新分配和重用已分配给它的相同内存更快。它可以按如下方式使用:new (address) (type) initializer 我们可以指定我们想要构造给定类型的新的对象的地址。示例 #include using namespace std; int main() { int a = 5; cout
三法则是在使用 C++ 时的一条经验法则。这是一种良好的实践规则,它指出:如果您的类需要显式定义复制构造函数、赋值运算符或析构函数中的任何一个,那么它很可能需要这三个中的所有三个。为什么是这样?因为,如果您的类需要上述任何一个,它正在管理动态分配的资源,并且可能需要另一个来成功实现这一点。例如,如果您需要一个赋值运算符,您将创建当前正在通过引用复制的对象的副本,因此分配…… 阅读更多
Scott Meyers 在 Effective C++ 中说:如果一个类有任何虚函数,它应该有一个虚析构函数,并且那些不是设计为基类或不是设计为多态使用的类不应该声明虚析构函数。因此,您应该在多态基类中声明虚析构函数。这是因为如果您使用派生构造函数创建基类的对象:Base *b = new Derived(); // 使用 b delete b; 如果 Base 的析构函数不是虚函数,则在这种情况下 delete b 的行为未定义。对析构函数的调用将像任何非虚代码一样解析。…… 阅读更多