C/C++知識点整理(3)


1.C++のコンストラクション関数とコンストラクション関数は異常を放出できますか?
A.だめだ
B.どちらでもいい
C.コンストラクタのみ可能
D.構造関数のみ可能
答え:C
コンストラクション関数はできるだけ異常を捨てないで、コンストラクション関数は異常を捨てないでください.コンストラクション関数の場合:コンストラクション関数に例外が投げ出されると、コンストラクション中のオブジェクトのコンストラクション関数は実行されません.オブジェクトが部分的に構築されると、構築が完了したサブオブジェクトは逆順序の解析(すなわち、異常発生点の前のオブジェクト)され、まだ構築が開始されていないサブオブジェクトは構築されません(すなわち、異常発生点の後ろのオブジェクト)が、構築中のサブオブジェクトとオブジェクト自体は構築を停止し、その解析関数ツリーは呼び出されません.解析関数について:more effective c++は2つの理由(解析関数が異常を放出できない理由):(1)解析関数が異常を放出した場合、異常点以降のプログラムは実行されず、解析関数が異常点の後に必要な動作を実行した場合、例えばリソースを解放した場合、これらの動作は実行されません.リソースの漏洩などの問題が発生します.(2)通常異常が発生すると,C++のメカニズムは既に構築されたオブジェクトの解析関数を呼び出してリソースを解放するが,このとき解析関数自体にも異常が投げ出されると,前の異常が処理されず,また新しい異常が発生してプログラムがクラッシュする.
解決策:アクションが例外を放出する可能性がある場合は、classは構造関数ではなく一般的な関数を提供してアクションを実行する必要があります.構造関数に異常が発生しないことを保証できない場合.try catchで異常を飲み込むことができます.すなわち,異常を構造関数の内部に完全にカプセル化し,異常を関数の外に投げ出さないようにする.
~ClassName()
{
  try{
      do_something();
  }
  catch(){  
  //       ,    catch                    
   }
}

2.次の4つのクラスA,B,C,Dは、32ビットマシン上でsizeof(A)、sizeof(B)、sizeof(C)、sizeof(D)の値がそれぞれ()
class A{
};
class B{
    char ch;
    int x;
};
class C{
public:
    void Print(void){}
};
class D {
public:
    virtual void Print(void){}
};

1、8、1、4
クラスAの空のタイプのインスタンスには、情報は含まれていませんが、メモリに一定のスペースを確保する必要があります.そうしないと、これらのインスタンスは使用できません.一般的には1です.
クラスBはメモリが揃っているので8です.
クラスCには関数があるが、関数のアドレスを知るだけでよいが、これらの関数のアドレスはタイプにのみ関係する、タイプのインスタンスに関係なく、コンパイラは関数のためにメモリに余分な情報を追加しない.だからまだ1.
クラスDには虚関数があるため、C++のコンパイラは、1つのタイプに虚関数があることを発見すると、そのタイプの虚関数テーブルを生成し、そのタイプの各インスタンスに虚関数テーブルを指すポインタを追加する.ポインタが1つ増えたので,32ビットマシンでは4,64ビットマシンでは8となる.
3.CSomethingがクラスであると仮定し、次の文を実行するとメモリに__が作成されます.個のCSomethingオブジェクト.
CSomething a();
CSomething b(2);
CSomething c[3];
CSomething &ra = b;
CSomething d=b;
CSomething *pA = c;
CSomething *p = new CSomething(4);

答え:6
CSomething a();//オブジェクトは作成されていません.ここではデフォルトのコンストラクション関数ではなく、C++Primer 393ページで説明されている関数を定義します.関数を定義します.パラメータは空で、戻り値はint func()のようなCSomethingオブジェクトです.
CSomething b(2);//パラメータのコンストラクション関数を使用して、オブジェクトを作成します.
CSomething c[3];//非パラメトリックコンストラクション関数を使用して、3つのオブジェクトを作成します.
CSomething &ra=b;//raはbを参照し、新しいオブジェクトは作成されません.
CSomething d=b;//コピーコンストラクション関数を使用して、新しいオブジェクトdを作成します.
CSomething *pA = c;//ポインタを作成し、オブジェクトcを指し、新しいオブジェクトを構築しません.
CSomething *p = new CSomething(4);//オブジェクトを新規作成します.
4.以下の手順がある
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
  int m=0123, n = 123;
  printf("%o %o
"
, m, n); return 0; }

