コンストラクターが呼び出される状況についての理解を深める必要がありました。この間、Microsoft の次の例に出くわしました。
//RVO class is defined above in figure 4
#include <stdio.h>
RVO MyMethod (int i)
{
RVO rvo;
rvo.mem_var = i;
throw "I am throwing an exception!";
return (rvo);
}
int main()
{
RVO rvo;
try
{
rvo=MyMethod(5);
}
catch (char* str)
{
printf ("I caught the exception\n");
}
}
このRVO
クラスには、コンストラクタ、copyconsdtuctor、およびデストラクタが呼び出されたときに表示されるだけです。Microsoft は、thorw がコメントアウトされ、NRVO がない場合、出力は次のようになると述べています。
I am in constructor
I am in constructor
I am in copy constructor
I am in destructor
I am in destructor
I am in destructor
でもなかなか追いつけない。私はこれが起こると思います:
- 主
constructor
に求められるのはRVO rvo;
- In MyMethod
constructor
が呼び出されますRVO rvo;
return (rvo);
とcopyconstructor
呼ばれるため- In MyMethod
destructor
は、ローカル RVO に対して呼び出されます - In Main
destructor
はローカル rvo に対して呼び出されます
destructor
これにより、Microsoft が宣言しているよりも 1 回少ない呼び出しで済みます。私は何が欠けていますか?
完全を期すために、RVO
クラス:
class RVO
{
public:
RVO(){printf("I am in constructor\n");}
RVO (const RVO& c_RVO) {printf ("I am in copy constructor\n");}
~RVO(){printf ("I am in destructor\n");}
int mem_var;
};