精华内容
下载资源
问答
  • 构造函数初始化时必须... (常量成员)需要初始化const修饰的类成员 3. (引用)需要初始化引用成员数据class A { ... private: int a; }; class C{ C(int b); }; class B : public A { ... private: int a;...

    构造函数初始化时必须采用初始化列表一共有三种情况, 
    1. 没有默认构造函数的类成员对象() 
    2. (常量成员)需要初始化const修饰的类成员 
    3. (引用)需要初始化引用成员数据

    class A {
    ...
    private:
         int a;
    };
    class C{
        C(int b);
    };
    class B  : public A {
    ...
    private:
         int a;
    public:
         const int b;//需要在初始化列表初始化
         A &c;//需要在初始化列表初始化
         static const char* d;
         B* e;
         C f;//需要在初始化列表初始化
         const static int b;//需要在初始化列表初始化
    }

    不需要初始化的有 
    1. 指针 

    2. static 标记的,static const 也不需初始化列表中


    展开全文
  • Java在生成实例时, jvm会在Java堆中分配一块内存空间, 分配到的地址空间存储所有的成员变量, 根据成员变量数据类型的不同,拥有不同的默认值, 实例如果有赋值则会覆盖掉默认值,否则不做更改 ——即,无论如何...

    Java成员变量:

    Java类在生成实例时,
    jvm会在Java堆中分配一块内存空间,
    分配到的地址空间存储所有的成员变量,
    根据成员变量数据类型的不同,拥有不同的默认值,
    实例如果有赋值则会覆盖掉默认值,否则不做更改
    ——即,无论如何,属性都会拥有初始值

    Java局部变量(个人理解)

    The local variable i may not have been initialized

    The local variable i may not have been initialized
    

    Java局部变量在方法被调用,程序执行到局部变量声明位置时,
    会将变量类型、变量名称、变量值(若是有值的话,默认不做填充)包装成一个对象压入栈中,
    若是变量为基础类型,直接在val位置存储变量值,
    若为引用类型,则先将对象存入Java堆中,再将堆中地址引用填进栈中val位置

    这里可以看到一个明显区别:

    成员变量,是伴随着对象的实例化,存储在Java堆中,而在Java堆中地址空间是会根据存储类型初始化的
    局部变量,主体是在栈中,无论是何种类型数据,都要首先定位到栈中然后才能获得Java堆的位置(如果是引用类型的话)
    故而,造成两者差别的原因在于,栈中数据不会执行初始化,而堆中数据会有初始化

    总结:

    成员变量依托于Java对象,生命周期相同,一起创建回收,生命周期相对较长
    局部变量依托于方法调用,生命周期与方法的一次调用相同,生命周期短暂

    成员变量存在很大程度的重用特性,
    局部变量一次调用结束便可以判定死亡

    展开全文
  • 静态初始化类成员

    千次阅读 2007-04-06 16:34:00
    某些情况下,在写C++的时候,希望能通过一个静态初始化函数来对的一些静态成员进行初始化。比如,往静态的std::map成员或者std::vector成员里添加一些固定的内容等。这在Java里通过static块很容易实现。但在C++...

      某些情况下,在写C++类的时候,希望能通过一个静态初始化函数来对类的一些静态成员进行初始化。比如,往静态的std::map成员或者std::vector成员里添加一些固定的内容等。这在Java里通过static块很容易实现。但在C++里该怎么办呢?

      如果要初始化一个普通的静态成员,只需要在实现文件(源文件)中定义该成员并赋予初始值即可,比如:

    class Test1 {
    public:
        static string emptyString;
    };
    
    string Test1::emptyString = "";
    // also can be
    // string Test1::emptyString;
    // string Test1::emptyString("");

      静态函数是不能像这样直接调用的。但是,不妨利用一下C++初始化普通成员的特点来调用静态初始化函数。当然,这需要定义一个额外的静态成员变量来辅助一下。如:

    class Test2 {
    public:
        static vector<string> stringList;
    private:
        static bool __init;
        static bool init() {
            stringList.push_back("string1");
            stringList.push_back("string2");
            stringList.push_back("string3");
    
            return true;
        }
    };
    
    vector<string> Test2::stringList;
    bool Test2::__init = Test2::init();

      上面这个示例中初始化成静态成员__init的时候就“顺便”调用了静态初始化函数init(),达到预期目的。 

    展开全文
  • C++初始化类成员列表

    千次阅读 2010-03-03 16:46:00
    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 ...

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

    上面红色的部分初始化的方式是不允许的通不过编译,通过初始化列表则可以很好的定义。

    展开全文
  • 中的成员变量类型可分为: 普通成员 常量成员 (const) 引用成员 (&...普通成员可以使用内初始化和初始化成员列表进行初始化。 常量成员和引用成员都只能通过初始化成员列表进行初始化。 静态成员...
  • Java自动初始化类成员变量详解

    千次阅读 2017-07-18 11:49:31
    前言:为什么Java初始化成员变量不用赋值,而初始化局部变量就要赋值呢?Java的默认初始化成员变量,自动会给成员变量赋值。
  • Java类成员初始化

    千次阅读 2013-05-30 15:03:16
    Java类成员初始化与C++初始化的方式有很多不同,这部分知识相对比较基础,从而导致很多Java程序员对于Java类初始化机制不甚了了。下面就Java类成员初始化方式做一个梳理,希望对大家有益。 一、 所有变量使用前都...
  • C++ 未初始化类成员变量

    千次阅读 2020-03-31 09:42:46
    初始化类成员变量 在gcc 4.8.5版本 如果还有未初始化类成员变量,其值不确定
  • 有关const成员、static成员、const static成员初始化:1、const成员:只能在构造函数后的初始化列表中初始化(C++98); (C++11提供了初始化,因此内常量可在声明时进行初始化,因此该内常量的作用...
  • 如何初始化类的const成员

    千次阅读 2014-11-18 13:25:09
    初始化类的其实也很简单。
  • 2、static成员初始化外,且不加static修饰 3、const static成员只有唯一一份拷贝,且数值不能改变。因此,可以在中声明处初始化,也可以像static在初始化 示例:   #include using st
  • C++类成员初始化顺序问题

    万次阅读 2017-11-22 21:08:20
    今天刚把买了一个月的剑指offer这本书翻阅一下,看到一个简单的举例。...C++类成员初始化顺序问题1 C++类成员初始化顺序问题2 问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下,#include us
  • 首先,应该明确需要定义,但不是真实存在的对象,的定义过程是对的一个“声明”,并不会为其分配内存(包括static成员,也因此static成员必须内声明,外定义(初始化))。 必须通过构造函数才能将...
  • 成员变量初始化总结

    万次阅读 2015-04-08 11:52:23
    首先把需要初始化成员变量分为几: Ø 一般变量(int) Ø 静态成员变量(static int) Ø 常量(const int ) Ø 静态常量(static const int)  对应的初始化方式是: Ÿ 一般变量可以在初始化列表里或者...
  • 必须这样做:《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);
  • 成员变量的初始化顺序

    千次阅读 2018-09-03 11:34:43
    成员变量的初始化顺序只与变量在中的声明顺序有关,与在构造函数中的初始化列表顺序无关。 注意:是与声明顺序有关。 #include&lt;iostream&gt; using namespace std; class A { public: //我们...
  • C++类成员变量初始化位置

    千次阅读 2015-09-08 11:29:16
    static: static表示的是静态的。的静态成员函数、静态成员变量是和相关的,而... 在C++中,static静态成员变量不能在的内部初始化。在的内部只是声明,定义必须在定义体的外部,通常在的实现文件中初始
  • c++成员变量初始化总结

    千次阅读 2019-06-14 17:04:11
    首先把需要初始化成员变量分为几: a.一般变量(int) b.静态成员变量(static int) c.常量(const int) d.静态常量(static const int) 对应的初始化方式是: a.一般变量可以在初始化列表里或者构造...
  • C++使用初始化列表初始化数据成员的三种情况

    万次阅读 多人点赞 2018-08-11 15:04:27
    对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员(构造函数列表的初始化方式...《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据...
  • 《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:  情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);
  • C++类成员和数据成员初始化总结

    万次阅读 2013-05-24 22:15:38
    C++为中提供类成员初始化列表。 对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算  1.里面的任何成员变量在定义时是...
  • 派生不能在成员初始化列表中直接初始化基类的成员 初始化基类成员 构造函数是不可继承的。因此,派生的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员...
  • 类成员变量初始化顺序: 父类--静态变量  父类--静态初始化块  子类--静态变量  子类--静态初始化块  父类--变量 父类--初始化块  父类--构造器  子类--变量  子类--初始化块  子类--构造器 ...
  • 说到成员变量的初始化顺序,对于初学者很多容易混淆其顺序,以为简单的按初始表来初始化,其实不然,现在我来详细讲解下初始化顺序: 首先由简单开始: class people { public: people():j(1),i(j) { } ...
  • C++类成员初始化

    千次阅读 2016-03-29 13:00:03
    C++成员初始化C++包括的类成员主要由以下几种: 非静态非常量数据成员 非静态常量数据成员 静态非常量数据成员 静态常量数据成员 静态成员不能在初始化在C++中,的静态成员(static member)必须在内声明...
  • 模版静态成员初始化

    千次阅读 2014-08-07 14:51:10
    本对模版中静态数据成员初始化方式进行了详细介绍,对于不同静态成员讨论了初始化方式和一些实现细节。
  • 类成员初始化顺序

    千次阅读 2016-03-24 18:41:13
    初始化表的初始化顺序是根据成员变量的声明顺序来执行的,而不是按照初始化列表的顺序。 #inlude #inlude using namespace std; class base { private: int m_i; int m_j; public: base(int i) : m_j(i),m...
  • 类成员初始化可以在构造

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 676,592
精华内容 270,636
关键字:

初始化类成员