C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化

C++类有几种类型的数据成员:普通类型、常量(const)、静态(static)、静态常量(static const)。这里分别探讨以下他们在C++11之前和之后的初始化方式。

c++11之前版本的初始化

在C++11之前常规的数据成员变量只能在构造函数里和初始化列表里进行初始化。const类型的成员变量只能在初始化列表里并且必须在这里进行初始化。static类型只能在类外进行初始化。static const类型除了整型数可以在类内初始化,其他的只能在类外初始化。代码如下:

class A
{
public:
    A();
    ~A();

    //int m_n1 = 10;                // 错误   1   error C2864: “A::m_n1”: 只有静态常量整型数据成员才可以在类中初始化
    int m_n2;
    int m_n3;
    //const int m_nConst_1 = 10;   // 错误    3   error C2864: “A::m_nConst_1”: 只有静态常量整型数据成员才可以在类中初始化

    const int m_nConst_2;
    const int m_nConst_3;
    const int m_nConst_4;

    // static int m_nStatic_1 = 10; // 错误   1   error C2864: “A::m_nStatic_1”: 只有静态常量整型数据成员才可以在类中初始化
    static int m_nStatic_2;
    static int m_nStatic_3;

    // static double m_dStatic_1 = 10.1;// 带有类内初始化表达式的静态数据成员,必须具有不可变的常量整形类型,或必须被指定为“内联”
    static double m_dStatic_2;
    static double m_dStatic_3;

    static const int m_nStaticConst_1 = 10;
    static const int m_nStaticConst_2;
    const static int m_nStaticConst_3;

    //static const double m_dStaticConst_1 = 10; // 错误  1   error C2864: “A::m_dStaticConst_1”: 只有静态常量整型数据成员才可以在类中初始化

    static const double m_dStaticConst_2;
    static const double m_dStaticConst_3;
};

源文件如下:

#include "Initialize.h"

int A::m_nStatic_3 = 13; //类外初始化静态变量
// int A::m_nConst_4 = 13; 非静态数据成员不能在其类的外部定义
const int A::m_nStaticConst_3 = 12; // 类外初始化静态常量

A::A():m_n3(12),m_nConst_2(11),m_nConst_3(12),m_nConst_4(13)//,m_dStaticConst_2(11.0)//, m_nStaticConst_3(12)// m_nStatic_3(13)// 不是类"A"的非静态数据成员或基类
{// 错误  4   error C2758: “A::m_nConst_1”: 必须在构造函数基/成员初始值设定项列表中初始化

    m_n2 = 11;
    // m_nConst_3 = 12;          // 表达式必须是可修改的左值
    // m_nStatic_2 = 12;         // 无法解析外部符号
    // m_dStatic_2 = 11.0;       // 无法解析外部符号
    // m_nStaticConst_2 = 11;    // 表达式必须是可修改的左值
    // m_dStaticConst_2 = 11.0;  // 表达式必须是可修改的左值
}

A::~A()
{

}

如下表:

| type |normal | const | static | static const |

| -- | -- | -- | -- | --|

| 在声明时初始化 | x | x | x | x(只有静态常量整型才可以) |

| 初始化列表初始化 | √ | √ | x | x |

| 构造函数里初始化 | √ | x | x | x |

| 类外初始化 | x | x | √ | √ |

C++11中初始化

在C++11中加入了类内初始化,常规的数据成员变量能在类内、构造函数里和初始化列表里进行初始化。const类型的成员变量只能在初始化列表里并且必须在这里进行初始化。static类型只能在类外进行初始化。static const类型除了整型数可以在类内初始化,其他的只能在类外初始化。代码如下:

class A
{
public:
    A();
    ~A();

    int m_n1 = 10;
    int m_n2;
    int m_n3;
    double m_d1 = 10.0;

    const int m_nConst_1 = 10;
    const int m_nConst_2;
    const int m_nConst_3;
    const int m_nConst_4;

    // static int m_nStatic_1 = 10; // 带有类内初始化表达式的静态数据成员,必须具有不可变的常量整形类型,或必须被指定为“内联”
    static int m_nStatic_2;
    static int m_nStatic_3;

    // static double m_dStatic_1 = 10.1;// 带有类内初始化表达式的静态数据成员,必须具有不可变的常量整形类型,或必须被指定为“内联”
    static double m_dStatic_2;
    static double m_dStatic_3;

    static const int m_nStaticConst_1 = 10;
    static const int m_nStaticConst_2;
    static const int m_nStaticConst_3;

