質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6158閲覧

c++ 変数の初期化でどれがどう違うのが混乱している。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/07/24 07:00

編集2019/07/24 07:10

dxlibを使ってc++でヘッダーとソースファイルで定義と宣言を分けていて
どっちでもいい場合についてどう処理が変わるか知りたくて質問しました。
////////////コメント部の

クラスの変数を初期化するときに
下記の2番目は代入と初期化どっちなのか知りたい。
1,コンストラクタ内で初期化するべきなのか 代入
2,変数宣言時に同時に初期化するべきなのか? ←これは代入なのか初期化なのか知りたいです。
3,コンストラクタで:a(0) のように初期化するべきなのか 初期化?
その処理の違いを知りたいです。

またメンバ関数の外で一時変数を書く時はどうしたらいいの知りたいです
面倒ですが全てヘッダーに書いたほうがいいのかソースファイルでstaticをつけるとそのソースファイルだけで使えるのでそうするのか
どうなのか知りたいです。

※なおLoadDivGraphなどのDxlib関数は関係なので無視し構いません。

#ifndef ___PLAYER_H #define ___PLAYER_H #include "Chr.h" class Player : Chr { private: position pos; int g_handle[8];//画像格納ハンドル /*座標の取得と設定*/ void Chr::sPos_x(int xx); void Chr::sPos_y(int yy); int Chr::gPos_x(); int Chr::gPos_y(); void input_key();//キー入力 void gravity(); const int jump_max = 50;//ジャンプ最大値//////////////////////// public: Player(const char* str,int xx,int yy); void Chr::Update(); void Chr::Draw_Update(); }; #endif
#include "Input.h" #include "Player.h" #include "DxLib.h" /*コンストラクタ*/ Player::Player(const char* str,int xx,int yy) { LoadDivGraph(str,7,7,1,64,64,g_handle); pos.x = xx;//////////////// pos.y = yy;/////////////// } /*計算更新*/ void Player::Update() { input_key(); //gravity(); } /*描画更新*/ void Player::Draw_Update() { DrawFormatString(100,100,GetColor(255,255,255),"Debug"); DrawGraph(gPos_x(), gPos_y(), g_handle[0], true); } static int j = 10;///////////////// static int n = 30;//////////////// /*キー入力*/ void Player::input_key() { if (keybord(KEY_INPUT_LEFT) > 0) { sPos_x(-5); } if (keybord(KEY_INPUT_RIGHT) > 0) { sPos_x(+5); } /*ジャンプ*/ if (keybord(KEY_INPUT_SPACE) > 0) { n = (n - 2); if (n <= 0) { n = 0; } sPos_y(n); } else { n = 30; gravity(); } } /*重力効果*/ void Player::gravity() { if (gPos_y() < 200) { sPos_y(-6); } } /*座標の取得と設定*/ void Player::sPos_x(int xx)//加算 { pos.x += xx; } void Player::sPos_y(int yy)//加算 { pos.y += -yy; } int Player::gPos_x() { return pos.x; } int Player::gPos_y() { return pos.y; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/07/24 07:05

提示されたコードのどの部分が質問と対応するのか判断がつきません。関連付けを明記するか、もっとシンプルな例にするほうがいいと思います。
退会済みユーザー

退会済みユーザー

2019/07/24 07:14

//////////を使い提示コードの該当部をわかりやすいように編集しました。
guest

回答1

0

ベストアンサー

1,コンストラクタ内で初期化するべきなのか 代入

2,変数宣言時に同時に初期化するべきなのか? ←これは代入なのか初期化なのか知りたいです。
3,コンストラクタで:a(0) のように初期化するべきなのか 初期化?

2番めは初期化ですが、constでないメンバ変数に対してこれが可能となったのはC++11以降のことです。

3番めはメンバイニシャライザといいます。

なお、コンストラクタで代入すると、メンバ自体がコンストラクタのあるオブジェクトの場合、そちらのコンストラクタが一度走ってから別のオブジェクトを上書き代入するという無駄が発生しますので、3あるいは2の書き方をしましょう。

またメンバ関数の外で一時変数を書く時はどうしたらいいの知りたいです

使い方によります。ただ、インスタンスが複数立ちうる場合に外側で共用される変数を使うこと自体が良くないのではないかと思います。

投稿2019/07/24 07:20

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/24 09:20

ちょっとそれる質問になるかもしれませんがc++ のバージョンって意識する必要性ってどのくらいあるのでしょうか?
退会済みユーザー

退会済みユーザー

2019/07/24 12:51

二つ目の質問ですが1の場合はちょっと処理が遅くなるのでってことでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問