修飾子の要約を使用してC ++

修飾子の要約を使用してC ++

ベーシックタイプ修飾子

C ++はできます炭、int型とdouble配置修飾子、およびその他の基本データ型。基本的なタイプは、一般的に使用される修飾子は、次のとおりです。

  • signed

  • unsigned

  • long

  • short

修飾子署名は、署名のない、ロングとショート該当整数、符号付き符号なし該当文字、ロングは倍増するために適用することができます。

修飾子の符号付き符号なしのようなものであってもよい長い短いプレフィックス修飾子。例:unsigned int型のロング

C ++は、簡略表記が宣言することができ、符号なし短整数、または符号なしのロング整数あなたは書き込みのint、言葉だけ書き込むことができない、短い、符号なし、または符号なしのロングは、intが暗示されます。たとえば、次の2つのステートメントの両方が符号なし整数の変数を宣言します。

unsigned x;
// 等价于
unsigned int y;

C ++の符号付き整数と符号なし整数改質の違いを説明します。

#include <iostream>
using namespace std;

int main()
{
   short int i;           // 有符号短整数
   short unsigned int j;  // 无符号短整数
   j = 50000;
   i = j;
   cout << i << " " << j;
   return 0;
}

業績

-15536 50000

演算記号へのビットの兆候が存在しないため、テイク N - 2 n N-2 ^ n個 定義のデータ型Nに応じて算出方法、INT、短い、チャー、long int型等、Nのように計算かかる= 50000 Nのテキストとして符号なしの値、短い16ビット、です 50000 2 1 6 50000から2 ^ 16 -15536を得ました。

限定修飾子

const型

constのオブジェクトタイプは、プログラムの実行中に変更することはできません。C ++定数CONSTによって定義され、書き込み後のシンボルテーブル(シンボルテーブル)を、そのコンパイル時定数行う、ストレージを割り当てられない、また、読み出し動作を記憶するメモリ、例えばそれはその効率が非常に高いです。

揮発性タイプ

修飾子揮発性コンパイラは最適化変数を必要としないよう指示プログラムがメモリ変数から直接読み取ることができるので、**、volatile宣言。**一般的に、変数、メモリレジスタ内の変数の値は、書き込み効率をスピードアップするだろう変数のコンパイラ用に最適化されています。

あなたは揮発性宣言した変数の値を読みたい場合は、システムは常に、それがあるから、データメモリ再読み込みそれはちょうど、コマンドデータ、レジスタからではない値の前に読んでいた場合でもが、しかし、メモリからデータを読み込みます。揮発性は、特定のアドレスへの安定したアクセスを保証することができます。

VC 6、一般的なデバッグモードでnoコード最適化するので、このキーワードの影響を見ることができないことに注意してください。

揮発性のキーワードをテストするために、以下のアセンブリコードを挿入することにより、プログラム・コードの最終的な影響は、次のコードを入力します。

#include <stdio.h>
void main()
{
    int i = 10;
    int a = i;
    printf("i = %d", a);
 
    // 下面汇编语句的作用就是改变内存中 i 的值
    // 但是又不让编译器知道
    __asm {
        mov dword ptr [ebp-4], 20h
    }
    int b = i;
    printf("i = %d", b);
}

次のように、プログラムのデバッグモードバージョンでは、出力結果は、次のとおり

i = 10
i = 32

次のようにプログラムのリリースモードバージョンでは、出力結果は以下のとおりです。

i = 10
i = 10

結果は明らかに出力、リリースモード、コードの最適化のためのコンパイラを示し、第二は、出力Iの正しい値ではありません。以下に、私たちは私プラスvolatileキーワードを宣言し、何が起こるかを参照してください。

#include <stdio.h>
void main()
{
    volatile int i = 10;
    int a = i;

    printf("i = %d", a);
    __asm {
        mov dword ptr [ebp-4], 20h
    }
    int b = i;
    printf("i = %d", b);
}

デバッグとリリースバージョンは、プログラムを実行し、それぞれに、出力は次のようになります。

i = 10
i = 32

一般的には、以下でいくつかの場所での揮発性:

  • ;他のプログラムのための変数は、割り込みサービスルーチンの変更は揮発追加する必要が検出されました
  • タスク間で共有マルチタスク環境では符号が揮発性で追加する必要がありますです。
  • その異なる読み書きの各々は感知することができるので、メモリマップされたレジスタは、通常、揮発性のハードウェア記述を追加しました。

揮発性ポインタ

const修飾子と似た言葉、のconst定数ポインタとポインタ定数引数を持って、対応する概念がある揮発性:

ポインタ定数変更されたオブジェクトがポインタによって指し示さは、データは、揮発性またはCONSTです。

const char* cpch;
volatile char* vpch;

注:VCの場合、この機能はVC 8が安全である後に達成されます。

定数ポインタポインタ値そのもの -揮発性またはCONSTのアドレスを表す整数変数:

char* const pchc;
char* volatile pchv;

