为什么必须在C++类定义中声明方法?

jia*_*afu 6 c++ declaration

如果只定义此方法,则会出现编译错误.

void classA::testMethod() {    
}
Run Code Online (Sandbox Code Playgroud)

所以必须先声明:

class classA {    
   void testMethod();
};
Run Code Online (Sandbox Code Playgroud)

为什么要宣布这些?

我知道对于常见的C方法方法,它不需要声明,但它们只能被定义:

void test() {
}
Run Code Online (Sandbox Code Playgroud)

MSa*_*ers 8

在定义方法之前不需要声明方法,但是需要在类中声明类方法.否则它不会是一种类方法.

这似乎是一个矛盾,但定义也是一个宣言.那么这意味着定义可能出现在类本身中:

class A {
  void testMethod() { /*...*/ } 
};
Run Code Online (Sandbox Code Playgroud)

[编辑]另外,实际上,在类声明中有private,protectedpublic部分.这是封装所必需的.如果你可以在类之外声明方法,那么你将失去封装.任何人都可以通过定义额外的getter和setter来访问私有成员,即使那些没有意义.类不变量将变得毫无意义.


Mar*_* A. 7

客观和主观有几个次要原因(即允许指定可见性,作为类的接口,可能还有几个与编译和链接阶段和TU符号可见性相关的其他原因,更不用说类是基本的封装单元,所有这些暗示)但毫无疑问的是,标准规定了它:

N3797 - class.mfct/p2

可以在其类定义中定义成员函数(8.4),在这种情况下,它是内联成员函数(7.1.2),或者如果它已经被声明但未在其定义中定义,则可以在其类定义之外定义它.类定义.出现在类定义之外的成员函数定义应出现在包含类定义的命名空间范围内.除了出现在类定义之外的成员函数定义之外,除了出现在类定义之外的类模板和成员函数模板(14.7)的成员函数的显式特化之外,不应重新声明成员函数.

强调我的.


Csq*_*Csq 6

它有助于封装.如果你有A班

class A {
public:
  foo();
  bar();
}
Run Code Online (Sandbox Code Playgroud)

您可以确定只有方法foobar混乱类的私有数据成员.(当然还是指针魔术或未定义的行为)