struct class unionの違い

9499 ワード

一、CにおけるstructとC++structの違い
C言語ではstructは集約データ型にすぎず、権限設定がなく、メンバー関数を追加できず、オブジェクト向けのプログラミングが実現できず、typedef構造名がなければ、構造変数を宣言するにはキーワードstructを追加する必要があります.
C++ではstruct機能が大幅に拡張され、権限設定(デフォルト権限はpublic)が可能であり、classのようにメンバー関数があり、継承(デフォルトpublic継承)が可能であり、オブジェクトに対するプログラミングを実現することができ、構造変数を宣言する際にキーワードstructを省略することができる.
CおよびC++のstructの宣言、初期化、および使用方法:
struct {
int a;
float b;
char c;
} x = {1,1,'x'}, *y;
struct A {
int a;
float b;
char c;
} x = {1,2,'x'}, *y;
struct A{
int a;
float b;
char c;
}

struct A a = {1, 1, 'a'};// C++     struct
typedef struct {
int a;
float b;
char c;
} A;

A a = {1,1,'a'};

さらに
:CとC++はstructのビットフィールドを実装できます.フィールドのタイプは整数(signedかunsignedかを宣言することが望ましい)または列挙で、名前のないフィールドを使用して間隔を指定できます.
struct A
{
usigned int SN : 4;
unsigned int : 4;
bool goodIn : 1;
boll goodTorgle : 1;
};

