struct class unionの違い
9499 ワード
一、CにおけるstructとC++structの違い
C言語ではstructは集約データ型にすぎず、権限設定がなく、メンバー関数を追加できず、オブジェクト向けのプログラミングが実現できず、typedef構造名がなければ、構造変数を宣言するにはキーワードstructを追加する必要があります.
C++ではstruct機能が大幅に拡張され、権限設定(デフォルト権限はpublic)が可能であり、classのようにメンバー関数があり、継承(デフォルトpublic継承)が可能であり、オブジェクトに対するプログラミングを実現することができ、構造変数を宣言する際にキーワードstructを省略することができる.
CおよびC++のstructの宣言、初期化、および使用方法:
さらに
:CとC++はstructのビットフィールドを実装できます.フィールドのタイプは整数(signedかunsignedかを宣言することが望ましい)または列挙で、名前のないフィールドを使用して間隔を指定できます.
二、structとclassの違い
(1)CのstructとC++のclassの違い.(2)C++におけるstructとclassの違い.1つ目の場合structはclassと非常に明らかな違いがある.Cはプロセス化された言語であり、structは複雑なデータ型として定義されているだけで、structではメンバー変数しか定義できず、メンバー関数を定義できない(純粋なC言語ではstructではメンバー関数を定義できず、変数しか定義できない).例えば、次のCコード断片:
ここで7行目にコンパイルエラーが発生し、「関数はPoint構造体のメンバーにはできません」というエラーメッセージが表示されます.したがって,1つ目の場合structはデータ型にすぎず,オブジェクト向けプログラミングは使用できない.
今から2つ目の状況を見てみましょう.まず、次のコードを見てください.
上のプログラムではstructには構造関数やメンバー関数もありますが、継承、虚関数などclassの他の特性もあります.従ってC++のstructはCのstruct機能を拡張する.何が違うのでしょうか?
main関数内のコンパイルエラーはすべてprivateメンバーへのアクセスによるものです.したがって、classのデフォルトのメンバーアクセス権はprivateであり、structではpublicであることがわかります.クラスの継承方法ではstructとclassにはどんな違いがありますか?次の手順を参照してください.
親を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継承です.継承プロパティは以下のように説明されています.
答え:次の2つのケースに分けます.
CのstructとC++のclassの違い:structは複雑なデータ型として定義されているだけで、オブジェクト向けのプログラミングには使用できません.
C++のstructとclassの違い:メンバーアクセスおよび継承方法の場合、classではprivateがデフォルトであり、structではpublicがデフォルトです.classはテンプレートタイプを表すためにも使用できますが、structはできません.
三、Structとunionの違い
CとC++のunion:異なるデータ型を格納できるデータフォーマットですが、そのうちの1つしか格納できません.
Unionの宣言、初期化および使用
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