C++笔记(7)成员初始化列表
成员初始化列表由逗号分隔的初始化列表组成(前面带冒号),它位于参数列调的右括号之后,函数体左括号之前。如果数据成员的名称为mdata,并需要将它初始化为val,则初始化器为mdata(val).
Classy::Classy(int val) : mdata(val)
以下三种情况下需要使用初始化成员列表:
1. 需要初始化const修饰的类成员或初始化引用成员数据;
2. 需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);
3. 子类初始化父类的私有成员;
1. 需要初始化const修饰的类成员或初始化引用成员数据
1)初始化const修饰的类成员
下面为一个队列类,
class Queue
{
private:
struct Node {Item item; struct Node* next;};
enum { Q_size = 10 };
Node* front;
Node* rear;
int items;
const int qsize;
public:
Queue(int qs = Q_size);
~Queue();
};
应该将队列的最大长度qsize设置为构造函数参数qs的值。
下面的实现方法无法正常运行:
Queue::Queue(int qs)
{
front = rear = nullptr;
items = 0;
qsize = qs;
}
这是由于,在调用构造函数时,首先会给成员变量开辟内存,然后通过常规赋值将值存储到内存中。而qsize是常量,可以对它进行初始化,但不能给它赋值。因此,对于const数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化。
使用成员初始化列表,可以这样编写Queue的构造函数:
Queue::Queue(int qs) : qsize(qs)
{
front = rear = nullptr;
items = 0;
}
通常,初值可以是常量或构造函数的参数列表中的参数。这种方法并不限于初始化常量,可以将Queue的构造函数写成如下所示:
Queue::Queue(int qs) :qsize(qs), front(nullptr), rear(nullptr), items(0)
{
}
2)初始化引用成员数据
对于被声明为引用的类成员,也必须使用这种语法:
class Agency{...};
class Agent
{
private:
Agency & belong;
...
};
Agent::Agent(Agency & a) : belong(a){...}
这是因为引用和const数据类似,只能在被创建时进行初始化。对于简单数据成员(例如front和items),使用成员初始化列表和在函数体中赋值没有什么区别。然而,对于本身就是类对象的成员来说,使用成员初始化列表的效率更高。
参考:1.《c++ primer plus》p378
2. https://blog.csdn.net/sinat_20265495/article/details/53670644
C++笔记(7)成员初始化列表的更多相关文章
- C++:用成员初始化列表对数据成员初始化
1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行. 例如: class Complex{ private: double real; double imag; public: Co ...
- C++类的成员初始化列表的相关问题
在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list): 1,初始化一个引用成员(reference member): 2,初始化一个常量 ...
- C++: 类成员初始化列表语法
类的成员初始化列表的初始化的基本语法,类的构造函数还可以运用此语法为其变量初始化: class Class { private: int a; int b; char ch; public: Cl ...
- C++ 成员初始化列表
1.什么是成员初始化列表 #include<iostream> #include<string> using namespace std; class Weapon { pri ...
- C++的成员初始化列表和构造函数体(以前未知)
成员的初始化列表和构造函数在对成员指定初值方面是不一样的.成员初始化列表是对成员初始化,而构造函数,是对成员赋值 成员初始化列表使用初始化的方式来为数据成员指定初值, 而构造函数的函数体是通过赋值的方 ...
- C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...
- (转) C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...
- c++类 用冒号初始化对象(成员初始化列表)
c++类 用冒号初始化对象(成员初始化列表) 成员初始化的顺序不同于它们在构造函数初始化列表中的顺序,而与它们在类定义中的顺序相同 #include<iostream> ; using n ...
- C++ 使用成员初始化列表的一个小坑
注意在成员列表中初始化的顺序并不是列表顺序 而是: 在类中声明的顺序! EventLoop::EventLoop() :looping(false), quit(false),_tid(curThre ...
- 个人学习记录-Cpp基础-成员初始化列表
Translator Translator 参考链接: https://blog.csdn.net/XIONGXING_xx/article/details/115553291http ...
随机推荐
- iOS自动化打包命令xcodebuild大全
iOS实现自动化打包已经稳定运营几年了,不同的场景用到xcodebuild命令不一样,有的参数可能一直都用不到,列举一些常用的命令,比如编译命令: xcodebuild archive -worksp ...
- 如何快速实现Prometheus监控Kubernetes集群
Prometheus K8S集群中常见的监控工具有哪些: Kubernetes Dashboard Kube-monkey K8s-testsuite Kubespray Minikube Prome ...
- NIFI简介
NIFI简介 首先是官网地址:Apache NiFi,不过会百度的估计都能搜到 因为后面的工作一定会用到,所以大致的听了一下讲解操作之类的 大概感觉就是NIFI是个web端的一种控制数据走向的工具?可 ...
- 力扣612(MySQL)-平面上的最近距离(中等)
题目: 表 point_2d 保存了所有点(多于 2 个点)的坐标 (x,y) ,这些点在平面上两两不重合.写一个查询语句找到两点之间的最近距离,保留 2 位小数. 最近距离在点 (-1,-1) 和( ...
- 力扣387(java)-字符串中的第一个唯一字符(简单)
题目: 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 .如果不存在,则返回 -1 . 示例 1: 输入: s = "leetcode"输出: 0示例 2: 输 ...
- LlamaIndex 探索视频系列
如果您喜欢通过视频学习,现在正是查看我们的"探索 LlamaIndex"系列的好时机.否则,我们建议您继续阅读"理解 LlamaIndex"教程. 自下而上开发 ...
- [FE] Quasar BEX 不同位置类型的 debug 调试方式
科普:[FE] Quasar BEX 所有位置类型 types 不同类型调试,查看错误在不同的位置,如下图中的 4 个位置. Refer:https://quasar.dev/quasar-cli/d ...
- [FE] 实时视频流库 hls.js 重载切换资源的方式
hls 播放需要先 attachMedia,然后 loadSource. 如果切换 resource,需要先执行 hls.destroy(),否则会出现混乱. destroy 之后再依次进行 hls ...
- Istio微服务入门---通过istio部署微服务实现灰度发布(15)
一.Istio简介 1.1 Istio介绍 官方文档:https://istio.io/docs/concepts/what-is-istio/ 中文官方文档:https://istio.io/zh/ ...
- go和c#实现斐波那契数列
首先通过C#实现斐波那契数列: using System.Threading.Channels; namespace App001 { internal class Program { static ...