注意:

  • これは、非揮発性のint揮発int型に割り当てることができますが、非揮発性のオブジェクトは、揮発性のオブジェクトに割り当てられていません。
  • ユーザ定義型の基本的なタイプに加えて、揮発性タイプで修飾されてもよいです。
  • 揮発性識別子C ++クラスにだけクラス実装のサブセットによって制御インターフェースのサブセットにアクセスすることができます。ユーザーは、インタフェースのタイプへのフルアクセスを得るためにはconst_castを使用することができます。また、constのような揮発性は、クラスからそのメンバーに渡されます。

揮発性マルチスレッド

いくつかの変数は、揮発性のキーワードで宣言されています。** 2つのスレッドが特定の変数に使用される変数の値が変更され、それは揮発性で宣言されなければならない、重要な役割は、CPUレジスタにメモリから変数を最適化するコンパイラを防止することです。**データの一貫性を維持、ケース:

volatile  BOOL  bStop  =  FALSE;

スレッド(1):

while(  !bStop  )  {  
    // ...  
}  
bStop  =  FALSE;  
return;    

別のスレッド(2)は、上糸ループが終了します。

bStop  =  TRUE;  
while(  bStop  );  //等待上面的线程终止,如果bStop不使用volatile申明,那么这个循环将是一个死循环,因为bStop已经读取到了寄存器中,寄存器中bStop的值永远不会变成FALSE,加上volatile,程序在执行时,每次均从内存中读出bStop的值,就不会死循环了。

このキーワードは、メモリ内のオブジェクトの格納場所を設定するために使用され、登録しません。一般的な目的のコンパイラは、例えば命令、コードセグメントの実行速度を加速するためにレジスタにそのコピー可能性があるため。

// ...  
int  nMyCounter  =  0;  
for(;  nMyCounter<100;nMyCounter++)  
{  
	// ...  
}  
// ...

このコードでは、コピーはnMyCounter(常にこれの値をレジスタnMyCounterのサイクル試験及び動作)レジスタに格納されているが、コードの実行このような動作の追加のセグメントが存在してもよい。nMyCounter - = 1;この操作は、nMyCounter nMyCounterメモリ動作を変更することであるので、このような現象がある:nMyCounter変動が同期していません。

の種類を制限します

制限修飾ポインターは、それが指すオブジェクトにアクセスする唯一の方法です。唯一のC99は、制限修飾子の新しいタイプを追加します。主メモリへのポインタを変更するために使用される別のポインタを参照することはできません。

唯一の他のポインタまたはポインタ操作に基づいて、ポインタによって、すなわち、限界へのポインタと、オブジェクトへのアクセスを制限することは非常に良好であり、コンパイラの最適化、このポインタを介してアクセスすることが制限されます。

クラスのアクセス修飾子

データパッケージは、クラス型の内部メンバ関数への直接アクセスを防止する、オブジェクト指向プログラミングの重要な特徴です。アクセスはマークされ、ボディ領域内の各クラスのメンバーによって制限されている保護された、プライベート、パブリック指定します。

class Base {
   public:
  // 公有成员
 
   protected:
  // 受保护成员
 
   private:
  // 私有成员
};
  • 公共(パブリック)メンバー:クラスのプログラムの外側にアクセス可能です。あなたは、パブリック変数の値を設定および取得するために、任意のメンバ関数を使用することはできません。
  • プライベート(プライベート)メンバー:外部クラス内のプライベート変数やプライベート関数見ることが不可能でさえ、アクセスできません。クラスとフレンド関数だけは、プライベートメンバーにアクセスすることができます。デフォルトでは、クラスのすべてのメンバーはプライベートです。
  • プロテクション(保護)メンバー:保護または保護関数や変数のプライベートメンバーが一つの例外を除いて、非常に似ている、派生クラスのメンバーを保護するために(すなわちサブクラス)がアクセス可能です。

明示的な修飾子

C ++は、それはむしろ暗黙よりも、コンストラクタであることが効果である、変更するためのキーワードを明示的に、単一のパラメータクラスのコンストラクタを提供し、暗黙の言葉に対応する別のキーワード、手段は、暗黙の(暗黙の)として宣言されているデフォルトコンストラクタクラスを隠されました。

C ++、コンストラクタパラメータ(第1パラメータに加えて、他のパラメータは、マルチ引数コンストラクタのデフォルト値を有する)において、二つの役割を引き受けます。図1は、コンストラクタであり、2はデフォルト暗黙的型変換演算子です。

だから、時には我々はAAA = XXX、このようなコードとして書いた、とだけタイプXXX AAA単一引数のコンストラクタのパラメータ型であることを起こる、この時間は、コンパイラが自動的にAAAのオブジェクトを作成し、コンストラクタを呼び出します。

それは涼しいかのように、非常に便利になります。しかし、いくつかのケースでは(権威以下の例を参照)が、私たちの(プログラマ)の意図に反して。私たちは、コンストラクタの前に明示的に変更を加える必要があります。この時間は、このコンストラクタは、唯一の型変換演算子は、暗黙的に使用されないよう、使用/呼び出して明示的に指定することができます。

