首页 技术 正文
技术 2022年11月23日
0 收藏 676 点赞 3,295 浏览 1906 个字

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);
}
—————————上面红色的部分初始化的方式是不允许的通不过编译,通过初始化列表则可以很好的定义。

微信扫一扫

支付宝扫一扫

本文网址:https://www.zhankr.net/141276.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:875 阅读:5,067
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:806 阅读:3,504
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:565 阅读:4,312
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:730 阅读:4,307
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:4,904
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:3,097
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:8:00-16:00

客服电话

400-888-8888

客服邮箱

ceotheme@ceo.com

扫描二维码

关注微信公众号

扫描二维码

手机访问本站