类成员变量初始化

C++类对象的构造顺序是这样的:分配内存->调用构造函数时,隐式/显式的初始化各数据成员->在构造函数内部初始化数据成员。

C++类初始化需注意以下几点

1、类里面的任何成员变量在定义时是不能初始化的。
    2、一般的数据成员可以在构造函数中初始化。(构造初始化列表初始化和构造函数体内赋值初始化)
   
3、const数据成员必须在构造函数的初始化列表中初始化。(道理很简单,const成员第一次数据初始化就是发生在类构造数据初始化时,一旦过了此时就会出现问题)。
    4、static在类的定义外面初始化。  
   
5、数组成员是不能在初始化列表里初始化的。
    6、不能给数组指定显式的初始化。

从上面的3和5可以看出:C++里面是不能定义常量数组的!但可定义静态常量数组。

const int aa[100];

如果可以,怎么初始化aa?

实际上不行的,这与3 5 矛盾。我们可以用static数据成员来解决此问题。

对于1的疑问:

(1)定义类的时候并没有分配内存,赋值的话值放在哪里呢?

当用类构造对象的时候首先分配内存然后调用构造函数,这时候才可以初始化非静态成员变量.
静态成员变量定义的时候在静态存储区中就分配了内存所以可以初始化

类的定义实际相当与类型声明,并没有分配存储空间,初始化的数据哪里放? 类实例化以后才会有实体存储地址及空间。

(2)类只是一个抽象类型,并不是实体的东西,利用这个抽象类型会实例化成不同的个体,每个个体的特征(数据成员)都不一样,如果在类定义中将特征初始化了,岂不是破坏了抽象性,做了一个面向都一样的模子?

为什么static数据成员一定要在类外初始化

这是因为被static声明的类静态数据成员,其实体远在main()函数开始之前就已经在全局数据段中诞生了(见《Inside   The   C++   Object   Model》page247)!其生命期和类对象是异步的,(而且静态语意说明即使没有类实体的存在,其静态数据成员的实体也是存的)这个时候对象的生命期还没有开始,如果你要到类中去初始化类静态数据成员,让静态数据成员的初始化依赖于类的实体,,那怎么满足前述静态语意呢?难道类永远不被实例化,我们就永远不能访问到被初始化的静态数据成员吗

static const int可以在类里面初始化,因为它既然是const,那程序就不会再去试图初始化

C++类初始化示例

-----------------Test.h----------------------------
#pragma once

class Test
{
private :
    int   var1;
    //int var11= 4; 错误的初始化方法-2、成员变量在定义时不能初始化
    const    int var2 ;
    //const  int var22 =22222; 错误的初始化方法-3、const数据成员必须在构造函数的初始化列表中初始化
    static   int  var3;
    //static int var3333=33333; 错误-只有静态常量成员才能直接赋值来初始化
    static const int var4=4444; //正确,静态常量成员可以直接初始化
    static const int var44;
public:
    Test(void);
    ~Test(void);
};
--------------------Test.cpp-----------------------------------

#include ".\test.h"

int Test::var3 = 3333333; //正确-4、static可在类的定义外面初始化

//int Test::var1 = 11111; 错误-只有静态成员才能在类的外面初始化
Test::Test(void) :var1(11111),var2(22222)   //正确;但var3(33333) 不能在这里初始化
{
    var1 =11111;     //正确, 普通变量可以在这里初始化
    //var2 = 222222; 错误-3、const数据成员必须在构造函数的初始化列表中初始化

    var3 =44444;   //这个是赋值,值会影响到其它实例
}

Test::~Test(void)
{
}

#include<iostream>
using namespace std;

class Test {
  int a;              // 初始化位置:构造函数初始化成员列表,构造函数,其他函数

const int b;        // 初始化位置:构造函数初始化成员列表
  int & c;            // 初始化位置:构造函数初始化成员列表
  static int d;       // 初始化位置:类文件
  static const int e; // 初始化位置:类文件
  static int &f;      // 初始化位置:类文件
public :  
  Test(int a,int b,int c):a(a),b(b),c(c) { }  // 构造函数初始化成员列表
};
int Test::d = 0;          // 类文件
const int Test::e = 0;    // 类文件
int& Test::f = Test::d;   // 类文件
int main() {
    Test test(1,2,3);
    system("PAUSE");
    return 0;
}

