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 | √ | √ |
C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化的更多相关文章
- 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程
继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...
- Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限
一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...
- 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量
原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为 aB , 驼峰命名就可以了.
- 继承时,当父子类都具有相同的成员变量,默认情况下是直接调用子类的成员变量,当要调用父类的成员变量则需要使用super关键之
package day02; public class Person { String name="fl"; }class Car{ }class Student extends ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- C++ static、const和static const类型成员变量声明以及初始化
C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...
- JAVA中的static关键字(静态变量和成员变量)
static的特点: 1.static是一个修饰符,用于修饰成员: 2.static修饰的成员被所有的对象所共享: 3.static优先于对象存在,因为static的成员随着类的加载就已经存在了: 4 ...
- Java中Static关键字详解以及静态变量和成员变量的区别
一.static关键字的特点 (1)修饰成员变量.成员方法(2)随着类的加载而加载(3)优先于对象存在(4)被所有对象共享(5)可以通过类名调用 它本身也可以通过对象名调用 例如:main()方法由j ...
- 为什么static成员必须在类外初始化,而不能在类的头文件中初始化
为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样. class A { pri ...
随机推荐
- 同一电脑如何安装多个jdk
1.安装对应的jdk 本机测试只安装jdk1.7和1.8 2.切换jdk 以我的环境为例,一开始装的是jdk1.7,要切换到jdk1.8时,需修改以下内容 环境变量,该为对应jdk的bin路径 修改注 ...
- mybatis中#{}和${}的区别(转载)
原文地址:http://www.cnblogs.com/baizhanshi/p/5778692.html 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by ...
- 多线程(四)wait()、notify()以及notifyAll()
六.线程的等待和唤醒 1.wait()和notify()的简单示范 public class Wait extends Thread{ public synchronized void run() { ...
- 【CF786B】Legacy
题目大意:初始给定 N 个点,支持三种操作:两点之间连边:一个点与一个连续区间编号的点之间连边:一个连续区间内的点和一个点连边,求执行 N 次操作之后的单源最短路. 题解:学会了线段树优化建图. 发现 ...
- docker安装redis并允许外网访问
拉取redis镜像 docker pull redis:3.2 本地新建redis配置文件 redis.conf ,写入以下内容 #允许外网访问bind 0.0.0.0 daemonize NO pr ...
- 主流包管理工具npm、yarn、cnpm、pnpm之间的区别与联系——原理篇
接触 node 之后,一直使用npm包管理工具, cnpm 一开始会用一些,但是并没有觉得比 npm 快得多,使用 cnpm 的时候还经常安装不成功,只能再用 npm 安装一遍,渐渐的就弃用了 cnp ...
- js的三种异步处理
js的三种异步处理 Promise 对象 含义: Promise是异步编程的一种解决方案, 优点: 相比传统回调函数和事件更加合理和优雅,Promise是链式编程(后面会详细讲述),有效的解决了令 ...
- Python与开源GIS
https://www.osgeo.cn/pygis/ 这里列出了与 GIS 相关的 Python 开源类库与工具. 基础类库(抽象库) • GDAL/OGR 是大部分开源GIS的基础,也包括如Arc ...
- webuploader的一些体验
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.支持大文件分片并发上传. 具体api文档参考:http://fex.b ...
- ettercap局域网DNS切换到恶意网址
ettercap -i eth0 -Tq -M arp:remote -P dns_spoof /// /// Dns欺骗--Ettercap工具进行Dns欺骗 转载至 https://blog.cs ...