1

メイン関数の最後の行で関数 func の戻り呼び出しに対してコピーコンストラクターが呼び出されないのはなぜですか..値でパラメーターを送信するときに呼び出されますが、値を返すときは呼び出されません

class A
    {
        public:
        int x , y , z;
        A(int x=4 , int y=2 , int z=1)
        {
            this->x = x;
            this->y = y;
            this->z = z;
        }

        A(A& a)
        {
            x = a.x;
            y = a.y;
            z = a.z;
            printf("Copy Constructor called\n");
            a.x++;
        }

        //not a copy constructor
        A(A *a)
        {
            x = a->x;
            y = a->y;
            z = a->z;
            printf("Some Constructor called\n");
            (a->x)++;
        }
        void tell() { printf("x=%d y=%d z=%d\n" , x , y , z);}
    };

    A func()
    {
    A a;

    return a;
    }

    int main()
    {
        A a1;

        a1=func(); //why is copy constructor not called while returning
        a1.tell();
        return 0;
    }
4

1 に答える 1

2

これはcopy-elisionが原因です。コンパイラはコピーを省略し、結果をオブジェクトに直接格納できます。コンパイラ オプションを使用してコピー省略をオフにすることができます-fno-elide-constructors(ただし、お勧めしません)。

関連:コピー省略と戻り値の最適化とは?

于 2013-10-19T15:41:21.387 に答える