C++の実験をしてみました

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

C++の実験をしてみました

投稿記事 by MoNoQLoREATOR » 13年前

①関数名と仮引数名が同じ場合はどのように解釈されるのか
コード

CODE:

int func(int func){
	++func;
	if(func

class test{
public:
	int & function(){
		static int var = 0;
		return var;
	}
};

int main(){
	test ins1;
	test ins2;

	ins1.function() = 1;

	printf("ins1:%d\n", ins1.function() );
	printf("ins2:%d\n", ins2.function() );
}
結果

CODE:

ins1:1
ins2:1
ですよねーw
関数の実体は1つですからね。
でもまあ、これを利用して、実体をどこにも記述しなくて良いクラス内static変数を擬似的に再現できますね。
私は昔から疑問に思ってたんですよ。
なんで実体をどこかに定義しなくちゃいけないんだと。
”どこか”って言ってるんだからどこかのスコープの中に書いて、スコープを限定できるのかと思ったらそうでもないし。
グローバル空間に定義することが決まってるんだから、明示的に書く必要はないでしょ。

ってことで、MoNoQLoREATORのスーパー実験タイムでした。
それでは良いプログラミングライフを!

アバター
へろりくしょん
記事: 92
登録日時: 14年前

Re: C++の実験をしてみました

投稿記事 by へろりくしょん » 13年前

また危険な実験してますね。

上記のコードの場合は、メンバ関数 function() の実体は1つだけとは限らないのですが、その場合でも static int var の実体は1つです。


こうやって実際に試していく事も非常に大切ですが、処理系依存という地雷を踏むリスクを背負います。

仕様を知りたいのならば仕様書を読むのが一番です。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: C++の実験をしてみました

投稿記事 by MoNoQLoREATOR » 13年前

返信ありがとうございます。
関数の実体が1つでないなんてことが有りうるのですか!?

ISLe
記事: 2650
登録日時: 14年前

Re: C++の実験をしてみました

投稿記事 by ISLe » 13年前

クラスの定義で関数本体を定義するとインライン展開がデフォルトなので、関数として存在するかどうかすら分かりませんよ。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: C++の実験をしてみました

投稿記事 by MoNoQLoREATOR » 13年前

そういえばクラスのメンバ関数はデフォルトでインライン関数に設定されるんでしたね。
なるほどそういうことですか。