This question already has an answer here:
#include <iostream>
class A
{
    private:
        std::string someMember;
    public:
        A(std::string _x): someMember(_x){
            std::cout << "  In A's constructor with _x: " << _x << '\n';
        }
        A(const A& someSibling){
            this -> someMember = someSibling.someMember;
            std::cout << "  In A's copy constructor with someSibling's someMember: " << someSibling.someMember << '\n';
        }
        void printA(){
            std::cout << "  A speaking: " << someMember << '\n';
        }
};
class B{
    private:
        A someObj;
        int someOtherMember;
    public:
        B(std::string& _y, int _z): someObj(_y), someOtherMember(_z){
            std::cout << "  In B's constructor with _y: " << _y << " and _z: " << _z << '\n';
        }
        B(A& _y, int _z): someObj(_y), someOtherMember(_z){
            std::cout << "  In B's constructor with _y: " << /* _y<< */ " and _z: " << _z << '\n';
        }
        B(const B& anotherObj): someObj(anotherObj.someObj){
            std::cout << "  In B's copy constructor with anotherObj.someOtherMember: " << anotherObj.someOtherMember << '\n';
            this -> someOtherMember = anotherObj.someOtherMember;
        }
        B(const B&& anotherObjRvalue): someObj(anotherObjRvalue.someObj){
            std::cout << "  In B's move constructor with anotherObj.someOtherMember: " << anotherObjRvalue.someOtherMember << '\n';
        }
        void printB(){
            someObj.printA();
            std::cout << "  B speaking: " << someOtherMember << '\n';
        }
};
B someFun(){
    std::cout << "  In someFun\n";
    std::string anotherTemp("my String");
    B temp(anotherTemp, 500);
    return temp;
}
int main(){
    auto res = someFun();
    res.printB();
    std::cout << "  ********** \n";
    return 0;
}
I was playing around with classes, and in the code above, when auto res = someFun() I expected that the copy constructor for B should be called but the copy constructor of B was not called and the output was:
In someFun
In A's constructor with _x: my String
In B's constructor with _y: my String and _z: 500
A speaking: my String
B speaking: 500
********** 
But I expected output to be:
In someFun
In A's constructor with _x: my String
In B's constructor with _y: my String and _z: 500
In B's copy constructor with anotherObj.someOtherMember: 500
A speaking: my String
B speaking: 500
********** 
So, my question is, why was the copy constructor of B not called in auto res = someFun() ?
Aucun commentaire:
Enregistrer un commentaire