アプリ版:「スタンプのみでお礼する」機能のリリースについて

D3DXMatrixLookAtLHの関数の第2、3、4引数で&D3DXVECTOR3(,,,)なのですが、D3DXVECTOR3は構造体でD3DXVECTOR3 m_d3dxvector3(,,,)のように変数宣言しないと使えないと思うのですが

D3DXMatrixLookAtLH(&D3DXVECTOR3(,,,),&D3DXVECTOR3(,,,),&D3DXVECTOR3(,,,))

何故このように使えるのでしょうか?

よろしくお願いします。

A 回答 (4件)

構造体やクラスは変数名を宣言しなくても構造体名だけでオブジェクトが作られます。


普通はこのような一時オブジェクトは宣言と同時にデストラクタが呼ばれてすぐに消えてしまいます。
ただ一時オブジェクトを参照した場合はその参照先が消えるまで一時オブジェクトのデストラクタは呼ばれないのでご質問のように関数の引数として一時オブジェクトを使うことが出来るのです。
関数から戻った時点で引数に使った一時オブジェクトのデストラクタが呼ばれることになります。
    • good
    • 0
この回答へのお礼

みなさん、ありがとうございました。

お礼日時:2009/01/31 09:13

簡単なテストコードを書いて試してみてはどうでしょうか?


実際の動きをみるほうが理解が進みますよ。

サンプル)

#include <iostream>

class hoge
{
public:
  hoge(int) { std::cout << "  コンストラクタ" << std::endl; }
  ~hoge() { std::cout << "  デストラクタ" << std::endl; }

  void test() { std::cout << "  メソッド" << std::endl; }
};

void moge(hoge* p)
{
  std::cout << " 関数スタート" << std::endl;
  p->test();
  std::cout << " 関数エンド" << std::endl;
}

int main()
{
  std::cout << "呼び出し前" << std::endl;
  moge(&hoge(0));
  std::cout << "呼び出し後" << std::endl;
}
    • good
    • 0
この回答へのお礼

さっそくコンパイルして勉強させてもらいます。ありがとうございます。

お礼日時:2009/01/31 20:42

明示的にコンストラクタを呼び出して一時的に作成したオブジェクトを渡すという構文です。


このとき作成されたオブジェクトはD3DXMatrixLookAtLH関数から戻ったあと自動的に消滅します。
C++の「一時オブジェクト」という仕組みです。
    • good
    • 0

以下のソースは変数宣言を必要としない。



typedef struct _t {
int i;
int j;
} t_str;

void func(t_str *);

int main(void)
{
func(malloc(sizeof(t_str)));
}

もちろん
typedef struct _t {
int i;
int j;
} t_str;

void func(t_str *);

int main(void)
{
t_str *a;
a = malloc(sizeof(t_str));
func(a); //aはここでしか使わない
}
と書いても良いが、2度と使わない変数aを宣言する意味があるだろうか?

同様に
D3DXMatrixLookAtLH(結果を返す構造体,&D3DXVECTOR3(,,,),&D3DXVECTOR3(,,,),&D3DXVECTOR3(,,,))
では、第2~4引数は「2度と使わない」ので、コンストラクタが返したポインタをそのまま渡す方が良い事になる。

C++では「構造体オブジェクトもクラスオブジェクトの一種」であるので、コンストラクタが存在する。

この回答への補足

すみません説明不足でした。
自分が言いたかったのは
D3DXMatrixLookAtLH(...,&D3DXVECTOR3 m_d3dxvector3(,,),&D3DXVECTOR3 m_d3dxvector3(,,),&D3DXVECTOR3 m_d3dxvector3(,,))のように使わなければいけないと思うのですが、

D3DXMatrixLookAtLH(&D3DXVECTOR3(,,),&D3DXVECTOR3(,,),&D3DXVECTOR3(,,))

何故、このように使えるのでしょうか?という事です。

補足日時:2009/01/31 02:28
    • good
    • 0
この回答へのお礼

こんなに書いて説明してもらったのにすみません><ありがとうございます。

お礼日時:2009/01/31 02:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!