| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 545 人关注过本帖
标题:[原创]C++中成员初始化列表的使用
只看楼主 加入收藏
丛来乐呵呵
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-12-12
收藏
 问题点数:0 回复次数:2 
[原创]C++中成员初始化列表的使用
[原创]C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member)。
1,在构造函数的实现中,初始类的成员数据。诸如:
class point
{
private:
int x,y;
public:
point(int m=0,int n=0)
{
x=m;
y=n;
}
int GetX()
{
return x;
}
int GetY()
{
return y;
}
};
2,还可以定义初始化成员列表(Initializer list)来初始化成员数据(data member)。
改写构造函数如下:
point(int m=0,int n=0):x(m),y(n)
{
}
这样咋一看没有什么不同,确实,对于上面的这种简单列子来说,也真的没有太大不同。
那我们为什么要用初始化成员列表,什么时候用初始化成员列表来初始化成员数据呢?Lippman的《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:
一,需要初始化的数据成员是对象的情况;
二,需要初始化const修饰的类成员;
三,需要初始化引用成员数据;
现在分别举例说明:
一,需要初始化的数据成员是对象。
---------------------------
#include <stdio.h>
class point
{
protected:
int m_x,m_y;
public:
point(int m=0,int n=0)
{
m_x = m;
m_y = n;
printf("constructor called!\n");
}
point(point& p)
{
m_x = p.GetX();
m_y = p.GetY();
printf("copy constructor called!\n");
}
int GetX()
{
return m_x;
}
int GetY()
{
return m_y;
}
};
class point3d
{
private:
point m_p;
int m_z;
public:
point3d(point p, int k)
{
m_p = p; //这里是对m_p的赋值
m_z=k;
}
point3d(int i,int j, int k):m_p(i,j) // 相当于 point m_p(i,j)这样对m_p初始化
{
m_z=k;
}

void Print()
{
printf("%d,%d,%d \n",m_p.GetX(),m_p.GetY(),m_z);
}
};
---------------------------------------
上述代码中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就是防止被错误赋值的,引用类型必须定义赋值在一起)因此只能用初始化列表对齐进行初始化。
上面两点比较好明白,可以用一个例子加以说明:
-------------------------------------
#include <stdio.h>
class base
{
private:
const int a;
int& b;
public:
// base(int m, int n)
// {
// a = m;
// b = n;
// }
base(int m, int n):a(m),b(n)
{}
};
void main()
{
base ba(1,2);
}
---------------------------
上面红色的部分初始化的方式是不允许的通不过编译,通过初始化列表则可以很好的定义。

转自:
软件客论坛开发语言[原创]C++中成员初始化列表的使用

搜索更多相关主题的帖子: 成员 列表 
2007-08-07 10:38
星星鱼虾蟹
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-6-2
收藏
得分:0 
是转帖的话还写原创干嘛啊...还有这里是C版,不是C++版

2007-08-07 10:46
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8914
专家分:2567
注 册:2004-3-25
收藏
得分:0 
编程中国原创计划及声明
  • 严肃性
    不求文章要写的多么经典,但一定要是自己的原创。求助、转载、广告等其他类型帖子冒充原创者,视用户等级禁言一段时间或封ID。

  • 本站首发
    原创帖必须是本站首发,在其他站点发布以后在本论坛发布的,我们拒绝承认为原创,一律视为转载。

  • 鼓励原创
    原创帖在发布以后,管理员通过网上划词搜索辨别是否为原创,如确定为原创,只要文章不是过于简陋就会推荐为本版精华,优秀的同时收录至本站技术教程频道

畅所欲言
2007-08-10 15:05
快速回复:[原创]C++中成员初始化列表的使用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024115 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved