ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[C++] #define private public

 
■[c/c++]#define private public

というのを見かけて、ちょちょちょ!!

と思った。
神様なんて信じない僕らのために

[C++] const 修飾子

 
const修飾子は、以下のいずれかの制御を行なう。

  1. 値を変更不可とする.
    const int i = 3;
    
    int const i = 3;
  2. 参照先の値を変更不可とする.
    const int* pi = &i;
  3. ポインタそのものを変更不可とする。
    int* const pi;
  4. ポインタそのものと参照先の値の両方を変更不可とする.
    const int* const pi = &i;


const char* const **const
const char *const *const*


const修飾子が沢山ある場合には、その意味付けが
当該の変数に対して意味付けされたものか、
または、ベースとなる型について意味づけられたものかを
見分けるとわかりやすい。
ベースとなる型は、上記の例で言えば、青字の部分。


追記 '07.01.17
エキスパートCプログラミング
-知られざるCの深層
に複雑な宣言文を読み解くためのアルゴリズムが記述されている。

[C++] 部分式の評価順序

 
C++ の理解し難い仕様。

部分式の評価順序は定義されていないのだと。

「プログラミング言語C++ 第2版」
3.2.2  評価順序
式の中で部分式を評価する順序は定義されていない。

int i = 1;
v[i] = i++;

は、 v[1]=1 と評価されるかもしれないし、v[2]=1 かもしれない。


「プログラミング言語C++ 第3版」
6.2.2  評価の順序
 式の内部に含まれている下位式の評価の順番は定義されていない。特に式が左から右へ評価されることを前提としてコードを書いてはならない。
引用はしなかったが、括弧を使えば強制的に評価順序を指定できるとあるので早速、
((cout << to_hex(n)) << " ") << to_hex(m) << endl;
としてみたが、相変わらず、to_hex(m) から評価されてしまう。。(コンパイラはgcc version 3.4.4)

[C++] リファレンス型とオーバーロード

 
リファレンス型で関数オーバロードを試す。
void foo(int i){ }
void foo(int& i){ }

int main(){
        return 0;
};
これは問題なくコンパイルできた。
しかし、実際にこれらの関数を呼び出すと
void foo(int i){ }

void foo(int& i){ }

int main(){
int i;
foo(i);
return 0;
};

C:temp>g++ tmp3.cc

tmp3.cc: In function `int main()':
tmp3.cc:6: error: call of overloaded `foo(int&)' is ambiguous
tmp3.cc:1: note: candidates are: void foo(int)
tmp3.cc:2: note: void foo(int&)

曖昧な呼出しということでコンパイラが通らない。

そこで「プログラミング言語C++[第2版]」を参照。
任意の型 T について、T と T& では受理する初期設定子値の集合が同じであるため、引数型がこの点においてのみ異なる関数は、同じ名前を持ってはならない.例えば、

    int f(int i)

{
// . . .
}
int f(int& i) //エラー: 関数型の違いが充分でない
{
// . . .
}

(r.13 多重定義より)


初期設定子値の集合?
次の例を考えると int i, j は 即値(リテラル)を受け付けるのに対して、int& k は受け付けない。
初期設定子値の"集合"は異なるように思うが。。
int i = 1;
int j = i;
int& k = i;


どいうことだろうか。
その答えは多分、r.13.2 引数の一致 にある。
769頁
順序だけが異なる自明変換の列は区別できない。型T,const T,volatile T,T&,
const T&,及び,volatile T&の引数を持つ関数は,正確に同じ値集合を受理することに注意されたい.

[C++] デフォルトコンストラクタ

 
デフォルトコンストラクタは、クラスにコンストラクタ*が何も宣言されないときにのみ生成される。

*コピーコンストラクタを含む