4

私は.Netのバックグラウンドから来て、スコープ演算子を介してクラス外の関数の内容を定義できることをチュートリアルhere::で見たc ++を学び始めています。

チュートリアルで指定された例を次に示します。

// classes example
#include <iostream>
using namespace std;

class CRectangle {
    int x, y;
  public:
    void set_values (int,int);
   int area () {return (x*y);}
};

void CRectangle::set_values (int a, int b) {
  x = a;
  y = b;
}

int main () {
  CRectangle rect;
  rect.set_values (3,4);
  cout << "area: " << rect.area();
  return 0;
}

set_valuesGoogleで見つけることができるのはスコープの解決に関するものだけですが、クラス内の宣言 like の代わりに宣言 like を使用する必要がある理由/時期を知りたいareaです。利点、ルール、ベストプラクティスはありますか?

4

4 に答える 4

2

関数の実装を別のファイル (主に .cpp) に入れたい場合にのみ、これを行います。

ヘッダー ファイルには、ほとんどの場合、.h 拡張子が付いています。ヘッダー ファイルの目的は、他のファイルが使用する宣言を保持することです。ほとんどの場合、クラスがどのように見えるか、つまり関数の定義をここで定義します。多くのクラスを行う必要がある場合に便利です。.cpp を使用して詳細に進み、ヘッダー ファイルで「定義」された関数を実際に実装します。

関連するクラスが多数ある場合は、ヘッダー ファイルと cpp ファイルを使用すると、ビルド時間が短縮されます。非常に勇気があり、ビルド時間をさらに短縮したい場合は、PIMPL パターンについて読むことをお勧めします。

基本情報について詳しくはこちら

于 2013-09-15T09:25:13.793 に答える
1

それは確かに良い質問であり、すべてコンパイル時間に要約されます。.NET のバックグラウンドを持っている人は、 と の違いを理解するのが難しい場合が#includeあります。C# のusingステートメント。心に留めておくべきことは次のとおりです。

ディレクティブは#include、インクルード ファイルの内容をコピーして貼り付けます。

したがって、ヘッダーに実装コードを配置すると、基本的に各#includeサイトで 1 回、複数回コンパイルすることになります (リンカーは重複したコードを削除する必要があります)。また、cpp ファイルを変更すると、単独で再コンパイルされます。ヘッダー ファイルを変更すると、それを含むすべてのファイルが (間接的にも!) 再コンパイルされます。

したがって、可能な限り実装 (つまり、cpp) ファイル内に配置します。コンパイラは、リンク時のコード最適化として十分に優れているため、インライン化を防ぐことができるという事実は、以前ほど問題になりません。

ただし、テンプレートでは不可能であり、これが C++ を使用するときに見られる非常に長いコンパイル時間の多くを占めています。

于 2013-09-15T10:17:51.013 に答える
1

宣言と実装を分割する主な利点は、ライブラリなどのエンド ユーザーに配布されるコードを作成する場合に得られます。

コードを配布するときは、ヘッダー ファイルとオブジェクト ファイル *.o だけを配布します。そうすれば、超凝った秘密のコードは安全で、.o ファイル内にコンパイルされます。エンド ユーザーは .h ファイルを持っているので、それを引き続き使用できます。

于 2013-09-15T09:41:49.620 に答える
0

ここでのポイントは、クラス メソッドの定義、宣言、および実装を分離することです。これは、それらを異なるファイルに入れたい場合 (通常、ヘッダーにはクラス定義が含まれ、.cpp にはクラス実装が含まれます)、または一貫性やその他の理由ですべてをクラス本体に直接含めないことを選択する場合に非常に便利です。

于 2013-09-15T09:39:27.133 に答える