前几天一个朋友参加了一个C++的面试,在面试后,他给我发了一个面试题,然后本屌用仅有的一点C++基础,开始了我的关于类的基础学习。题目大致是以下这样的:有一个类A,在main函数调用完之后,会打印哪些信息。
代码如下:
class A { public: static int m_iCount; A(){++m_iCount;} ~A(){--m_iCount; print();} void print() { cout << "m_iCount = " << m_iCount << endl; } }; int A::m_iCount = 0; A func(A aa) { aa.print(); return aa; } int main(int argc, char *argv[]) { A a1; a1.print(); A a2 = func(a1); a2.print(); return 0; }
首先,我将以上代码运行,发现和我预想中的大不一样,打印的信息明显比我预想的答案多。运行结果如下:
经过一番对比我怀疑问题出在了
A a2 = func(a1);
这行代码上。于是我一边增加代码一边调试,类A中增加了拷贝构造函数和赋值操作符,最终形成了以下的代码:
class A { public: static int m_iCount; A(){++m_iCount;} ~A() { --m_iCount; print(); } A(const A& ca) { cout << "in const" << endl; } A& operator = (const A& ca) { cout << "in operator" << endl; } void print() { cout << "m_iCount = " << m_iCount << endl; } }; int A::m_iCount = 0; A func(A aa) { cout << "in func" << endl; aa.print(); cout << "out func" << endl; return aa; } int main(int argc, char *argv[]) { A a1; cout << "a1 print start" << endl; a1.print(); cout << "a1 print end" << endl; A a2 = func(a1); //方法一 //以下两行是方法二 //A a2; //a2 = func(a1); cout << "a2 print start" << endl; a2.print(); cout << "a2 print end" << endl; return 0; }
然后我又运行了以上代码,其中有方法一和方法两种调用func函数,发现方法二会多调用一次析构函数,这一点我还是没有搞明白。希望哪位大神能帮我解惑一下。
方法一运行结果如下(划红线的两行结果是在调用完func函数前打印的):
方法二运行结果如下(多调用了一次析构函数,而且为什么是先调用了赋值操作符,然后是连续两次析构):
以上疑惑希望大神能不吝赐教。
时间: 2024-10-14 05:18:25