为什么 C++ 将 class 的名称用于 ctor/dtor?
Why does C++ use the name of the class for the ctor/dtor?
关于 C++,偶尔让我厌烦的一件事是重复定义构造函数。在单独的 cpp 文件中定义 ctors 时尤其如此。当我们泛指它们时,通常会说"constructor"、"destructor"、"copy constructor",或简称为"ctor"、"dtor"、"cctor" .甚至一些 C++ 编译器也会这样缩写它们。那么为什么语言不使用它呢?不是:
class SomeLongSelfDocumentingClassName
{
ctor(int a, string b);
cctor(const SomeLongSelfDocumentingClassName& other);
~dtor();
};
SomeLongSelfDocumentingClassName::ctor(int a, string b) { /* ... */ }
SomeLongSelfDocumentingClassName::cctor(const SomeLongSelfDocumentingClassName& other) { /* ... */ }
SomeLongSelfDocumentingClassName::dtor(int a, string b) { /* ... */ }
比:
更容易阅读
class SomeLongSelfDocumentingClassName
{
SomeLongSelfDocumentingClassName(int a, string b);
SomeLongSelfDocumentingClassName(const SomeLongSelfDocumentingClassName& other);
~SomeLongSelfDocumentingClassName();
};
SomeLongSelfDocumentingClassName::SomeLongSelfDocumentingClassName(int a, string b) { /* ... */ }
SomeLongSelfDocumentingClassName::SomeLongSelfDocumentingClassName(const SomeLongSelfDocumentingClassName& other) { /* ... */ }
SomeLongSelfDocumentingClassName::SomeLongSelfDocumentingClassName(int a, string b) { /* ... */ }
?
诚然,我一直重复这样做了很长时间,以致于乍一看前一个块看起来像胡说八道。 Stroustrup 选择我没有想到的重复表示有充分的理由吗?
它来自 C++ 的演进 "C with classes"。
C 和 C++ 语言委员会(现在是 ISO)总是不愿意引入新的关键字,因为这样做会破坏很多代码。 ctor
和 dtor
本来就是一个新关键字。请注意,由于 C++ 支持函数重载,因此不再需要 cctor
;即使最初的草稿没有。
此外,能够将成员函数命名为与 class 的名称相同将是一种混淆练习!因此,在这种情况下将其保留用于构建和销毁是有意义的。
使用 class 的名称作为构造函数,使用 ~
作为析构函数的名称在当时是一个明智的选择。至少在我看来,它仍然是。
关于 C++,偶尔让我厌烦的一件事是重复定义构造函数。在单独的 cpp 文件中定义 ctors 时尤其如此。当我们泛指它们时,通常会说"constructor"、"destructor"、"copy constructor",或简称为"ctor"、"dtor"、"cctor" .甚至一些 C++ 编译器也会这样缩写它们。那么为什么语言不使用它呢?不是:
class SomeLongSelfDocumentingClassName
{
ctor(int a, string b);
cctor(const SomeLongSelfDocumentingClassName& other);
~dtor();
};
SomeLongSelfDocumentingClassName::ctor(int a, string b) { /* ... */ }
SomeLongSelfDocumentingClassName::cctor(const SomeLongSelfDocumentingClassName& other) { /* ... */ }
SomeLongSelfDocumentingClassName::dtor(int a, string b) { /* ... */ }
比:
更容易阅读class SomeLongSelfDocumentingClassName
{
SomeLongSelfDocumentingClassName(int a, string b);
SomeLongSelfDocumentingClassName(const SomeLongSelfDocumentingClassName& other);
~SomeLongSelfDocumentingClassName();
};
SomeLongSelfDocumentingClassName::SomeLongSelfDocumentingClassName(int a, string b) { /* ... */ }
SomeLongSelfDocumentingClassName::SomeLongSelfDocumentingClassName(const SomeLongSelfDocumentingClassName& other) { /* ... */ }
SomeLongSelfDocumentingClassName::SomeLongSelfDocumentingClassName(int a, string b) { /* ... */ }
?
诚然,我一直重复这样做了很长时间,以致于乍一看前一个块看起来像胡说八道。 Stroustrup 选择我没有想到的重复表示有充分的理由吗?
它来自 C++ 的演进 "C with classes"。
C 和 C++ 语言委员会(现在是 ISO)总是不愿意引入新的关键字,因为这样做会破坏很多代码。 ctor
和 dtor
本来就是一个新关键字。请注意,由于 C++ 支持函数重载,因此不再需要 cctor
;即使最初的草稿没有。
此外,能够将成员函数命名为与 class 的名称相同将是一种混淆练习!因此,在这种情况下将其保留用于构建和销毁是有意义的。
使用 class 的名称作为构造函数,使用 ~
作为析构函数的名称在当时是一个明智的选择。至少在我看来,它仍然是。