二、structとclassの違い
(1)CのstructとC++のclassの違い.(2)C++におけるstructとclassの違い.1つ目の場合structはclassと非常に明らかな違いがある.Cはプロセス化された言語であり、structは複雑なデータ型として定義されているだけで、structではメンバー変数しか定義できず、メンバー関数を定義できない(純粋なC言語ではstructではメンバー関数を定義できず、変数しか定義できない).例えば、次のCコード断片:
 
   
        struct Point
        {
                int x; //
                int y; //
                void print()
                {
                        printf("Point print
"); //
                };
}       ;


ここで7行目にコンパイルエラーが発生し、「関数はPoint構造体のメンバーにはできません」というエラーメッセージが表示されます.したがって,1つ目の場合structはデータ型にすぎず,オブジェクト向けプログラミングは使用できない.
今から2つ目の状況を見てみましょう.まず、次のコードを見てください.
 
   
       #include
        using namespace std;
        class CPoint
        {
                int x;                  // private
                int y;                  // private
                void print()             // private
                {
                        cout << "CPoint: (" << x << ", " << y << ")" << endl;
                }
        public:
                CPoint(int x, int y)      // , public
                {
                        this->x = x;
                        this->y = y;
                }
                void print1() //public
                {
                        cout << "CPoint: (" << x << ", " << y << ")" << endl;
                }
        };

        struct SPoint
        {
                int x;              // public
                int y;              // public
                void print()         // public
                {
                        cout << "SPoint: (" << x << ", " << y << ")" << endl;
                }
                SPoint(int x, int y)  // , public
                {
                        this->x = x;
                        this->y = y;
                }
        private:
                void print1()      //private
                {
                        cout << "SPoint: (" << x << ", " << y << ")" << endl;
                }
        };

        int main(void)
        {
                CPoint cpt(1, 2);  // CPoint
                SPoint spt(3, 4);  // SPoint

                cout << cpt.x << " " << cpt.y << endl;  //
                cpt.print();       //
                cpt.print1();      //

                spt.print();      //
                spt.print1();     //
                cout << spt.x << " " << spt.y << endl;  //

                return 0;
        }


上のプログラムではstructには構造関数やメンバー関数もありますが、継承、虚関数などclassの他の特性もあります.従ってC++のstructはCのstruct機能を拡張する.何が違うのでしょうか?
main関数内のコンパイルエラーはすべてprivateメンバーへのアクセスによるものです.したがって、classのデフォルトのメンバーアクセス権はprivateであり、structではpublicであることがわかります.クラスの継承方法ではstructとclassにはどんな違いがありますか?次の手順を参照してください.
 
   
       #include
        using namespace std;
        class CBase
        {
        public:
                void print()                //public
                {
                        cout << "CBase: print()..." << endl;
                }
        };
        class CDerived1 : CBase        // private
        {
        };

        class CDerived2 : public Cbase   // public
        {
        };

        struct SDerived1 : Cbase        // public
        {
        };

        struct SDerived2 : private Cbase  // public
        {
        };

        int main()
        {
                CDerived1 cd1;
                CDerived2 cd2;
                SDerived1 sd1;
                SDerived2 sd2;

                cd1.print();    //
                cd2.print();
                sd1.print();
                sd2.print();    //

                return 0;
        }


親をprivateで継承するサブクラスオブジェクトは、親のpublicメンバーにアクセスできないことがわかります.class継承のデフォルトはprivate継承であり、struct継承のデフォルトはpublic継承である.また、C++テンプレートでは、タイプパラメータの前にclassまたはtypenameを使用することができ、structを使用すると意味が異なり、structの後ろには「non-type template parameter」が付いており、classまたはtypenameの後ろにはタイプパラメータが付いています.
実際,C++にstructを保持するキーワードは,C++コンパイラがC開発のプログラムと互換性を持つようにするためである.
classの親がstructキーワードで記述されている場合、デフォルトのアクセスプロパティは何ですか?
この場合、デフォルトがpublic継承なのかprivate継承なのかは、ベースクラスではなくサブクラスに依存します.classはstruct修飾からクラスを継承できます.デフォルトはprivate継承です.また、structはclass修飾クラスから継承することもできます.デフォルトではpublic継承です.継承プロパティは以下のように説明されています.
 
   
class B:A{}; // private
 
class A{};
struct B:A{}; // public

答え:次の2つのケースに分けます.
CのstructとC++のclassの違い:structは複雑なデータ型として定義されているだけで、オブジェクト向けのプログラミングには使用できません.
C++のstructとclassの違い:メンバーアクセスおよび継承方法の場合、classではprivateがデフォルトであり、structではpublicがデフォルトです.classはテンプレートタイプを表すためにも使用できますが、structはできません.
三、Structとunionの違い
CとC++のunion:異なるデータ型を格納できるデータフォーマットですが、そのうちの1つしか格納できません.
Unionの宣言、初期化および使用
union one4all
{
int int_val;
long long_val;
double double_val;
};
one4all a;
a.int_val = 15;
a.double_val = 1.38;
 
  
 
   
   
  
union one4all
{
int int_val;
long long_val;
double double_val;
} a = {5};//         1      ,     {}
struct A
{
char brand[20];
int type;
union one4all
{
    int int_val;
    long long_val;
    double double_val;
} id_val;
};

A prize;
A.id_val.int_val = 4;
 
  
struct A
{
char brand[20];
int type;
union 
{
    int int_val;
    long long_val;
    double double_val;
} ;
};

A prize;
A.int_val = 4;//           struct   ,      。

structのsizeof は、 により のsizeofが になるため、(デフォルトの では)struct s 1{char a;double b;int c;char d;};
struct s2 {  char a;  char b;  int c;  double d; };
cout< cout<
じ2つのcharタイプ、1つのintタイプ、1つのdoubleタイプですが、 のため、サイズが なります. の きさを するには を いることができ,まず,CPUは の を し, の からs 1とs 2の はいずれも の タイプ,すなわちdoubleタイプの 8をとる. に、 の を します.s 1については、まずaを8の に き、0と すると、このとき の きアドレスは1であるが、 の dはdoubleタイプであり、8の に くべきであり、1に も いアドレスは8であるため、dは8に かれ、このとき の きアドレスは16となり、 の cの は4,16で たされるので、cは16に かれ、このとき の きアドレスは20となり、 の dは 1を とし、ちょうど に ちるため、dは20に かれ、 はアドレス21で する.s 1の きさは8の を とするため、21−23の は され、s 1の きさは24となる.s 2については、まずaを8の に き、0と すると、このとき の きアドレスは1であり、 の の も1であるため、bは1に かれ、 の きアドレスは2になる. の cの は4なので、2に も いアドレス4を ってcを し、 の きアドレスは8になり、 の dの は8なので、dは8に され、すべての が され、 は15で し、 を するのは16で、ちょうど8の である.
unionでのメモリの :
#include
union{
int i;
char x[2]; }a;
voidmain()
{
a.x[0]=10;
a.x[1]=1;
printf("%d",a.i);
 }
コンビネーションaには、 xおよび iの2 のデータ が されている.ここで、 は16ビットであり、 サイズが2の は8 X 2=16ビットである.これにより、コンパイラは、コンビネーションaのためにメモリに16ビットの を き、この にはコンビネーションのデータが されるが、この は16ビットしかなく、 のデータであり、 のデータでもある.もしあなたのプログラムが の からこの を したら、それは2つの で、もしあなたのプログラムがこの を の から したら、それは です.あなたのプログラムを にとると、 16ビットの が かれています.そして、 の にはまだ が り てられていないと します.     a.x[1] = 1;その 、16ビットの は:00001010 1になり、プログラムはprintf("%d",a.i)を します. aを ではなく として する.すると、プログラムはこの16ビットを な にしました:(00000001,000,01010)バイナリ=(266)10