`
eriol
  • 浏览: 408032 次
  • 性别: 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++语言中的初始化成员列表是一种特殊的语法结构,它允许在构造函数中对类的成员变量进行初始化。这种机制可以解决一些特殊的问题,如成员变量是类类型且没有默认构造函数的类,或者const成员或...

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

    1. **默认构造函数的隐式初始化**:如果没有提供显式的初始化,编译器会使用默认构造函数来初始化成员变量,这可能不是预期的行为。 2. **const成员变量的强制初始化**:对于声明为const的成员变量,必须在构造函数...

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

    ### C++中成员初始化列表的使用 在C++编程中,成员初始化列表是一个非常重要的概念,尤其是在类的设计和实现过程中。本文将详细解释成员初始化列表的概念、用途以及它与传统构造函数内初始化的区别,并通过具体示例...

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

    总之,C++类的成员初始化列表是构造函数的一个重要特性,用于高效、正确地初始化成员变量。了解何时和如何使用它对于编写高效、无误的C++代码至关重要。在编写涉及构造函数和成员变量初始化的代码时,应优先考虑使用...

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

    在C++编程中,类成员和数据成员的初始化是一个至关重要的概念,因为它直接影响到对象的创建和使用。...正确初始化成员可以确保对象的有效性和代码的健壮性。遵循这些规则,可以帮助我们编写出更加高效和可靠的C++代码。

    C++使用初始化列表的方式来初始化字段的方法

    C++语言中,初始化列表是一种常用的初始化对象成员的方法。今天,我们来探讨C++使用初始化列表的方式来初始化字段的方法。 首先,让我们了解什么是初始化列表。初始化列表是C++语言中的一种语法结构,用于在构造...

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

    需要注意的是,虽然声明时初始化提供了一种初始化成员变量的方法,但它并不适用于所有类型的成员。例如,对于动态分配的成员(如指针),应确保在构造函数中正确初始化并管理内存,防止内存泄漏。此外,对于类类型的...

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

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

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

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

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

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

    C++ 初始化列表详解及实例代码

    3. 没有默认构造函数的类类型:如果类没有默认构造函数,我们必须在初始化列表中使用拷贝构造函数或直接构造函数来初始化成员。 例如: ```cpp struct Test1 { Test1(int a) : i(a) {} int i; }; struct Test2 ...

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

    总之,C++类的静态成员初始化需要根据其类型和const属性来确定初始化的位置。整型和枚举型const静态成员可以直接在类声明中初始化,而其他类型的静态成员则需要在类声明之外初始化,并使用作用域解析运算符指定所属...

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

    在C++编程语言中,初始化列表是一个非常重要的概念,它在创建对象时用于设置成员变量的初始值。本文将深入探讨C++中的初始化列表,尤其是如何通过初始化列表向数据成员传递值。 首先,让我们理解什么是初始化列表。...

    c++里初始化结构体的一个比较的简单方法

    首先,让我们看看传统的方法,也就是在结构体定义中包含一个构造函数,并在构造函数体内逐个初始化成员变量: ```cpp struct MYSTRUCT { int i, j, q; char szName[15]; MYSTRUCT() { i = j = q = 0; memset...

    C++关于构造函数的初始化

    这种方式适用于非关键性的初始化,或者需要依赖其他已初始化成员的初始化。然而,对于常量和引用成员,这种初始化方式是不合适的。 如果尝试在函数体内初始化常量或引用成员,如下面错误的示例所示,编译器将报错...

    EnumTest-初始化类的类成员对象(初始化列表方式).zip

    总结,`EnumTest-初始化类的类成员对象(初始化列表方式)`这个主题强调了如何在C++中使用初始化列表来初始化类的枚举成员和其他类成员对象,这是编写高效且易于理解的代码的关键实践之一。正确使用初始化列表可以...

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

    在 C++ 中,子类构造函数的初始化涉及到父类构造函数的调用,否则将无法正确地初始化从父类继承来的成员变量。本文将详细介绍 C++ 子类构造函数初始化及父类构造初始化的使用。 首先,我们需要了解构造函数的基本...

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

    总之,C++构造函数的初始化列表是初始化成员变量的关键机制,特别是在处理`const`成员和引用类型时。理解这个机制及其与成员声明顺序的关系,对于编写安全且无误的C++代码至关重要。初始化列表不仅保证了初始化顺序...

Global site tag (gtag.js) - Google Analytics