ここから本文です

次の宣言の意味がわかりません。

アバター

ID非公開さん

2014/5/3000:22:37

次の宣言の意味がわかりません。

C++初心者です。教科書で次のような宣言がありました。

float x, y ;
v2d() : x(0), y(0) {}
v2d(float a, float b ) : x(a), y(b){}
void glVertex() {glVertex2f(x,y);}
void glTexCoord(){ glTexCoord2f(x/ float(I->width),y/float(I->height)); }

この1行目は分かるのですが、2行目以降が分かりません。
2行目はそれぞれ関数なのか、:は何を意味しているのか?
3行目はglVertex()のうしろの{}は何を意味しているのか
4行目は3行目と同じ形に見えます。

解説お願いいたします。

閲覧数:
117
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tre********さん

2014/5/3002:22:22

weeksoilさんへ

たぶん、
class v2d{
public:
① float x, y ;
② v2d() : x(0), y(0) {}
③ v2d(float a, float b ) : x(a), y(b){}
④ void glVertex() {glVertex2f(x,y);}
⑤ void glTexCoord(){ glTexCoord2f(x/ float(I->width),y/float(I->height)); }
};

のようなクラス(class)か構造体(struct)の事なのだと思いますが、
:の後ろは、各メンバへの代入(正しくはコンストラクタを呼び出す)処理です。


②行目の、v2d() : x(0), y(0) {}は、
v2d(){x=0,y=0;}と同じ意味になります。
(これは「引数無しコンストラクタ」です。)

③行目の、v2d(float a, float b ) : x(a), y(b){}は、
v2d(float a, float b ){x=a,y=b;}と同じ意味になります。
(これは、「引数有りコンストラクタ」です。)

★コンストラクタは同じ名前で引数が異なるコンストラクタをいくつも定義する事が可能なのです。
★「関数のオーバーロード」や「コンストラクタのオーバーロード」で調べてみて下さい。

④行目の、void glVertex() {glVertex2f(x,y);}は、
void glVertex() {
glVertex2f(x,y);
}
であり、
glVertex()というメンバ関数で、メンバ変数x,yを引数としてglVertex2f()関数を呼び出しているように見えます。

⑤行目は割愛します。

↓こちらが参考になるかと思います。
http://kowaimononantenai.blogspot.jp/2012/10/c.html

http://wisdom.sakura.ne.jp/programming/cpp/cpp22.html

以上です。

アバター

質問した人からのコメント

2014/5/31 00:40:46

丁寧な解説ありがとうございました。理解することができました。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

n2q********さん

2014/5/3018:01:45

C 言語で main 関数を

int main() { return 0; }

こうやって書いても良いですよね。何でも1行で済ませてしまおうって考えるのなら、それで良いわけです。見た感じが気持ち悪いけど。それと同じです。

このたびのご質問ですが、こういうふうにすることが出来ますよ。

struct v2d {

float x, y ;
v2d();
v2d(float a, float b );
void glVertex();
void glTexCoord();

};

これで構造体定義(あるいはクラス定義)は終了。では関数を実装しましょう。

v2d::v2d()
: x(0) //メンバ変数 x を 0 で初期化
, y(0) //メンバ変数 y を 0 で初期化
{
//他にやることが無い
}

v2d::v2d(float a, float b )
: x(a) //メンバ変数 x を a で初期化
, y(b) //メンバ変数 y を b で初期化
{
//他にやることが無い
}

void v2d::glVertex()
{
glVertex2f(x,y);
}
void v2d::glTexCoord()
{
glTexCoord2f(x / float(I->width), y / float(I->height));
}

こうです。これをまとめて短くした書き方だったっていう話。ちょっと見にくいですよね。でも同じものです。

≪備考≫

メンバ変数の初期化ですが、

v2d::v2d()
{
x = 0;
y = 0;
}

こうやってしまうと、代入なんですよね。初期化じゃないのですよ。x と y は未初期化の状態でインスタンス化されてしまうのです。

float x;
x = 0;

これと

float x = 0;

これの違いです。

const を使ってみると、違いはハッキリしますよ。

const float x = 0;

これ、代入は出来ないでしょ。同じく、

struct sample {

sample() : x(0) { } //これは OK です。
sample() { x = 0; } //これは NG です。

const float x;

};

const じゃなかったらどっちでも良いかって?いや、それは…。できるだけ初期化することをお勧めします。何年かすると、初期化してて良かったって思える時が来ると思いますので。

foo********さん

2014/5/3006:51:22

略されてますが、たぶん class v2d (もしくは struct v2d) { ... }; の
中味だろうと想像。 その前提で。

2行目・3行目は「コンストラクタ」です。
: から { までは、「初期化子」と呼ばれる、コンストラクタに
だけ許された、メンバ変数の初期化を行う部位。

3行目・4行目 は、C言語と同じ構文。
{ ... } は、当該関数の、実装です。
# C言語と違って「メンバ関数」ではありますが。


C++ クラス のごく基本的な構文知識です。
お手元の教科書・参考書、ネット上の初学者向けサイト、
どこでも書いてあると思うけど...。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる