我目前正在使用Legacy Source维护和学习该语言,我想澄清一些关于在类中使用分号的混淆。
这就是我感到困惑的地方。
class Base
{
public:
Base(int m_nVal = -1 ): nVal(m_nVal) {} // Confused here
virtual ~Base() {} // Confused here
public:
virtual void SomeMethod();
virtual int SomeMethod2();
protected:
int nVal;
};
class Derived : public Base
{
public:
Derived(int m_nVal):nVal2(m_nVal) {}; // Confused here
virtual ~Derived(){}; // Confused here
public:
virtual void SomeMethod();
virtual int SomeMethod2();
protected:/* Correction Here */
int nVal2;
};
我注意到有些类的析构函数/构造函数后面有一个分号,有些没有,我确实理解分号是语句结束符。我的问题是构造函数或析构函数之后的分号是否告诉编译器特定的东西?或者是一些无关紧要的事情。
函数Base(int m_nVal = -1 ): nVal(m_nVal) {}
末尾的{}
意味着您有一个完整的函数定义,而不仅仅是像virtual void SomeMethod();
那样的声明
如果展开一点,可能会更容易识别:
Base(int m_nVal = -1 ):
nVal(m_nVal)
{
}
现在我们可以很容易地看到,我们有了完整的函数定义(带一个成员初始化列表来引导),函数不需要结束分号。
构造函数或析构函数后的分号告诉编译器特定的东西吗?
在成员函数定义之后(或之前),它不是。†
在成员函数声明之后(而不是之前),它是强制性的。
可能只是一个疏忽。
†:除非定义没有主体:
struct A {
A() = default; // Mandatory semicolon. Definition
~A() {} // Accessory semicolon. Definition
void foo(); // Mandatory semicolon. Declaration
};