类的构造,析构,临时对象与函数参数的关系

    近来在封装一个跨Symbian/Linux/Wince/Windows的应用层框架,但有的平台是没有STL的,也没有一些基本的C++函数,必须动手封装保持各平台的框架代码一致,于是从写封装了string,STL的部分代码,在这过程中,遇到不少模板,构造,析构,函数参数的问题,其实就是C++的基本功问题,在这里做一个总结,对自己作为备忘录,也给一些C++基本功不是很扎实的人做一个快速温习:

一,基本构造函数
 1,缺省构造:
        如果不为类显示声明一个缺省构造,C++编译器不会为它生成一个构造函数,只有在编译需要时才自动生成一个(编译需要即。。。。。)生成的一个也不会为你的类成员数据初始化,
2,显示构造函数。
      显示声明的一个构造函数。显式构造必须为类成员进行初始化,不然编译器仍不会帮你做初始化,因为初始化是程序的需要,而不是编译器的需要,呵呵,候杰所说常用名词。
     显示构造函数给了我们一个机会,去初始化成员,以成员初始化列表形式,可以给你一个机会初始化常量类型/引用类型的成员变量。不然这种类成员函数无法初始化,导致编译错误 比如:
class     CDemo
{
    CDemo(const int& nInput,const int& nRef):m_nInput(nInput), m_nReference(nRef)
    {;};
protected:
    const int  m_nInput;
    int &       m_nReference
}

3,拷贝构造函数,
    相同于缺省构造函数,如果没有显示声明一个拷贝构造函数,编译器在编译需要时才会自动生成一个缺省的拷贝构造,如果没有编译需要,都是基于位拷贝操作(内存直接拷贝)
     拷贝构造的特点时,参数特点首先第一个输入参数是本类的类型,且为const T& rhs类型,例如:
class string
{
    string (const string& rhs);
}

如果参数为const string rhs结果如何呢?编译器为失败,还给你一个友情提醒应该为const string& rhs,因为如果采用 const string rhs,那么
string strRhs;
string str (strRhs);
中str在拷贝构造时strRhs要采用拷贝构造函来初始化行参rhs,恰恰是string::string(const string rhs),这样会不停地调用这个函数,而无法正常初始化。

那string(const string& rhs)中的这个const 可不可以少呢?不可以,首先第一天这样防止参数被修改,最重要的是对各种参数的兼容性比如
常量参数:
        如果这样声明函数 void function(string strInput);

           调用 function("xxx");时
          两个动作(不同编译器,可能会有更多动作)
         a,const string tempobj= string::string("xxx");//生成临时对象,参数处临时对象为const
         b,   const string strInput = temp;
         如果strInput为声明为const ,那么无法接受 const 限定符的temp对像
        所以必须声明为const,
        对于函数的内建类型参数为了兼容参数类型,更要声明为const
        比如 test_func(const int nInput);
        不然test_func(3);在严格的编译上就会编译失败。因为3为const类型,但一些编译可以允许test_func(int nInput) ,test_func(3),为了跨平台的目的,还是参数中多考虑类型问题。

         当然在test_func(char* szInput)中,有一个现象要注意:


4,赋值操作符:

原文地址:https://www.cnblogs.com/windwithlife/p/867960.html