MFCでソリューションを新規作成した時に作られるプログラムにちょこちょこと手を加えています。
以下のプログラムは、画面の中心に黒い円を描くプログラムの一部です。
void CChildView::OnPaint()
{
CPaintDC dc(this); // 描画のデバイス コンテキスト
CRect rect;
GetClientRect(&rect);
CPoint center = rect.CenterPoint();
const int sizeCircle = 60;
CSize offset(sizeCircle / 2, sizeCircle / 2);
CSize size(sizeCircle, sizeCircle);
CRect rectCircle(center - offset, size);
CBrush brush(RGB(0, 0, 0));
CBrush* pBrushOrg = dc.SelectObject(&brush);
dc.Ellipse(rectCircle);
dc.SelectObject(pBrushOrg);
}
どなたか以下のことを教もらえないでしょうか。
(1)CSize size(sizeCircle, sizeCircle);の部分ですが、size()はCSizeのメンバ変数ではないと思うのですが、size()の型がCSizeになっているのはどうしてでしょうか?
(2)上の続きで、size()関数は見る限りどこにも定義されていなかったのですが、どこかに元々定義があるのでしょうか?(元々というのは、Microsoft側で定義してくれているということです。)
(3)dc.Ellipse(rectCircle);の部分で、dc.とはどういう意味でしょうか?
どなたかお願いします。
No.2ベストアンサー
- 回答日時:
sizeは変数名であって、関数名ではありません。
C++では変数を定義する際、変数名の後ろに引数を書くことができるのです。
CSize size(sizeCircle, sizeCircle);
と書くのは、
CSize size;
size.cx=sizeCircle;
size.cy=sizeCircle;
と書くのと同じ動作をします。
なぜ同じ動作になるかというと、
CSize( int initCX, int initCY );
という「コンストラクタ」が定義されているからです。
これ以上の詳しい話は、「コンストラクタ」を調べるといろいろ書いてあるはずです。
No.1
- 回答日時:
広い意味では関数ですが 本来はコンストラクタといいます
コンストラクタにはそのオブジェクトを宣言する際に引数を伴うものと不要なもの(または省略可能なもの)があります
お示しのコードの中の
CRect rect;
CRect rectCircle(center - offset, size);
のrectやrectCircleはともに CRect型ですが rectは引数がありません
rectCircleは引数ありで 関数のような表記になっています
CRect型でいえば
CRect( int l, int t, int r, int b ); //4個の点
CRect( const RECT& srcRect ); // 元になる CRectから
CRect( LPCRECT lpSrcRect ); // RECT構造体を元にする
CRect( POINT topLeft, POINT bottomRight ); // 左上と右下のPOINT構造体
といった具合に ほかの方法で構築することも可能です
同様に CSizeについても
CSize( );
CSize( int initCX, int initCY );
CSize( SIZE initSize );
CSize( POINT initPt );
CSize( DWORD dwSize );
といった種類のコンストラクタがあります
2番目のCSize( int initCX, int initCY )を使って構築しているのですよ
CSize::CSize(int initCX, int initCY )
として定義されていて
CSize objSize( 50, 50 );
と定義すると objSizeが生成される際に CSize::CSizeが呼ばれて
必要な初期化が行われます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[C++]継承したクラスのコンスト...
-
void func( void )について
-
C++ template operator T()
-
引数で argc argvが使用され...
-
構造体のtypedef宣言
-
警告 ”値が割り当てられていな...
-
!とキャスト
-
C言語のコンパイルエラー
-
unsigned *という宣言について
-
C++/CLIでネイティブの構造体を...
-
DWORDの実際の型は何でしょうか
-
void main (void)について、、、
-
DLLでLIBファイルが作成されない
-
ループを使用して変数に格納したい
-
C++で構造体のコピーはできても...
-
MFC C++
-
2重定義って??
-
二つ以上の値を返す関数
-
マップとアルゴリズム
-
【#define】 defineで定義した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
main.c:7:43: warning: implici...
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
intとINTの違いは?
-
ハンドルされていない例外が発...
-
DDVによるメッセージの変更
-
変数の型を定義しなかった場合...
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
関数の実体定義にヘッダファイ...
おすすめ情報