C ++の構造とクラス
C ++は、組み込み開発の少数言語であり続けますが、プロジェクトが大きくなりすぎてCを効率的に使用できない場合に、開発者によって一般的に採用されます。これらの開発者は通常、CからC ++に移行しており、言語間の微妙な違いは、学習曲線の重要な部分を表しています。 C ++には、Cと同じように、同じではない構造があります。 C ++には、構造に非常によく似たクラスがあります。この記事では、これらの言語要素の詳細を明らかにします。
Cの構造体
Cの構造体は、カスタマイズされた複合データ項目(オブジェクト)であり、既存の組み込みデータ型( int )から構築できます。 、 char など)、ビットフィールド(指定されたビットサイズの整数)およびその他の構造。アイデアは、一緒に属するデータのいくつかのアイテムを集約することです。たとえば、3次元座標を保持する構造は次のようになります。
構造体座標{floatx;フロートy; float z;};
このコードは、コンパイラに構造体座標を通知します。 のように見えます。次に、このタイプの変数を次のように宣言できます。
構造体座標の場所;
変数場所 タイプは構造体座標です その内部フィールドは、「ドット」演算子を使用してアドレス指定できます:
location.x =1.0; location.y =2.0; location.z =9.99;
もちろん、同様の効果は3つの別々のフロートを使用して達成できます。 location_x のような名前の変数 など。ただし、場所の処理ははるかに簡単です。 関数などに渡すことができる単一の変数として。
ビットフィールドを含める機能により、構造体にはCの他の場所では利用できない機能が提供されます。例を次に示します。
struct bitreg {unsigned up:3;サインダウンなし:3;符号なし極性:2;};
タイプ struct bitreg の変数の各フィールド 特定のビットサイズがあります。コンパイラーは、データが適切な方法で格納されることを保証するため、このような変数が1バイトに収まることが期待されます。さらに、バイト内のフィールドにアクセスするためのすべての「ビットバッシング」コードが自動的に生成されます。したがって、プログラマーはこれらに簡単にアクセスできます。
struct bitreg control; control.up =1; control.down =2; control.polarity =3;
ほとんどの場合、Cで構造体を使用することは非常に簡単であり、実行効率に影響を与えることなくコードを理解しやすくします。ただし、組み込み開発者が注意する必要がある2つのポイントがあります。
- 最新のハイエンド(通常は32ビット)プロセッサには、構造体の使用に容易に対応できる命令セットがあります。確かに、彼らはまさにこれを行うように設計されました。ただし、ほとんどのローエンドCPUはそのような効率を提供しないため、構造の使用には注意が必要です。
- ビットフィールドは優れた機能であり、効率的で読みやすいコードを作成できます。組み込み開発者は、すぐに機会を見つけることができます。ビットフィールドを使用してデバイス制御レジスタにアクセスします。多くの周辺機器には、さまざまなビットフィールドを含む1ワードまたは1バイト幅のレジスタがあります。これは素晴らしい一致のように見え、時にはそれを機能させることができます。ただし、2つの問題があります。
- ビットフィールドの正確なレイアウトは、コンパイラによって決定されます。すべてがデバイスに正しくマッピングされている場合、コードは正常に機能する可能性があります。ただし、コンパイラを変更したり、コンパイラを更新したりすると、コードが破損する可能性があります。
- ビットフィールドにアクセスするためにコンパイラによって生成されたコードは、多くの場合、多数のAND / OR演算とレジスタへの複数のアクセスを使用するため、問題が発生する可能性があります。さらに、一部のデバイスレジスタは書き込み専用であり、コンパイラで生成されたコードには対応できません。
C構造体は新しいデータ型のように見えますが、実際にはそうではありません。データ型には通常、実行可能な一連の操作があります。これはC構造体には当てはまりません。 C構造体へのポインタを作成する以外に、C構造体に対して何かを行うには、内部フィールドにアクセスする必要があります。この問題はC ++で対処されています。
C ++のクラス
C ++言語には、多くのオブジェクト指向機能があります。これらの1つは、クラスの概念です。 、これにより、新しいデータ型のようなものの記述が可能になります。変数(通常はオブジェクトと呼ばれます )インスタンス化される場合があります クラスから;つまり、この新しいタイプのオブジェクトです。
C ++クラスは、C構造体とほぼ同じ構文であり、いくつかの非常に類似した機能を備えています。ただし、いくつかの重要な違いがあります:
- クラスには関数(メソッドと呼ばれる)を含めることもできます 。
- メンバー変数とメソッドは、宣言が public:に従わない限り、外部から隠されています。
- クラス(オブジェクト)のインスタンスがそれぞれ作成および破棄されるときに自動的に実行される、コンストラクタとデストラクタの2つの特別なメソッドが存在する可能性があります。
- 新しいデータ型で作業する演算子は、特別なメソッド(メンバー関数)を使用して定義できます。
- 1つのクラスを別のクラスの定義の基礎として使用できます(これは継承と呼ばれます) 。
- 新しいタイプの変数(クラスのインスタンス、オブジェクト)を宣言するには、クラスの名前(キーワードクラス)だけが必要です。 必須ではありません。
これらの機能のほとんどは、この例で示されています:
class myclass {char a; int b; public:void fun();私のクラス(); 〜myclass();}; myclass myobj; myobj.fun();
メンバー変数 a および b 3つのメンバー関数 fun()にのみアクセスできます 、 myclass() および 〜myclass() 。後者の2つの関数は、コンストラクタとデストラクタです。 fun()のみ ユーザーコードによって呼び出される可能性があります。 3つの関数すべての実際のコードは、他の場所で定義され、 ::を使用してクラスに関連付けられます。 したがって、演算子:
void myclass ::fun(){...
C ++の構造
クラスに加えて、C ++には、Cと下位互換性のある構造があります。ただし、C ++構造には、クラスが持つのと同じ追加機能もあります。これは、C ++の構造体とクラスの唯一の違いです。これまで見てきたように、クラス内のメンバー変数と関数のデフォルトのアクセシビリティはプライベートです。構造体のデフォルトはpublicです。したがって、以前のクラスの機能も次のように表すことができます。
struct mystruct {void fun();私のクラス(); 〜myclass(); private:char a; int b;};
C ++でのクラスと構造の使用
この情報を取得したら、それを過度に悪用しないように促されます。追加の機能が必要な場合に、Cおよびクラスで提供される種類の機能の構造のみを使用する理由はたくさんあります。主に、それはコードの可読性の問題です。別の開発者は詳細についてあまり明確ではない可能性があり、「非標準」の方法で記述されたコードは混乱を招きます。
コードを作成する際の重要な優先事項は、コードが読み取り可能(=保守可能)であることを確認することです。誰か(あなたかもしれません)は、1年以内にこのコードを見て、それが何をするのかを理解する必要があるかもしれません。いくつかのアドバイス:あなたのコードを維持する人は、忍耐力が限られており、あなたの自宅の住所を知っている武装した精神病質者であると仮定します。
埋め込み