`
eriol
  • 浏览: 400736 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C++初始化成员列表

    博客分类:
  • C++
阅读更多

C++在类的构造函数中,可以两种方式初始化成员数据:

  • 在构造函数的实现中,初始类的成员数据。
  • 还可以定义初始化成员列表 (Initializer list) 来初始化成员数据。

 

那么我们在什么情况下该使用初始化成员列表呢?

  1. 需要初始化的数据成员是对象。
  2. 需要初始化的类成员是const对象或者引用对象。
  3. 解决没有默认构造函数的类成员对象的生成。
  4. 在继承里面,只有初始化列表可以构造父类的private成员。

 

 

1. 需要初始化的数据成员是对象。

 

#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;
        }

        point(point& p)
        {
            m_x = p.GetX();
            m_y = p.GetY();
        }

        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_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);
         }
};

 

   我们可以使用如下进行初始化,它将调用拷贝构造函数:

   关于拷贝构造函数,可参见 http://www.cnblogs.com/BlueTzar/articles/1223313.html

 

void main()
{
    point p(1,2);    //先定义一个2D坐标
    point3d p3d(p,3);
    p3d.Print();
}

 

   也可以使用初始化成员列表进行初始化:

 

void main()
{
    point p(1,2);
    point3d p3d(1,2,3);
    p3d.Print();
}

 

   由于对象赋值比初始化要麻烦的多,因此也带来的性能上的消耗。所以使用初始化列表可以更高效地初始化成员变量是对象的情况。

 

 

2. 需要初始化的类成员是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 b(1,2);
}

 

其中,注释的部分将无法通过编译。

 

 

3. 解决没有默认构造函数的类成员对象的生成。

 

如果成员类型是没有默认构造函数的类。若没有提供显示初始化,则编译器隐式使用成员类型的默认构造函数,若该类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

 

 

4. 在继承里面,只有初始化列表可以构造父类的private成员。

 

 

原文地址:http://blog.csdn.net/freedom0203/article/details/2805945

分享到:
评论

相关推荐

    C++初始化成员列表.

    掌握C++初始化成员列表的相关用法,一般初学者对类的初始化列表总是很陌生.

    C++构造函数初始化列表

    关于“C++构造函数初始化列表 ”的实例分析

    C++中成员初始化列表的使用

    C++中成员初始化列表的使用 &lt;br&gt;适合初学者

    关于C++类的成员初始化列表的相关问题

    下面小编就为大家带来一篇关于C++类的成员初始化列表的相关问题。小编觉得挺

    C++类成员和数据成员初始化总结

    C++为类中提供类成员的初始化列表 类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算 1.类里面的任何成员变量在定义时是不能...

    成员初始化列表与构造函数体中的区别详细解析

    C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...

    C++初始化函数列表详细解析

    在以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况; 二,需要初始化const修饰的类成员; 三,需要初始化引用成员数据; 原因:C++可以定义引用类型的成员变量,引用类型的成员变量...

    关于C++中构造函数初始化成员列表的总结

    1.只能在构造函数初始化列表初始化的成员变量的类型?  a.const成员变量  b.引用类型的成员变量  c.static不能在初始化列表中进行...以上就是小编为大家带来的关于C++中构造函数初始化成员列表的总结全部内容了,希望

    C++ 构造函数初始化列表的好处

    C++ 类对像构造时,需要对类成员变量完成初始化赋值操作。使用初始化列表完成这步操作在性能上有益处。什么好处呢?摆道理显得不够彻底。看书不如做实验。让我们结合执行过程来查看。考虑如下示例代码:  ...

    c++能不能给类的成员变量在声明的时候初始化? - life_limbo - 博客园1

    1. Re:Qt中关于release版本程序异常结束 2. Re:c++中指向对象的指针为NULL时可 3. Re:c++中指向对象的指针为NULL时可 5.

    cpp代码-C++:初始化列表:1.向数据成员传递值

    cpp代码-C++:初始化列表:1.向数据成员传递值

    c++ 子类构造函数初始化及父类构造初始化的使用

    主要介绍了c++ 子类构造函数初始化及父类构造初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    c++ 构造函数的初始化列表

    构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推

    C++学习资料打包下载

    #pragam.txt #pragma预处理指令的用法.pdf 常用ASCII编码.pdf VC++小游戏开发实例教程.chm sizeof.doc C++的忠告.doc C++初始化成员列表.doc c_c++中操作符的优先级.doc

    C++类构造函数初始化列表

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0...

    简述C++11就地初始化与列表初始化

    在C++11中,结构体或类的数据成员在申明时可以直接赋予一个默认值,初始化的方式有两种,一是使用等号“=”,二是使用大括号列表初始化的方式。注意,使用参考如下代码: class C { private: int a=7; //C++11 ...

    C++类的静态成员初始化详细讲解

    通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化

Global site tag (gtag.js) - Google Analytics