0

This question is regarding bitwise copying of class objects. Why is constructor not called, instead destructor is called in below code ? The output is as

HowMany h2 = f(h); // No constructor get;s called here..

after construction of h: objectCount = 1
x argument inside f(): objectCount = 1
~HowMany(): objectCount = 0
after call to f(): objectCount = 0
~HowMany(): objectCount = -1
~HowMany(): objectCount = -2




class HowMany {
    static int objectCount;
public:
    HowMany() { objectCount++; }
    static void print(const string& msg = "") {
        if(msg.size() != 0) cout << msg << ": ";
        cout << "objectCount = "
            << objectCount << endl;
    }
    ~HowMany() {
        objectCount--;
        print("~HowMany()");
    }
};

int HowMany::objectCount = 0;
// Pass and return BY VALUE:

HowMany f(HowMany x) {
    x.print("x argument inside f()");
    return x;
}

int main() {
    HowMany h;
    HowMany::print("after construction of h");
    HowMany h2 = f(h);
    HowMany::print("after call to f()");
} ///:~

4 Answers 4

6

Firstly, C++ does not have "bitwise copying". The default copying mechanism is implemented by compiler-provided copy constructor. Compiler-provided copy constructor recursively copies each data member by invoking each data member's specific copying semantics. The end result might inded look like a "bitwise copy" in some cases, but nevertheless the language does not use such a low-level concept.

Secondly, the constructor that is called in this case is, again, copy constructor. It's signature is

HowMany::HowMany(const HowMany&)

This constructor is provided by the compiler and it is indeed called, yet you are simply not counting it. That is why your objectCount counter shows disbalanced result.

2

Because copy constriuctor is missing . you must incrementing in copy constructor as well

add this line too

HowMany(const HowMany& r) { objectCount++; }
0
1

You are having the issue that in your function f() the copy-constructor is called, which is not the normal constructor. When the function goes out of scope the the destructor will be invoked. Provide a copy constructor like

HowMany::HowMany(const HowMany& other){
 objectCount++;
}

and this will work.

0

Try creating a copy constructor for HowMany . By default a copy constructor would be created by compiler for you and you would not feel it getting called.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.