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 ...
随机推荐
- Linux用户账号文件——passwd
/etc/passwd文件是UNIX安全的关键文件之一.该文件用于用户登录时校验用户的登录名.加密的口令数据项.用户ID(UID).默认的用户组ID(GID).用户信息.用户主目录以及登录后使用的sh ...
- windows安装PostgreSQL
犹豫了一小下,初学不在linux下安装sql,虽然说书上有,还是想记录一下,以后好找 入门的书籍是SQL基础教程第二版,图书馆搜刮来的,毕竟要还 下载页面 http://www.enterprised ...
- tbdr+mrt
有关mrt的在tbdr的架构下的内存排布 system memory肯定是dither 我对这里把握比较大 rt0 rgba8 rt1 r8 这样像素排列是rgba8r8rgba8r8rgba8r8. ...
- $'\r': command not found
在Linux下执行程序最省事的方式就是将系统的执行流程封装成一个shell脚本,上传到linux环境中后就可以直接执行了,但是今天在具体实施的时候出现了错误 $'\r': command not fo ...
- 返回vector指针案例
void prog1_static(void) { int pos = 9; // elem will hold the element's value vector<int> *elem ...
- c++实例之通讯录管理系统之清空联系人功能(七)
#include<iostream> using namespace std; constexpr auto MAX = ; //联系人结构体 struct Person { string ...
- Vue(js框架)
单页技术应用:页面不会跳转,只是局部刷新,利用的是锚点原理. Vue特点:1)组件化 2)数据驱动 Vue的开始使用: 1)先引入Vue文件,引入方式和jquery类似,可以直接引入 <scr ...
- 自己封装的Java excel数据读取方法
package org.webdriver.autotest.data; import jxl.Workbook; import jxl.Sheet; import jxl.Cell; import ...
- Comet OJ - Contest #10 鱼跃龙门 exgcd+推导
考试的时候推出来了,但是忘了 $exgcd$ 咋求,成功爆蛋~ 这里给出一个求最小正整数解的模板: ll solve(ll A,ll B,ll C) { ll x,y,g,b,ans; gcd = e ...
- canvas addHitRegion()
CanvasRenderingContext2D.addHitRegion() 是 Canvas 2D API 给位图添加点击区域的方法. 但是 mobile 都不兼容