【问题标题】:What does this line of code means in C++ class?这行代码在 C++ 类中是什么意思?
【发布时间】:2020-10-31 01:10:54
【问题描述】:

我在查看 repo 时偶然发现了这段代码,但在互联网上找不到任何参考。

它到底是做什么的?我假设它指定了要使用的默认构造函数和析构函数。但是如果没有自定义的构造函数和析构函数被隐式使用,为什么还要写这个呢?

 foo::foo() = default
 foo::~foo() = default  

foo.h

class foo
{
public:

    foo();
    
    ~foo();

    void program();

};

foo.cpp

foo::foo() = default;
foo::~foo() = default;

【问题讨论】:

  • 这告诉编译器(明确地)将其生成的默认实现用于默认构造函数foo() 和析构函数~foo()。我从未在类声明之外见过= default,但g++ 似乎对此没有任何抱怨:Live Demo on coliru
  • 它告诉在现代 c++ 中使用编译器生成的默认版本 foo::foo()foo::~foo()
  • 这不是它有用的例子,而是语法的例子。

标签: c++ class oop constructor destructor


【解决方案1】:

它只是告诉编译器使用其默认生成的构造函数和析构函数的变体。

请注意,您不需要将构造函数和析构函数放在源文件中,您也可以在头文件中包含这些“默认值”:

class foo
{
public:

    // Use compiler-generated default implementation    
    foo() = default;
    
    // Use compiler-generated default implementation    
    ~foo() = default;

    void program();

};

请参阅this default constructor reference 中的构造函数 3 和 5,以及 this destructor reference 中的析构函数 3。

【讨论】:

  • 对我来说有点困惑,你是什么意思 - 生成的构造函数和析构函数的变体
  • @RohanBari 对于任何没有声明构造函数的类,编译器会自动生成一个默认构造函数。在某些情况下会禁止这种自动生成(由于 C++ 的规则),但是可以通过使用 = default 语法明确告诉编译器生成这样的默认构造函数。
  • 与其他答案的评论相同。在这种情况下,默认构造函数的链接可能会产生轻微的误导,因为默认构造函数不一定是编译器生成的,尽管在阅读了链接之后可能会变得清晰
  • 请注意,=default 在类外与类内会改变类的属性。
【解决方案2】:

https://en.cppreference.com/w/cpp/language/default_constructor

class_name() = default ;    (4) (since C++11)
  1. 默认默认构造函数:即使存在其他构造函数,编译器也会定义隐式默认构造函数。

class_name :: class_name ( ) = default ; (5) (since C++11)

  1. 类定义之外的默认默认构造函数(类必须包含声明 (1))。此类构造函数被视为用户提供(见下文和值初始化)。

【讨论】:

  • 这有点误导,因为编译器生成的构造函数是默认构造函数,但默认构造函数不一定是编译器提供的。不幸的是,“默认”和default 之间存在细微差别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多