C++类中变量定义初始化总结

1、类成员不可以在定义时初始化

2、const类型的成员必须在初始化化列表进行初始化;一般变量在在初始化列表中初始化的顺序决定于定义的顺序

#include<iostream>
using namespace std;

class A
{
private:
    int n1;
    int n2;

public:

    A():n2(0),n1(n2+2){} 

    void Print(){
        cout << "n1:" << n1 << ", n2: " << n2 <<endl;
    }
};

int main()
{

    A a;
    a.Print();

    getchar();
    return 1;
}

输出以上结果的时候,以为是n1:2,n2:0吗

错了!

#include<iostream>
using namespace std;

class A
{
private:
    int n1;
    int n2;

public:

    //A():n2(0),n1(n2+2){} //n1:-858993458, n2: 0
    //A():n1(n2+2),n2(0){}    //n1:-858993458, n2: 0
    //A():n1(0),n2(n1+2){}//n1:0, n2: 2
    A():n2(n1+2),n1(0){}//n1:0, n2: 2

    void Print(){
        cout << "n1:" << n1 << ", n2: " << n2 <<endl;
    }
};

int main()
{

    A a;
    a.Print();

    getchar();
    return 1;
}

  尝试运行以上的例子,可以发现,在用T():name(),name2():{}的形式进行初始化的时候,初始化的顺序是与类中本来类的变量位置的顺序有关,与T():name(),name2():{}的形式中变量名的顺序无关。

3、static类型的成员变量需要在类外进行初始化

原因: 在类中,只是声明了静态变量,并没有定义。 2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。 注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。 3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。 4. 现在,咱们假定要实例化该类的一个对象,那么会发生什么事情呢?静态成员肯定要出现在这个对象里面的,对吧?这时候才去定义那个静态成员吗?这显然是不合适的。因为,比如有另外一个线程也要创建该类的对象,那么也要按照这个方式去定义那个静态成员。这会产生两种可能的情况:1. 重复定义;2. 就算不产生重复定义的情况,也会产生竞争,从而造成死锁的问题,以至于对象无法创建。很显然,编译器不能这么干。那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。 注意:类的静态常量成员可以类内初始化

列子:

#include   <iostream.h> 

class   CDummy { public:         static   int   n; //这里只是声明}; 

int   CDummy::n=9; //这里是定义加初始化

void   main() {         cout < <CDummy::n < <endl; } 

上面这样完全没问题,但是不能直接在类中初始化,比如: 

static   int   n=9; 

4、static的常量可以在类中进行初始化

class A


{


private:


static const int a = 0;  //正确


static const char b = ‘b‘;  //正确


const int c = 0; //错误,非static const不能在类里面初始化


static const int d[10] = {0}; //错误,只有一般数据类型的static const才能在类里面初始化。


//数组应该在.cpp文件里面初始化


}



初始化顺序总结为:
  • 1基类的静态变量或全局变量
  • 2派生类的静态变量或全局变量
  • 3基类的成员变量
  • 4派生类的成员变量


时间: 2024-11-07 17:25:46

C++类中变量定义初始化总结的相关文章

java类中各成员初始化的顺序

了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println("父类代码块初始化" ); } private static String s=print(); public static String print() { System. out.println

C++---类成员变量定义为引用

摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #include <iostream> using namespace std; class A { public: A(int k):a(n){ // 必须要在初始化列表中进行初始化 n = k; cout << a <<endl; } int get() const { r

C++初始化中变量的初始化方法

之前学习C++的时候没有记得做好笔记,现在重新补做!!!!! 1.普通变量的初始化 因为C语言是C++子集,自然包含了所有C语言的特性,所以在C语言的基础之上又新增了属于C++自己特性的初始化方式,以C++11标准来说明: (1)int a = 10;           // 这种是最熟悉的方式,是从C中继承过来的 (2)int a (10);             // 使用一个小括号将初始化的数值括起来,a与小括号之间有无空格都行 (3)int a {10};            //

在Go中变量定义

一个变量的定义是指,告诉编译器在哪里,有多少创建存储变量.变量定义指定一个数据类型,并且包含的该类型,如下的一个或多个变量的列表: var variable_list optional_data_type; 在这里,optional_data_type可以包括字节,整型,float32,complex64,布尔或任何用户定义的对象等有效Go的数据类型,variable_list可以由用逗号分隔的一个或多个标识符名称.一些有效的声明如下所示: var i, j, k int; var c, ch

获取class对象的三种方法以及通过Class对象获取某个类中变量,方法,访问成员

public class ReflexAndClass { public static void main(String[] args) throws Exception { /** * 获取Class对象的三种方式 * 1 Object --> getClass(); * 2 任何数据类型(包括基本数据类型)都有一个静态的class属性 * 3 通过Class类的静态方法:forName(String className)(常用) * * * 注意:在运行期间,一个类,只有一个Class对象产

C++中变量自动初始化的问题

C++中有一些变量在如果没有赋初值会被编译器自动赋值为0,但有的变量又不会这样,而得到一个随机数,下面具体讨论一下: 首先看一下C++中的几个存储区:1.栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.     2.堆区:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.     3.全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变

【转】Java类成员变量默认初始化规则

一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: ----------------------------------------------------------------------------------------- Boolean false Char '\u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d -----------------------

浅谈java类中成员的初始化顺序(一)

类被创建之后的成员的初始化顺序到底是怎么样的? 首先 不考虑继承 package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 private static int a=1; private String str="我被赋值了"; static{ //为什么static成员函数不能访问非static变量, 不能调用非static成员函数? //静态代码块独立于对象而存在 不依赖于对象存在 简单来说可以直接以类型名

static在类中的定义,和enum的用法

class A { // static int a = 1;//错误,静态变量在类外定义 static int a; static const int b = 1;//如果是静态成员常量,则可以在类内定义 static const int c;//也可以在外面定义 }; int A::a = 1;//类外定义静态成员变量: const int A::c = 1;//在外面定义的静态成员常量 int main() { enum day{sunday,monday,tuesday}; day a =