关闭

c++ 成员初始化列表

标签: c++成员初始化列表
230人阅读 评论(0) 收藏 举报
分类:
那我们为什么要用初始化成员列表,什么时候用初始化成员列表来初始化成员数据呢?Lippman的《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 
  
一,需要初始化的数据成员是对象的情况; 
二,需要初始化const修饰的类成员; 
三,需要初始化引用成员数据; 
  
现在分别举例说明: 
一,需要初始化的数据成员是对象。 
--------------------------- 
[cpp] view plain copy
  1. #include <stdio.h>   
  2. class point   
  3. {   
  4. protected:   
  5.  int m_x,m_y;   
  6. public:   
  7.  point(int m=0,int n=0)   
  8.  {   
  9.   m_x = m;   
  10.   m_y = n;   
  11.   printf("constructor called!/n");   
  12.  }   
  13.  point(point& p)   
  14.  {   
  15.   m_x = p.GetX();   
  16.   m_y = p.GetY();   
  17.   printf("copy constructor called!/n");   
  18.  }   
  19.  int GetX()   
  20.  {   
  21.   return m_x;   
  22.  }   
  23.  int GetY()   
  24.  {   
  25.   return m_y;   
  26.  }   
  27. };   
  28.     
  29. class point3d   
  30. {   
  31. private:   
  32.  point m_p;   
  33.  int m_z;   
  34. public:   
  35.  point3d(point p, int k)   
  36.  {   
  37.   m_p = p;                              //这里是对m_p的赋值   
  38.   m_z=k;   
  39.  }   
  40.  point3d(int i,int j, int k):m_p(i,j)   // 相当于 point m_p(i,j)这样对m_p初始化   
  41.  {   
  42.   m_z=k;   
  43.  }   
  44.  void Print()   
  45.  {   
  46.   printf("%d,%d,%d /n",m_p.GetX(),m_p.GetY(),m_z);   
  47.  }   
  48. };   

--------------------------------------- 
上述代码中Point3d是一个3D坐标,他有一个point的2D坐标和一个成员组成。 
我们现在想定义一个3D坐标p3d,可以这样实现: 
void main() 
{ 
 point p(1,2);    //先定义一个2D坐标 
 point3d p3d(p,3); 
 p3d.Print(); 
} 
从point3d实现体可以看出,我们是通过对m_p进行赋值,这样不仅调用copy constructor产生临时对象而且是对m_p的一个赋值操作。 
而如果使用成员初始化列表,我们则可以这样: 
void main() 
{ 
 point p(1,2); 
 point3d p3d(1,2,3); 
 p3d.Print(); 
} 
p3d中的point型成员是通过调用初始化的方式构建的。由于对象赋值比初始化要麻烦的多,因此也带来的性能上的消耗。(可以参见Scott Meyers著《effective C++》条款12)。 
这也是我们在对成员数据是对象成员的采用初始化列表进行初始始化的主要原因。 
  
二,需要初始化const修饰的类成员; 
三,需要初始化引用成员数据; 
对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起)因此只能用初始化列表对齐进行初始化。 
上面两点比较好明白,可以用一个例子加以说明: 
------------------------------------- 
[cpp] view plain copy
  1. #include <stdio.h>   
  2. class base   
  3. {   
  4. private:   
  5.  const int a;   
  6.  int& b;   
  7. public:   
  8. // base(int m, int n)   
  9. // {   
  10. //  a = m;   
  11. //  b = n;   
  12. // }   
  13.  base(int m, int n):a(m),b(n)   
  14.  {}   
  15. };   
  16.     
  17. void main()   
  18. {   
  19.  base ba(1,2);   
  20. }  
0
0
查看评论

C++为什么需要成员初始化列表

将构造函数分为两个阶段的执行过程:初始化阶段和构造函数函数体阶段。 既然称它为成员初始化列表,那么该阶段在初始化阶段完成。 那么类成员变量不外乎类类型和非类类型。而对于非类类型而言,此时 无论是在初始化表中还是函数体内完成赋值效果是一致的,即并未初始化。 表现的有点不同的是类类型: tes...
  • WS1347913745
  • WS1347913745
  • 2013-03-16 23:01
  • 2362

C++成员初始化列表详解

C++成员初始化列表详解 在初始化类的成员的时候,我们经常会有两种选择,其一是类构造函数的成员初始化列表,其二是构造函数的函数体。那么这两者的区别又是什么,成员初始化列表的具体行为到底是什么呢? 成员初始化列表和构造函数体的区别 成员初始化列表和构造函数的函数体都可...
  • Poundssss
  • Poundssss
  • 2015-10-24 11:22
  • 5319

C++复习笔记——初始化列表顺序

参考测试代码1: #include using namespace std; class A { public: A(int iniI,int iniJ,int iniK):i(iniI),j(i),k(iniK){} int i; int j; ...
  • huqinweI987
  • huqinweI987
  • 2016-02-18 01:01
  • 3206

C++类成员初始化为什么要首选初始化列表

类成员初始化可以在构造
  • linqingwu75
  • linqingwu75
  • 2014-11-08 11:44
  • 1056

C++何时要使用成员初始化列表

本文阐述了C++中那些情况要使用成员初始化列表。
  • iceshirley
  • iceshirley
  • 2010-06-23 11:05
  • 2203

C++必须使用【初始化列表】初始化数据成员的三种情况

类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员; 2.进入构造函数后在构造函数中执行一般赋值与计算。 使用初始化列表有两个原因: 原因1.必须这样做: 《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:   ...
  • sinat_20265495
  • sinat_20265495
  • 2016-12-15 15:13
  • 4563

C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误

数组作为成员变量时只有默认初始化,也就是无法传递参数。有两种变通方案:你可以把对象数组改成指针数组,或者把ClassB类的构造和初始化分开。 方案一: class ClassA{ private: ClassB* arrayOfObjectClassB[2]; public: ...
  • dengziliang001
  • dengziliang001
  • 2013-03-12 15:10
  • 1997

C++11之初始化列表

C++11引入了一项新功能:初始化列表。在C++98中,我们可以使用以下两种方法进行初始化:int i = 0; int j(0);引入“初始化列表”后,我们可以这样进行初始化:int i = {0}; int j{0};上述代码体现不出“初始化列表”的优越来,别着急,我们还可以这样用:std::v...
  • u012494876
  • u012494876
  • 2017-06-16 22:37
  • 251

学习笔记:数组成员初始化于构造函数初始化列表

class C { int a[3]; public: C(int x, int y, int z) : a{x, y, z} { /* ... */ }; };在C++11出现之前,是不可能这样做的。如果数组成员构造成本比较高,或者是const的,希望通过初始化列表构造,就很麻烦了。C++0...
  • audi2
  • audi2
  • 2015-02-08 18:05
  • 1395

C++11新特性之列表初始化

在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体: struct A { int x; int y; }a={1,2}; 这些不同的初始化方法都有各...
  • hailong0715
  • hailong0715
  • 2017-01-04 15:11
  • 5998
    个人资料
    • 访问:212272次
    • 积分:3560
    • 等级:
    • 排名:第11007名
    • 原创:95篇
    • 转载:193篇
    • 译文:0篇
    • 评论:22条
    博客专栏
    最新评论