class Test1
{
    public:
    Test1(int n)
    {
        num=n;
    }//普通构造函数
    private:
    int num;
};
class Test2
{
    public:
    explicit Test2(int n)
    {
        num=n;
    }//explicit(显式)构造函数
    private:
    int num;
};

int main()
{
    Test1 t1=12;//隐式调用其构造函数,成功
    Test2 t2=12;//编译错误,不能隐式调用其构造函数
    Test2 t2(12);//显式调用成功
    return 0;
}

一般的なコンストラクタが暗黙的に呼び出すことができます。明示的なコンストラクタは、明示的に呼び出すことができます。

ストレージクラス修飾子

**定義されたストレージ・クラスC ++プログラム変数/関数が範囲(可視)とライフサイクル。**これらの指定子は、修飾されたタイプの前に置きました。以下のリストストレージ・クラスC ++プログラムが用意されています。

  • オート
  • 登録
  • 静的
  • 外部の
  • 可変
  • thread_local(C ++ 11)

C ++は17からスタート、オートキーがC ++クラス指定子を格納していないと、レジスタキーワードは廃止されました。

自動ストレージ・クラス

++ 11 Cので、自動の2つのケースで使用されるキーワード:変数、関数が返すプレースホルダ値の関数宣言を宣言するときに変数の型を自動的に初期化式から推測されます。

C ++ 98標準autoキーワードを自動変数を宣言するために使用されるが、最小及び不要の使用され、この使用は、C ++ 11で除去されています。

初期化式の変数は、次のような、型を推論自動的に宣言されます。

auto f=3.14;      //double
auto s("hello");  //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//错误,必须是初始化为同一类型

register記憶クラス

レジスタレジスタクラスに格納されたローカル変数の定義の代わりに使用されるRAMに格納されています。この手段は、最大サイズは可変レジスタ(典型的には、ワード)のサイズに等しいこと、及び(それはメモリ位置を有していないので)、それは単項「&」演算子はありません。

{
   register int  miles;
}

唯一のカウンタなどへの迅速なアクセスを必要とする変数のために登録します。また、変数がレジスタに格納されていないことを「レジスタ」という意味の定義は、それが変数はハードウェア制限及び実装に応じて、レジスタに格納されてもよいことを意味することに留意すべきです。

静的ストレージクラス

静的記憶域クラスは、すべてそれが入る時間や葉のスコープを作成および破棄することを必要とせずに、プログラムの有効期間内のローカル変数の存在を維持するために、コンパイラに指示します。したがって、修飾されたスタティックを使用してローカル変数は、関数呼び出し内のローカル変数の値の間に維持することができます。

static修飾子は、グローバル変数に適用することができます。ときにグローバル変数、変数のスコープの静的な修飾は、それがファイルで宣言された範囲内に制限されます。

externストレージ・クラス

externストレージ・クラスはグローバル変数への参照を提供するために使用され、すべてのプログラムファイルのグローバル変数が表示されます。あなたは「のextern」を使用すると、変数を初期化することができないため、それは保管場所の上に事前に定義された変数名を指します。

あなたが複数の文書を持っているし、他のドキュメントで使用できるグローバル変数や関数を定義するときは、他のドキュメントで使用できるのextern変数や関数定義された参照を取得します。それは理解することができる、のextern別のファイル内のグローバル変数または関数を宣言するために使用されます。

二つ以上のファイルがある場合に通常使用されているのextern修飾子は、同じグローバル変数または時間の関数を共有します

可変ストレージクラス

可変指定子は唯一のオブジェクトクラスに適用され、オブジェクトのメンバーは、代替定数を可能にします。すなわち、可変部材はconstメンバ関数によって修正することができるされています。

thread_localストレージクラス

使用thread_local説明変数の宣言は、それがそれで作成されたスレッド上でアクセスすることができます。変数は、スレッドの作成時に作成され、スレッドを破壊したときに破壊されています。各スレッドは、変数の独自のコピーを持っています。

thread_local指定子は、静的またはEXTERNと組み合わせることができます。

thread_localはthread_local関数宣言または定義が使用できない、唯一のデータ宣言および定義に適用することができます。

次のプレゼンテーションでは、変数のthread_localとして宣言することができます。

thread_local int x;  // 命名空间下的全局变量
class X
{
    static thread_local std::string s; // 类的static成员变量
};
static thread_local std::string X::s;  // X::s 是需要定义的
 
void foo()
{
    thread_local std::vector<int> v;  // 本地变量
}

参考資料

C ++修飾子タイプ
C / C ++ volatileキーワードで詳述
Cには、修飾子の役割制限++
C ++クラスのアクセス修飾子
C ++ストレージ・クラスを

リリース5元の記事 ウォンの賞賛0 ビュー56

おすすめ

転載: blog.csdn.net/taokexia/article/details/105360820