C++类的定义

来源:互联网 发布:sql数据库课程设计 编辑:程序博客网 时间:2024/06/04 08:28

类的有些成员必须在构造函数初始化列表中进行初始化。对于这样的成员, 在构造函数函数体中对他们赋值不起作用。这样类型的成员有:没有默认构造函数的类类型的成员, const或引用类型的成员(不管他们本身是什么类型的,如int &a或是string &a), 都必须在构造函数初始化列表中进行初始化。如下例:

[cpp] view plaincopy
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. #include <string>  
  4. using namespace std;  
  5. class Name  
  6. {  
  7. public:  
  8.       Name(string str) : m_first(str), m_last(str){};  
  9.         
  10. private:  
  11.       string m_first;  
  12.       string m_last;  
  13. };  
  14. class Person  
  15. {  
  16. public:  
  17.          
  18.        /*Person(string str, int id, int gend) 
  19.        { 
  20.            m_id = id;  //main.cpp uninitialized reference member `Person::m_id'  
  21.            m_gend = gend; //main.cpp no matching function for call to `Name::Name()'  
  22.            m_name = str;//main.cpp uninitialized member `Person::m_gend' with `const' type `const int'  
  23.        }*/  
  24.        //right  
  25.        Person(string str, int id, int gend) : m_name(str), m_id(id), m_gend(gend){};  
  26.          
  27. private:  
  28.         int &m_id;  
  29.         Name m_name;  
  30.         const int m_gend;  
  31. };  
  32.              
  33. int main(int argc, char *argv[])  
  34. {  
  35.     Person per("tom", 1, 2);  
  36.       
  37.     system("PAUSE");  
  38.     return EXIT_SUCCESS;  
  39. }  

构造函数初始化列表仅用于初始化成员的值, 并不指定这些初始化执行的次序。成员被初始化的次序就是定义成员的次序。如下例:

[cpp] view plaincopy
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. using namespace std;  
  4. class Try  
  5. {  
  6. public:  
  7.        Try(int val) : m_i(val), m_j(m_i){};  
  8. private:  
  9.         int m_j;  
  10.         int m_i;  
  11. };  
  12. int main(int argc, char *argv[])  
  13. {  
  14.     Try try(8);  
  15.       
  16.     system("PAUSE");  
  17.     return EXIT_SUCCESS;  
  18. }  
 

 

以上程序在初始化成员时, 并不是按照初始化列表的次序先初始化m_i, 然后m_j, 而是按照这两个成员定义时的次序, 先初始化m_j, 在m_i, 于是出现了问题, 在初始化列表中m_j(m_i), 也就是想用m_i去初始化m_j ,但这是m_i还没有被初始化, 所以会出现编译错误…

 

C++ primer中推荐:最好按照与成员声明一致的次序编写初始化列表。而且, 尽可能的避免使用类成员去初始化其他类成员。

如果没有按照定义顺序初始化的时候,会提示如下warning

will be initialized after
when initialized here

调整后,此warning消失