1

私はC++に取り組んでいます。MVSV2010を使用しています。

ソース コードをコンパイルし、-d1reportAllClassLayout を使用してすべてのクラスのメモリ レイアウトをダンプすると、.

たとえば、構造体を宣言します。

struct my_struct{
    int a;
};

構造体のメモリ レイアウトは次のとおりです。

class my_struct size(4):
    +---
0   | a
    +---

C++ コンパイラはすべてにおいて構造体をクラスと同じと見なすということですか? (デフォルトのアクセス指定子を除く)

だとすれば、struct のコンストラクタとデコンストラクタはどうでしょうか。

構造体のデフォルトのコンストラクターとデコンストラクターはありますか? そしてそれはクラスに似ていますか?

ご支援いただき、誠にありがとうございます。

4

4 に答える 4

4

C++ では、クラスと構造体は (ほぼ) まったく同じです。それらの唯一の違いは、クラスprivateのデフォルトが であり、構造体のデフォルトがpublic

于 2015-06-04T06:49:48.900 に答える
1

C++ では、クラスの概念は次のように定義されます。

class-specifier:
    class-head { member-specificationopt}

class-head は次のように定義されます

class-head:
    class-key attribute-specifier-seqopt class-head-name class-virt-specifieropt base-clauseopt
    class-key attribute-specifier-seqopt base-clauseopt

どこ

class-key:
    class
    struct
    union

したがって、構造体は class-key を持つクラスstructです。

そして (C++Standard 12.1 コンストラクター)

4 クラス X のデフォルトのコンストラクターは、引数なしで呼び出すことができるクラス X のコンストラクターです。クラス X に対してユーザーが宣言したコンストラクターがない場合、パラメーターを持たないコンストラクターは暗黙的にデフォルトとして宣言されます(8.4)。暗黙的に宣言されたデフォルト コンストラクターは、そのクラスのインライン パブリック メンバーです...

構造体はクラスであり、ユーザーが宣言したコンストラクターを持たないため、そのようなコンストラクターはコンパイラーによって暗黙的に宣言されます。

于 2015-06-04T06:56:46.553 に答える
1

Stroustrup の FAQからの引用

適切に設計されたクラスは、クリーンでシンプルなインターフェイスをユーザーに提示し、その表現を隠して、ユーザーがその表現について知る必要がないようにします。表現を隠してはならない場合 (たとえば、ユーザーが任意のデータ メンバーを好きなように変更できるようにする必要があるため)、そのクラスを「単純な古いデータ構造」と考えることができます。例えば:

struct Pair {
   string name, value; };

構造体は、類似または非類似のデータ型の集合です。クラスは、構造内に関数を含めることができるようにすることで、構造の範囲を拡張します。ここで、構造体がデータ型の単なるコレクションである場合、コンストラクターと同じようにそれらをデフォルト値に確実に初期化できます。そうしないと、Vladの回答で述べたようにコンパイラーが暗黙的にそれを行いますが、デストラクタは必要なく、デフォルトではデストラクタはありません。

于 2015-06-04T07:06:13.323 に答える
0

単純に、d1reportAllClassLayout が両方を同じように報告することを意味している可能性があります。

于 2015-06-04T06:57:25.180 に答える