4

私が理解できないコードを見つけたプロジェクトに出くわしました。から始めたばかりC++なので、私にとっては大きな問題のようです。プロジェクトのいくつかの行を提供していますが、理解できません。

class abc
{
     public:
       //some stuff
       abc();
};

abc::abc()
{
    int someflag = 0;
    //code
    if(someflag == 0)
    {
         do
         {
             //few strcpy operations
             {                 //(My Question)Without any condition braces started
                   //variable initialization
             }
         }while(condition);
    }
}

今私の質問...

  1. この操作を行うことで何が達成できますか?
  2. do-whileループのブレース内で何が起こっていますか?
  3. do-whileループ内の初期化された変数(私が言及した)のスコープは何 ですか?
  4. C++11ですか?

これを理解するのを手伝ってください。

4

4 に答える 4

7
  • この操作を行うことで何が達成できますか?

内部の変数にスコープ ブロックを導入します。

  • do-while ループのブレース内で何が起こっていますか?

上記を参照。

  • do-while ループ内の初期化された変数 (前述) のスコープは何ですか?

変数は中括弧の最後で範囲外になります。それらはその唯一の理由でそこにあります。これについて私が考えることができる 1 つの使用例は、scoped_lockマルチスレッド アプリケーションの場合です。

  • C++11ですか?

いいえ。

于 2013-08-07T05:20:37.873 に答える
2

C でも、ステートメントが許可されている任意の場所でブレースを開くことができます。

これにより、外側のスコープに干渉することなく、新しい変数を宣言して使用できます。例えば:

... code before ...
{
    int i = 0, sum = 0;
    while (i < n) {
        sum += dothis(data[i++]);
    }
    dothat(sum);
}
... code after ...

これらの 2 つの変数は、ブロックに入るときに作成され、ブロックを出るときに破棄されます (代わりにiとが外部で定義されます)。これにより、宣言と使用の間、または宣言と初期化の間の分離を回避することで可読性を高めることができます (古い C では、使用の直前に変数宣言を置くことは許可されていませんでした... すべてのローカル変数は関数の開始時に宣言する必要がありました: 厄介な問題です)。それらに与える価値がまだわからない場合)。sumndata

C++ を使用していて、これらのブロック ローカル変数にクラス型がある場合、コンストラクターはブロックに入るときに呼び出され (関数に入るときではありません)、ブロックを出るときにすぐに破棄されます。これは、ロックなどに非常に役立ちます。

 {
     Lock mylock(resource);
     use_resource();
 }
于 2013-08-07T05:42:39.227 に答える
1

答えは次のとおりです。

答え1、2。これは、新しいスコープを定義するために使用されます。

回答 3.変数のスコープは、コントロールがブロックの外に移動するとすぐに終了します

回答 4.おそらくコーダーは C のバックグラウンドから来ており、C のように C++11 に固有のものではなく、変数は新しいスコープの先頭でのみ宣言できます。

詳細については、 THISおよびTHISを参照してください。

于 2013-08-07T05:17:05.567 に答える
0

C++ には 5 種類のスコープがあります。

Function
File
Block
Function Prototype
Class

あなたが共有したコードは「ブロックスコープ」を示しています

ブロックスコープ

ブロックは、中括弧 ( {....} ) 内に含まれる C++ コードの一部です。ブロック内で宣言された識別子にはブロック スコープがあり、その定義点から最も内側の包含ブロックの末尾まで表示されます。ブロック内で識別子名が重複していると、ブロック外で定義された同じ名前の識別子の値が隠されます。ブロックで宣言された変数名は、そのブロックに対してローカルです。そのブロックとその下に含まれる他のブロックでのみ使用できます。

于 2013-08-07T05:26:24.417 に答える