关于c++:封装构造和析构2

没有任何返回值。
初始化列表, 效率更高,用不了this指针
一是应用初始化列表,二是在构造函数体内进行赋值操作。应用初始化列表次要是基于性能问题,对于内置类型,如int, float等,应用初始化类表和在构造函数体内初始化差异不是很大,然而对于类类型来说,最好应用初始化列表,为什么呢?由下面的测试可知,应用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是十分高效的。同样看下面的例子,咱们应用初始化列表来实现Test2的构造函数

struct Test2
{

Test1 test1 ;
Test2(Test1 &t1):test1(t1){}

}

应用同样的调用代码,输入后果如下。

construct Test1
copy constructor for Test1

第一行输入对应 调用代码的第一行。第二行输入对应Test2的初始化列表,间接调用拷贝构造函数初始化test1,省去了调用默认构造函数的过程。所以一个好的准则是,能应用初始化列表的时候尽量应用初始化列表。
举例

lass X {
public:
        int m_i;
        X(int value = 0) :m_i(value)
        {
               printf("this = %p", this);
               cout << "X(int)构造函数被调用" << endl;
        }
        X(const X &tmpv)
        {
               printf("this = %p", this);
               cout << "X拷贝构造函数被调用" << endl;
        }
        X& operator=(const X &tmpv)
        {
               printf("this = %p", this);
               cout << "X拷贝赋值运算符被调用" << endl;
               return *this;
        }
        ~X()
        {
               printf("this = %p", this);
               cout << "X析构函数被调用" << endl;
        }
};
class Y{
public:
        X xobj;//类类型对象
        Y(int tmpvalue) :xobj(1000)//这里结构了xobj,此处若没有应用初始化成员列表,消耗了一次结构函数调用的机会
                           // 编译器角度(没用初始化列表)
                                      //X xobj;
                                      //xobj.X::X();
                                      // 编译器角度(用了初始化列表)
                                      //X xobj;
                                      //xobj.X::X(1000);
        {
              //xobj = 1000;//若不应用初始化列表。这里结构一个长期对象,把长期对象内容给了xobj,之后开释xobj
             //编译器视角
            //x tmpobj;//                          (1)生成长期对象
            //tmpobj.X::X(1000);//                 (2)长期对象调用构造函数
            //xobj.X::operator=(tmpobj);//         (3)调用拷贝赋值运算符
            //tmpobj.X::~X();      //              (4)调用析构函数
        }
};

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理