C++不同的数据成员类型

C++为数据成员提供了多种选择,除了在类中简单地声明数据成员外,还可以创建static数据成员(类的所有对象共享)、const数据成员、引用数据成员、const引用数据成员和其他成员。本文将解释这些不同类型的数据成员。

静态数据成员

有时让类的所有对象都包含某个变量的副本是没有必要的,数据成员可能只对类有意义,而每个对象都拥有其副本是不合适的。C++用static数据成员解决了这个问题。static数据成员属于类但不是对象的数据成员,可将static数据成员当作类的全局变量。

class Spreadsheet
{private:static size_t ms_counter; // 不能在此初始化值,也不能在构造函数内初始化,只能在类外初始化
};

不仅要在类定义中列出static类成员,还需要在源文件中为其分配内存,通常是定义类方法的那个源文件。还可以初始化static成员,但注意与普通的变量和数据成员不同,默认情况下它们会初始化为0。static指针会初始化为nullptr。示例:为ms_counter分配空间并初始化为0的代码

size_t Spreadsheet::ms_counter;

静态数据成员默认情况下初始化为0,但是如果有需要,可以将它们显示的初始化为0。

size_t Spreadsheet::ms_counter{0};

内联变量

从c++17开始,可以将静态数据成员声明为inline。这样做的好处就是不必在源文件中为它们分配空间。

class Spreadsheet
{private:static inline size_t ms_counter{0}; // 之前类外初始化的代码可以删除了
};

在类方法内访问静态数据成员

在类方法内部,可以像使用普通数据成员一样使用静态数据成员。例如,为Spreadsheet类创建一个m_id成员,并在Spreadsheet构造函数中用ms_counter成员初始化它。

class Spreadsheet
{public:Spreadsheet() : m_id{ms_counter++} {};private:size_t m_id{0};static size_t inline ms_counter{0};
};

本例中,假使一旦给某个对象指定id,就不应该改变。所以在拷贝赋值运算符中不应该复制id,因此可以把m_id设置为const数据成员。

class Spreadsheet
{private:const size_t m_id{0};
};

由于const数据成员一经创建就无法更改,例如,无法在构造函数体内初始化它们。此类数据成员必须直接在类定义内部或构造函数初始化器中初始化,这也意味着不能在赋值运算符中为此类数据成员赋值。

在方法外访问静态数据成员

访问控制限定符适用于static数据成员,ms_counter是private的,因此不能在类方法外访问。如果ms_counter是public的,就可以在类方法外访问,具体方法是用 :: 作用域解析运算符指出这个变量是Spreadsheet类的一部分。

int c { Spreadsheet::ms_counter };

然而,不建议使用public数据成员。应该提供public的get/set方法来授权访问权限。如果要访问static数据成员,可以实现static的get/set方法。

const static数据成员

类中的数据成员可声明为const,意味着在创建并初始化后,值不能再改变。如果某个常量只适用于类,应该使用static const(或者const static)数据成员,也称为类常量,而不是全局常量。可以在类定义中和初始化整型和枚举类型的static const数据成员,而不需要将其指定为内联变量。

例如,创建类指定了电子表格的最大高度和宽度,如果用户想要创建的电子表格的高度或者宽度大于最大值,那么就改用指定的最大值。可将最大高度和宽度设置为Spreadsheet类的static const成员。

class Spreadsheet
{public:static const size_t MaxHeight{100};static const size_t MaxWidth{100};Spreadsheet(size_t width, size_t height): m_id{ms_counter++},m_width{min(width, MaxWidth)},m_height{min(height, MaxHeight)} {}private:size_t m_width;size_t m_height;const size_t m_id{0};static size_t inline ms_counter{0};
};

这些常量也可以作为构造函数的参数的默认值。需要注意的是,只能为一组连续的参数(从右向左)指定默认值。示例:

Spreadsheet(size_t width = MaxWidth, size_t height = MaxHeight);

引用数据成员

假设Spreadsheet类需要用到一个控制电子表格的类SpreadsheetApplication,示例:

class SpreadsheetApplication {};
class Spreadsheet
{public:static const size_t MaxHeight{100};static const size_t MaxWidth{100};Spreadsheet(size_t width, size_t height, SpreadsheetApplication &app): m_id{ms_counter++},m_width{min(width, MaxWidth)},m_height{min(height, MaxHeight)},m_app{app} {}private:size_t m_width;size_t m_height;const size_t m_id{0};static size_t inline ms_counter{0};SpreadsheetApplication &m_app;
};

将一个SpreadsheetApplication引用作为数据成员添加进来,在此情况下建议使用引用而不是指针,因为Spreadsheet总会指向一个SpreadsheetApplication,而指针则无法保证这一点。

