有些成员变量的数据类型比较特别,它们的初始化方式和普通数据类型的成员变量有所不同。这些特殊类型的数据类型包括:

  • 引用(&)
  • 常量(const)
  • 静态(static)
    • 静态常量(static const)

      • 整数类型(integral types:int、char、bool、)
      • 非整数类型

常量(const)和引用(&)必须听过参数列表进行初始化;

静态成员变量的初始化有些特别,是在类外初始化且不能在带有 static 关键字;

带有类内初始值设定项的成员必须为常量(且为integral types);

所以,纵向来看,初始化方式主要有两种:

  • 初始化参数列表:const,引用
  • 类外初始化:static(且不再带有 static 关键字)
  • 类内初始值设定:const+integral type

横向来看,不同数据类型的初始化方式分别为:

  • 引用:初始化参数列表
  • const
    • 类内初始化值设定(如果为integral types)
    • 初始化参数列表
  • static:
    • 类外初始化,且不再带有 static 关键字
    • 类内初始化设置,必须为const,且integral
    • 不可通过构造函数的初始化参数列表进行初始化
      • static 不属于某一特定的类实例,而是属于类,显然不能通过构造函数的初始化参数列表进行 static 变量的初始化

进行类内初始值设定的成员变量的数据类型必须满足:

  • const
  • integral types(int、char、bool)
class Test
{
public:Test():i(1), ri(i), ci(2), cd(0.){}// 对于一般常量型(非integral type)和引用型成员变量,必须通过初始化参数列表进行初始化// 普通成员变量也可以放在函数体中,但本质已不是初始化,而是一种普通的赋值运算,效率极低
private:int i;// 普通成员变量// 初始化参数列表,函数体int& ri;// 引用,初始化参数列表const int ci;// 常量// 类内初始值设定// 初始化参数列表const double cd;// 常量非integral types// 初始化参数列表static int si;// 静态非常量// 类外static const int sci;// 静态常量(integral type)static const double scd;// 静态常量(非integral )
};

一般常量类型(未被static修饰)、引用类型,在类内部即可实现初始化,在类外实现初始化的必定是static类型(当然一部分的静态成员,也即同时又是const和integral type的,可在类内初始值设定,这一语法特性并非为所有的编译器所支持,所以一种推荐的做法,即是凡是static类型的,我们总在类外进行初始化,哪怕它在类内已进行初始值设定,只要在类外初始化时不修改其值):

int Test::si = 0;
const int Test::sci = 1;
const double Test::scd = 99.0;

静态成员属于类作用域,但不属于类对象实例,和普通的static变量一样,程序一运行就分配内存并初始化,生命周期和程序一致;

静态成员其实和全局变量的地位是一致的,只不过编译器把它的使用限制在类作用域内。

References

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

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

  1. java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

    如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test;public class TestClass{// 成员变量赋值第一个执行 ...

  2. 类中数组成员变量怎么初始化,数组名与指针的区别

    使用STL标准模板库之后,编程时已经很少使用数组和指针,相反,多使用序列容器vector代替之. (std::vector<int>,构造函数接受const std::vector< ...

  3. Java中合理使用局部变量替代成员变量、静态变量

    故事起因 一个Java类中可以存在多种形式的变量,可以是最一般的成员变量.或静态变量.或临时变量.如下图: public class VariableDemo {static int staticVa ...

  4. java怎么给类中的私有变量赋值_Java核心技术笔记分享------第二章 类与对象

    对象与类 一.面向对象思想的概述 1>面向对象与面向过程: 二者都是一种思想,面向对象是相对于面向过程而言的.面向过程强调的是功能行为.面向对象,将功能封装进对象,强调具备了功能的对象. 面向对 ...

  5. php键顺序初始化,Java类中各成员初始化的顺序

    了解Java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println(&quo ...

  6. java怎么给类中的私有变量赋值_Java学习笔记分享 如何理解接口抽象类和关键字...

    不知不觉中,千锋重庆学习Java已经半个月了,同学们感觉受益匪浅.有一个同学本来是软件编程专业基础却是意外的差,什么标识符.变量的命名规则.方法的定义.数组.面向对象的封装.继承.多态,还有接口.抽象 ...

  7. java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析

    本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 public class Person { ...

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

    了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father {static{System. out.println(" ...

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

    <p style="line-height: 19px; margin: 10px auto; color: rgb(75, 75, 75); font-family: Verdana ...

最新文章

  1. 162. Leetcode 45. 跳跃游戏 II (贪心算法-贪心区间)
  2. 广东东软学院计算机系主任罗,广东东软学院副校长朱爱红一行来访我校
  3. microsoft project 出现不能保存为xls文件时可以按照如下方法解决
  4. Windows Server 2012 DHCP 服务器中的新功能:故障转移和策略
  5. 分数化简_分数应用题七讲 (一) 图示法解分数应用题
  6. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码
  7. mysql 条件查询分页_百万数据下mysql条件查询及分页查询的注意事项
  8. C#LeetCode刷题之#20-有效的括号(Valid Parentheses)
  9. Eclipse中JDK从1.8换到1.7程序运行报错解决
  10. Metro 应用无法打开解决办法
  11. Javascript定义类(class)的三种方法
  12. 实现TeX的算法:回首编程技术的过去三十年
  13. 2016 年最值得程序员阅读的开源书:《全栈增长工程师指南》
  14. c语言对c99标准声明,C语言三大标准C89,C99和C11
  15. 计算机应用基础第十一版答案,计算机应用基础试题十一.xls
  16. idea 如何查看jdk源码
  17. android11怎么降级真我,安卓11怎么降回安卓10?安卓11降回安卓10相关操作步骤
  18. lvds接口屏线安装图解_液晶屏上的LVDS,TTL,RSDS三种接口的详解
  19. 解决HP1010打印机在WIN7系统下驱动的问题
  20. windows 7 64位 刷J-Link固件 无法识别成串口时 安装 sam-ba at91 usb to serial converter 驱动不成功的解决办法

热门文章

  1. 集群之间数据拷贝distcp性能的调优
  2. hive 外部表不支持添加列
  3. mysql5.6.4安装_win 7 64 mysql 5.6.4 安装
  4. plsql打开sql窗口快捷键_可以提升3倍开发效率的 Intellij IDEA快捷键大全汇总(2019)...
  5. el-form 动态校验规则_动态多线程敏感信息泄露检测工具
  6. mfc单文档中如何将view的基类由CView转为CScrollview
  7. 图像变换--灰度切割、位图切割
  8. 利用HOG特征进行人体检测--简述
  9. EL 11个内置对象
  10. 第二阶段冲刺 站立会议 -01个人进度