3

このリンクを検討してください。このコードを参照してください:

 class MyClass
    {
    public:
        MyClass();
        ~MyClass();
    
    private:
        int _a;
    };
    
    MyClass::MyClass()
    {
    }
    
    MyClass::~MyClass()
    {
    }

クラス外でコンストラクターを宣言できます。
クラスからコンストラクターを宣言できる理由と、これを行う必要があるのはなぜですか?

4

6 に答える 6

18

クラス外でコンストラクターを宣言することはできません。あなたはコンストラクタ定義について話している。

class MyClass
{
public:
    MyClass(); // declaration

};

MyClass::MyClass() // definition
{
}

あなたはこれを読むべきです。

クラスの外でコンストラクターを定義する必要がある主な理由は、読みやすさです。ヘッダー ファイルでクラスを宣言し、ソース ファイルで定義する方が明確です。このルールは、クラスのどのメンバーにも適用できます。


標準からのちょっとした引用:

12.1 コンストラクタ

struct S {
    S();   // declares the constructor
};

S::S() { } // defines the constructor
于 2013-08-07T13:23:17.620 に答える
8

それはいけません。これはコンストラクター宣言であり、クラス定義に含まれている必要があります。

// MyClass definition, possibly in .h file
class MyClass
{
 public:
  MyClass(); // default constructor declaration
  ...
};

これはコンストラクタの定義です

 // MyClass default constructor definition, possibly in .cpp file
MyClass::MyClass() { }

あなたが参照しているのはコンストラクターの定義です。クラス定義の外で定義して、一方を他方から切り離すことができます。通常、これは、クラス定義をヘッダー ファイルに配置してクライアント コードにインクルードし、コンストラクター定義 (および他のクラス メンバー関数定義) をコンパイルされる実装ファイルに配置することを意味します。このようにして、コードのユーザーは、コンパイル時に上記の定義に依存しません。

于 2013-08-07T13:20:38.910 に答える
7

クラス宣言の外でコンストラクター (または任意のメンバー関数)を定義する主な理由は、ヘッダー ファイルと実装ファイルを使用できるようにするためです。これにより、コードが読みやすくなり、実装の詳細を提供することなく、インターフェイスをクラス (ヘッダー ファイル) に配布できます。

于 2013-08-07T13:23:25.227 に答える
0

まず第一に、用語が混乱しているので、 を読む必要がありますWhat is the difference between a definition and a declaration?declareクラス外でコンストラクターを作成することはできませんが、クラス外で作成することはできますdefine

それでは、あなたが意図したとおりの質問に進みます。

クラスからコンストラクターを定義できる理由

member function基本的に、標準では、セクションの sについて次のように述べています9.3.2

メンバー関数は、そのクラス定義で定義 (8.4) できます。この場合、それはインライン メンバー関数 (7.1.2) です。または、既に宣言されているがクラス定義で定義されていない場合は、クラス定義の外で定義できます。クラス定義。

したがって、標準はこれで問題ないと言っています。次の質問:

なぜ私たちはこれをしなければならないのですか?

これにより、コードがよりクリーンで消化しやすくなり、宣言をヘッダー ファイルに分割し、実装をソース ファイルに分割できます。この前のスレッドWhy have header files and .cpp files in C++? このトピックについて詳しく説明します。

于 2013-08-07T13:48:12.233 に答える
0

はい、.h ファイルまたは .cpp ファイルのどちらを使用しているかに関係なく、クラス内でコンストラクターを定義できます。実際、両方のファイルの主な違いは、ヘッダー ファイルはコンパイルされず、.cpp ファイルのコンパイル中に構文をチェックするためだけに使用されることです。

デフォルトのインライン関数でクラス内に定義するメソッド。クラス内に 1 つのコンストラクターを定義する場合は問題ありませんが、複数のコンストラクターを定義する必要がある場合は、2 つの問題が発生します。

問題 1:
ご存知のように、インライン関数を呼び出すと、呼び出された関数にコードが貼り付けられ、コード サイズが大きくなり、より多くのメモリが必要になります。

問題 2: コードの可読性を低下させます。

于 2013-08-07T14:36:21.757 に答える