プログラム実行後の出力結果は()A.01123,0173 B.0123,173 C.123,173 D.173
答え:C
o%は8進法でint m=0123を出力することを示す.mは既に8進法であり、変換を必要としないが、n=123は10進法であり、8進法変換を必要とする173である.
5.虚関数についての記述が正しいのは()
A.派生クラスの虚関数とベースクラスの虚関数は異なるパラメータの個数とタイプを有する
B.インライン関数は虚関数ではない
C.派生クラスはベースクラスの虚関数を再定義する必要がある
D.虚関数はstatic型の関数であってもよい
答え:B
インライン関数はコンパイラで展開され,コードをプログラムに埋め込み,虚関数は動的にバインドされ,実行期間が決定される.したがって、インライン関数は虚関数ではありません.
6.以下の手順がある
#include <stdio. h>
int fun( intA )
{
    int b = 0;
    static int c = 3;
    a = ( c + +,b + + );
    return ( a );
}
main( )
{
    int a = 2,i,k;
    for( i = 0;i<2;i + + )
        k = fun( a + + );
    printf("%d
"
,k ); }

プログラムの出力結果は?
答え:0
この問題はカンマ式、a=式1、式2、a=式2を試験し、同じ理屈で後にn個の式があれば、最後の式の値を返します.
7.次のセグメントがあります.
#include <iostream>

void GetMemeory(char *p)
{
    p = (char *)malloc(100);
}
void Test()
{
    char *str = NULL;
    GetMemeory(str);
    strcpy(str, "Thunder");
    strcat(str + 2, "Downloader");
    printf(str);
}

すみません、Test関数を実行した結果は次の通りです.
A.Thunder Downloader B.under Downloader C.Thunderownloader D.プログラムクラッシュ
答え:D
  • .パラメータは値伝達であり,関数はパラメータpに空間を再開するので,変化はpが指す空間でありstrは変化しない.
  • GetMemory関数の実行が完了した後もstrはNULLを指しているので、付与時に戻り潰れます.
  • 正しい方法は、デュアルポインタを使用する必要があります.
  • void GetMemory(char **p){
        *p = (char *)malloc(100);
    }
    void Test(){
        char *str = NULL;
        GetMemory(&str);
        printf(str);
    }
    

    8.リロード関数として使用できない呼び出しの根拠は次のとおりです.
    A.パラメータ個数B.パラメータタイプC.関数タイプD.関数名
    答え:C
    9.次のコードのコンパイルにエラーがありました.コンパイルエラーを解決するオプションはどれですか?
    class A {
        public:
            int GetValue() const {
                vv = 1;
                return vv;
             }
        private:
            int vv;
    };
    

    A.メンバー変数「vv」を「mutable int vv」に変更
    B.メンバー関数「GetValue」の宣言をconstでないように変更する
    C.コンパイルエラーを修正できない
    D.コンパイルエラーの修正が可能
    答え:D
    mutalbeの中国語の意味は「可変で、変わりやすい」で、constant(C++のconst)とは反義語です.
    C++ではmutableもconstの制限を突破するために設定されています.mutableで修飾された変数は、const関数でも常に可変の状態になります.
    クラスのメンバー関数がオブジェクトの状態を変更しない場合、このメンバー関数は一般的にconstとして宣言されることを知っています.しかし、constの関数でクラス状態に関係のないデータメンバーを修正する必要がある場合があります.このデータメンバーはmutalbeによって修飾されるべきです.
    10.クラスAから継承されるクラスBがあり、そのデータメンバーは以下の通りである.
    class A {
    ...
    private:
       int &a;
    };
    class B : public A {
    ...
    private:
         int a;
    public:
         const int b;
         A c;
         static const char* d;
         A* e;
    };
    

    コンストラクション関数では、メンバー変数がリストを初期化することによって必ず初期化されます.
    答え:b,c
    コンストラクション関数で初期化リストを初期化する必要がある場合は、次の3つがあります.const int aなどのconst修飾を持つクラスメンバー;2.int&pなどのメンバーデータを参照する.3.参照付きクラス変数
    staticメンバーはクラス内で初期化できません.constを除いて、static constメンバーは初期化リストにありますか?
    もちろん違います.1つはstaticがクラスに属し、インスタンス化されていないときにすでに存在し、コンストラクション関数の初期化リストは、インスタンス化されているときにのみ実行されます.2つ目はstaticメンバーがオブジェクトに属していないことです.コンストラクション関数を呼び出してオブジェクトを作成します.オブジェクトと直接関係のないメンバーが何をしますかo(^▽^)o.
    11.クラスAはクラスBの友元であり、クラスCはクラスAの公有派生クラスであり、特殊な状況を無視すると以下の言い方が正しいのは()A.クラスBはクラスAの友元である
    B.クラスCはクラスBの友元ではない
    C.クラスCはクラスBの友元である
    D.クラスBはクラスAの友元ではない
    答え:B,D
    友元関係は一方向であり、対称ではなく、伝達できない.伝達性については、父親の友人は必ずしも息子の友人ではないというたとえがある.対称性については、彼は彼女を友达にしたが、彼女は彼を友达にしなかったのではないでしょうか.(●ˇ∀ˇ●)