注意:在构造函数中,每个Spreadsheet都得到了一个应用程序引用。如果不指向某些事物,引用将无法存在,因此在构造函数初始化器中必须给m_app指定一个值!

在拷贝构造函数中也必须初始化这个引用成员。再次提醒,在初始化一个引用之后,不能改变它指向的对象。因此无法在赋值运算符中对引用赋值。这就意味着根据使用的情形,可能无法为具有引用数据成员的类提供赋值运算符。这种情况下,通常将赋值运算符标记为删除。

C++不同的数据成员类型相关推荐

  1. cpp课程设计实验题:定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(coun

    CPP实验题:定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name).学号(num).数学成绩(mathScore).英语成绩(englishScore).人数(count).数 ...

  2. C++实验编程题:.定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count

    题目描述: *6.定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name).学号(num).数学成绩(mathScore).英语成绩(englishScore).人数(count) ...

  3. 定义一个结构体类型Point,包含数据成员x和y,它们是平面坐标系下的坐标点(x,y),求两点间的距离

    题目描述:定义一个结构体类型Point,包含数据成员x和y,它们是平面坐标系下的坐标点(x,y).编写如下函数: (1)struct Point Input():在函数中输入一个坐标点的值,并返回该值 ...

  4. C++类的常量数据成员,静态数据成员,常量静态数据成员,枚举类型

    文章目录 C++类的常量数据成员,静态数据成员,常量静态数据成员 const成员 static成员 静态整型常量数据成员 C++枚举类型 C++中作用域受限的枚举类型 经典做法 C++11的枚举类 C ...

  5. MySQL学习笔记(5)之数据定义类型

    数据定义类型总汇 1.整数型: 整数类型 字节 有符号范围 无符号范围 用途 tinyint 1 (-128,127) (0,255) 小整数 smallint 2 (-32 768,32 767) ...

  6. 理解数据成员指针、函数成员指针

    转自:http://www.cnblogs.com/malecrab/p/5572119.html 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针. 而对于数据成员指针变 ...

  7. 跟小静读CLR via C#(05)- 访问限定、数据成员

    跟小静读CLR via C#(05)- 访问限定.数据成员 今天跟大家分享一下关于访问限定和数据成员的知识.主要包括以下两点: Abstract, sealed, virtual, new, over ...

  8. c/c++对象模型大总结:第5-8章、数据成员的存取与布局

    深度探索c++对象模型大总结.中 --第五~八章 作者:July.吴黎明. 声明:版权所有,侵权必究. 二零一一年三月十八日. 本文接上一篇 c++对象模型大总结:第1-4章.对象初探与构造函数,而写 ...

  9. [YTU]_2618 ( B 求类中数据成员的最大值-类模板)

    题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值. 类模板声明如下: template<class numtype> class Max { ...

最新文章

  1. 有关表格边框的css样式表语法说明
  2. 工作中常用的正则表达式
  3. layui如何隐藏弹出层关闭的按钮
  4. Linux学习之SAMBA共享(无密码)
  5. MyCAT全局序列号-数据库方式
  6. [转载] 高级人工智能——第3章 约束推理
  7. WIFI内部通话系统技术解决方案
  8. 从极速号码魔方软件中获取手机号码的城市号段归属地数据
  9. 李国飞:全面反思腾讯的战略
  10. 只有A2L文件如何连接INCA
  11. 微信小程序电影推荐demo实战开发小结(附源码及思维导图) ... ...
  12. android系统经纬度,android系统获取经纬度总是0值,求解决
  13. 带你认识 M1、UID、CUID、FUID、UFUID
  14. 使用Windows Server 2003轻松建立森林间信任
  15. 如何判断Linux 内核是稳定版本还是测试版本
  16. prometheus 钉钉告警
  17. 电视剧《奋斗》和《蜗居》的区别(完整版)
  18. Java Web实用开发技术(4)------在线编辑器
  19. PHP框架中Symfony对数据库的操作
  20. 写一篇关于《红楼梦》的论文,比较推荐的角度或者选题有哪些?

热门文章

  1. 中等职业学校计算机课程标准,中等职业学校数学课程标准
  2. JQuery实现复制数据到剪贴板之各种麻花与右键点击弹出选择菜单
  3. 驭势主张 | 创业路上,勿失童心
  4. 9、Solr 检索工具
  5. 金蝶中间件上传文件报错
  6. 校企合作计算机专业共建协议书,校企合作共建实训基地的协议书
  7. 如何做一个项目.ppt
  8. 一名程序猿的习惯养成记录手帐(六)
  9. 喵哈哈村的魔法考试 (1)
  10. Java实现汉字转拼音,多音字处理,简单明了