从一个面试题开始学习C++类基础

  前几天一个朋友参加了一个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函数前打印的):

方法二运行结果如下(多调用了一次析构函数,而且为什么是先调用了赋值操作符,然后是连续两次析构):

以上疑惑希望大神能不吝赐教。

posted @ 2016-05-15 22:38  情敌贝多芬  阅读(262)  评论(0编辑  收藏  举报