    //static const double m_dStaticConst_1 = 10; // E1591   "const double" 类型的成员不能包含类内初始值设定项
    static const double m_dStaticConst_2;
    static const double m_dStaticConst_3;
};

源文件代码如下:

int A::m_nStatic_3 = 13;
// int A::m_nConst_4 = 13; 非静态数据成员不能在其类的外部定义
const double A::m_dStaticConst_2 = 12.0;
A::A():m_n3(12),m_nConst_2(11),m_nConst_3(12),m_nConst_4(13)//, m_nStaticConst_3(12)// m_nStatic_3(13)// 不是类"A"的非静态数据成员或基类
{
    m_n2 = 11;
    // m_nConst_3 = 12;          // 表达式必须是可修改的左值
    // m_nStatic_2 = 12;         // 无法解析外部符号
    // m_dStatic_2 = 11.0;       // 无法解析外部符号
    // m_nStaticConst_2 = 11;    // 表达式必须是可修改的左值
    // m_dStaticConst_2 = 11.0;  // 表达式必须是可修改的左值
}

A::~A()
{

}

如下表:

type normal const static static const
在声明时初始化 x x x(只有静态常量整型才可以)
初始化列表初始化 x x
构造函数里初始化 x x x
类外初始化 x x

原文地址:https://www.cnblogs.com/konglongdanfo/p/9135260.html

时间: 2024-08-26 00:47:05

C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化的相关文章

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

C++类特殊成员变量(引用、静态、常成员变量)的初始化操作

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引用,必须通过参数列表进行初始化. 静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末. 参考下面的代码以及其中注释: #include <iostream> using namespace std; class BClass { public: BClas

Java中的null对象也可以访问static成员变量和方法

声明:本博客为原创博客,未经允许,不得转载!小伙伴们如果是在别的地方看到的话,建议还是来csdn上看吧(链接为 http://blog.csdn.net/bettarwang/article/details/26515271),看代码和提问.讨论都更方便. 一般来说,一个类的对象要在实例化之后才可以访问类中的成员变量和方法.如果它还是null,通常意义上我们就认为它不能访问类中的成员.实际上确实不提倡这样,而且null对象确实不能访问实例成员(变量和方法),否则会引发NULLPointerExc

为什么static成员必须在类外初始化,而不能在类的头文件中初始化

为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样. class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字 为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的. 什么东西能在类内初始化 能在类中初

java static成员变量方法和非static成员变量方法的区别

这里的普通方法和成员变量是指,非静态方法和非静态成员变量首先static是静态的意思,是修饰符,可以被用来修饰变量或者方法. static成员变量有全局变量的作用       非static成员变量则没有全局变量的作用        局部变量是类的方法里面的变量静态static成员变量是指类的成员变量,他不属于类的对象,只单独属于类,被所有对象共享.当在类中改变他的值时,他在每个对象里面的值都会随之改变. 这也就是说在对象中不能改变他的值,只能在他所在的类中改变,如果他带有final的话(sta

07_面向对象(成员变量和局部变量区别、类作为形式参数的问题、匿名对象、封装、private关键字、this关键字、构造方法、成员方法、static关键字、静态变量和成员变量、main方法)_02

7:构造方法(掌握)    (1)作用:用于对对象的数据进行初始化    (2)格式:        A:方法名和类名相同        B:没有返回值类型,连void都不能有        C:没有返回值                思考题:构造方法中可不可以有return语句呢?        可以.而是我们写成这个样子就OK了:return;        其实,在任何的void类型的方法的最后你都可以写上:return;    (3)构造方法的注意事项        A:如果我们没写构

C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引用,必须通过参数列表进行初始化.    静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末. 参考下面的代码以及其中注释:#include <iostream>using namespace std; class BClass{public: BClass

java中的类修饰符、成员变量修饰符、方法修饰符。

类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final,将一个类生命为最终(即非继承类),表示他不能被其他类继承. friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量修饰符: public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问. private(私有访问控制符)指定该变量只允许自己的类的方法

java面向对象学习之——java中的类修饰符、成员变量修饰符、方法修饰符

类修饰符: public(访问控制符)-->将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类.abstract-->将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现.final-->将一个类生命为最终(即非继承类),表示他不能被其他类继承.friendly-->默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量修饰符: public(公共访问控制符)-->指定该变量为公共的,他可以被任何对象的方法访问.private(私有访问控制符