http://www.cnblogs.com/pangxiaodong/archive/2011/08/10/2133197.html

http://blog.csdn.net/yjkwf/article/details/6067267

http://www.sowsoy.com/topics-399.html

http://bbs.csdn.net/topics/120095841

http://blog.csdn.net/qqaiustc/article/details/38742435

http://www.cnblogs.com/dongsheng/p/3327498.html

时间: 2024-07-30 10:06:11

类成员变量初始化的相关文章

类成员变量初始化的问题

class window{ window(int maker){ System.out.println("window"+maker); } } class House{ window w1 ;//new window(1); window w3 = new window(3); House(){ System.out.print("House"); w3 = new window(33); } window w4 = new window(4); } class

C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的差别

初始化和赋值对内置类型的成员没有什么大的差别,像任一个构造函数都能够. 但有的时候必须用带有初始化列表的构造函数: (1) 成员类型是没有默认构造函数的类.若没有提供显式初始化时,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败. (2) const成员或引用类型的成员.由于const对象或引用类型仅仅能初始化,不能对他们赋值. 另一个赋值次数,效率上的差别: 初始化參数列表在对象初始化时对成员变量赋值一次. 构造函数内直接赋值,对成员变量赋值两

类的成员变量初始化总结

1. C++变量的初始化方式 首先把需要初始化的成员变量分为几类: ?  一般变量(int) ?  静态成员变量(static int) ?  常量(const int ) ?  静态常量(static const int) 对应的初始化方式是: ?  一般变量可以在初始化列表里或者构造函数里初始化,不能直接初始化或者类外初始化 ?  静态成员变量必须在类外初始化 ?  常量必须在初始化列表里初始化 ?  静态常量必须只能在定义的时候初始化(定义时直接初始化) 举一个简单的例子: [cpp] v

类内const static(static const)成员变量初始化问题

在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许const static成员变量在类外初始化,这个应该是编译器遗留下的bug(你也可以说是要求严格). 在其他编译器下,整型以及枚举类型的const static成员变量是允许在声明的同时进行初始的,其中整型包括int.short.long.char等,非整型是指浮点型 包括float.double等.

Java 类成员的初始化顺序

Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. ? 1 ?无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test { static Samp

变量,final常量,类成员变量,static关键字,实例变量,静态变量,局部变量

1.常量:又称为final变量,在整个程序中仅能被赋值一次 final int num = 1215; num = 1216; // 错误,仅能赋值一次 2.类成员变量:不在方法中定义的变量即为成员变量,在方法体内定义的变量则为局部变量 成员变量含义:对象的属性 public class Book{ int id; string name; //两个成员变量 public String getName(){ int id = 0;  //局部变量,必须进行赋值或初始化 } } 3.static关

C++ 定义引用型类成员变量

作者 : 卿笃军 1)早在学习C语言的时候,我们就知道,在定义结构体的时候,不能在结构体中定义该结构体类型的变量: struct node { int a; // struct node b; //错 struct node *next; //对 }; 因为,该结构体还在定义中....不知道结构体里面具体有什么内容,所以无法定义对象b.但是可以定义指针*next. 2)现在,C++里面多出来了一个叫引用的东东(很强大): 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.

Qt一个工程调用另一个工程的类成员变量

一句两句话已经不能表达现在的激动情绪了,唯有感叹知识的博大精深,并把感叹转变为文字. 同一个工程调用其他类成员变量非常简单. 如: 定义 Test1.h中申明成员变量 class A { public: double m_fTest; }; Test1.cpp中改变成员变量的值. m_fTest = 265.78; 然后再类B中调用类A的成员变量m_fTest,并需求类A中改变该值时,类B中也要随之改变: 调用方法:包涵类A的头文件 #include "test1.h" 然后在调用处声

Java类变量和成员变量初始化过程

一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: 1)       先按照静态成员变量的定义顺序在类内部声明成员变量. 2)       再按照原java类中对成员变量的初始化顺序进行初始化. 一个java类和编译后的class对应的转换如下: 源文件: public class Person{ public static String name=