C++类初始化列表与构造函数内赋值区别

来源:互联网 发布:淘宝店铺改名字和头像 编辑:程序博客网 时间:2024/05/17 22:15

最近面试过程中,面试问了类构造初始化列表和构造函数内赋值有什么区别。当时没完全回答清楚,后来google了一下,发现两者有如此大的不同,现总结如下。

构造初始化列表中,是直接调用相应的构造函数进行对象初始化操作。而在构造函数内赋值会,先经过调用无参构造函数进行初始化,然后再调用相应的赋值函数,进行赋值操作。可见前者的执行效率更高。请对比以下两组代码的执行结果:

#include <stdio.h>int g_counter = 0;class A{public:    A(void)    {        m_a = 0;        printf("A(void)\n");    }    A(int i)    {        m_a = i;        printf("A(int i)\n");    }    A &operator=(int i)    {        printf("A &operator=(int i)\n");        return *this;    }private:    int m_a;};class B{public:    B(int i);    ~B()    {        printf("~B() m_value=%d\n", m_value);    }    B &operator=(const B&b)    {        printf("B &operator=(const B&b)\n");        return *this;    }private:    int m_value;    A m_aa;};B::B(int i){    m_aa = i;    m_value = g_counter++;    printf("B() m_value=%d\n", m_value);}int main(void){    B b(1);return 0;}
执行结果:
#include <stdio.h>int g_counter = 0;class A{public:    A(void)    {        m_a = 0;        printf("A(void)\n");    }    A(int i)    {        m_a = i;        printf("A(int i)\n");    }    A &operator=(int i)    {        printf("A &operator=(int i)\n");        return *this;    }private:    int m_a;};class B{public:    B(int i);    ~B()    {        printf("~B() m_value=%d\n", m_value);    }    B &operator=(const B&b)    {        printf("B &operator=(const B&b)\n");        return *this;    }private:    int m_value;    A m_aa;};B::B(int i):m_aa(i){    m_value = g_counter++;    printf("B() m_value=%d\n", m_value);}int main(void){    B b(1);return 0;}
执行结果:

0 0