Effective C++ 2e Item13

FPGA 高速接口Aurora8B/10B 协议详解与仿真 Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可扩展轻量级链路层协议,为板对板、芯片对芯片以及一些单向链接提供低成本低资源的解决方案。信号源信号描述ref_clk时钟源GT的外部时钟INIT CLK时钟源全局复位,低电平有效DRP CLK时钟源DRP时钟,动态重配置时钟时钟源用户传输的数据钟及逻辑时钟域。 阅读详情

条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同

顽固的Pascal和Ada程序员会经常想念那种可以任意设定数组下标上下限的功能,即,数组下标的范围可以设为10到20,不一定要是0到10。资深的C程序员会坚持一定要从0开始计数,但想个办法来满足那些还在用begin/end的人的这个要求也很容易,这只需要定义一个自己的Array类模板:

template<class T>
class Array {
public:
  Array(int lowBound, int highBound);
  ...

private:
  vector<T> data;               // 数组数据存储在vector对象中
                                // 关于vector模板参见条款49

  size_t size;                  // 数组中元素的数量

  int lBound, hBound;           // 下限,上限
};

template<class T>
Array<T>::Array(int lowBound, int highBound)
: size(highBound - lowBound + 1),
  lBound(lowBound), hBound(highBound),
  data(size)
{}

构造函数会对参数进行合法性检查,以保证highBound至少要大于等于lowBound,但这里有个很糟糕的错误:即使数组的上下限值合法,也绝对没人会知道data里会有多少个元素。

“这怎么可能?”我听见你在叫。“我小心地初始化了size后才把它传给vector的构造函数!”但不幸的是,你没有——你只是想这样做,但没遵守游戏规则:类成员是按照它们在类里被声明的顺序进行初始化的,和它们在成员初始化列表中列出的顺序没一点关系。用上面的Array模板生成的类里,data总会被首先初始化,然后是size, lBound和hBound。

看起来似乎有悖常理,但这么做是有理由的。看下面这种情况:

class Wacko {
public:
  Wacko(const char *s): s1(s), s2(0) {}
  Wacko(const Wacko& rhs): s2(rhs.s1), s1(0) {}

private:
  string s1, s2;
};

Wacko w1 = "Hello world!";
Wacko w2 = w1;

如果成员按它们在初始化列表上出现的顺序被初始化,那w1和w2中的数据成员被创建的顺序就会不同。我们知道,对一个对象的所有成员来说,它们的析构函数被调用的顺序总是和它们在构造函数里被创建的顺序相反。那么,如果允许上面的情况(即,成员按它们在初始化列表上出现的顺序被初始化)发生,编译器就要为每一个对象跟踪其成员初始化的顺序,以保证它们的析构函数以正确的顺序被调用。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在初始化列表中的顺序如何。

实际上,如果你深究一下的话,会发现只是非静态数据成员的初始化遵守以上规则。静态数据成员的行为有点象全局和名字空间对象,所以只会被初始化一次(详见条款47)。另外,基类数据成员总是在派生类数据成员之前被初始化,所以使用继承时,要把基类的初始化列在成员初始化列表的最前面。(如果使用多继承,基类被初始化的顺序和它们被派生类继承的顺序一致,它们在成员初始化列表中的顺序会被忽略。使用多继承有很多地方要考虑。条款43关于多继承应考虑哪些方面的问题提出了很多建议。)

基本的一条是:如果想弄清楚对象被初始化时到底是怎么做的,请确信你的初始化列表中成员列出的顺序和成员在类内声明的顺序一致。

Linux 下 OpenClaw 安装全记录:从零到一的保姆级图文教程 本文主要介绍了Linux 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装Node.js 2.2 步骤二:安装git 2.3 步骤三:安装并配置OpenClaw 2.4 步骤四:配置OpenClaw 2.5 步骤五:配置模型 2.6 步骤六:对话 3. 后续使用步骤 4. 报错解决方案 5. OpenClaw的卸载 阅读详情

相关推荐

大疆 DJI Mobile SDK实战指南——从零构建Android示例开发环境

本文提供了一份详尽的DJI Mobile SDK Android开发环境搭建实战指南。文章手把手教你从注册开发者账号、获取App Key,到配置Android Studio、下载官方示例代码,最终成功运行DJI官方Android示例程序,帮助开发者快速入门无人机应用开发,避开常见编译与依赖问题。

weixin_29188043的博客 275

初始化列表中成员列出的顺序和它们在类中声明的顺序相同

顽固的pascal和ada程序员会经常想念那种可以任意设定数组下标上下限的功能,即,数组下标的范围可以设为10到20,不一定要是0到10。资深的c程序员会坚持一定要从0开始计数,但想个办法来满足那些还在用begin/end的人的这个要求也很容易,这只需要定义一个自己的array类模板: 代码 template&lt;class t&gt;class array {public:array(...

weixin_34128839的博客 206

尚硅谷Redis 7学习笔记

尚硅谷Redis 7学习笔记

不更了,主打一个陪伴 2万+

条款十三: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同

template<class t> class array { public: array(int lowbound, int highbound); ... private: vector<t> data; // 数组数据存储在vector对象中 ...

weixin_30659829的博客 185

CST--时域仿真的网格设置技巧

对于物理概念清晰的工程师而言,使用时域算法几乎能够解决所有电磁仿真问题,但是,掌握时域算法的仿真技巧比掌握频域的难度大,这恐怕也是很多仿真工程师更喜欢使用频域算法的原因,因此,对于时域算法的灵活应用更能考验你是否是一名合格的仿真工程师。

一只豌豆象的博客 6865

ESP32、MicroPython、天问ASR-PRO,串口发送数据并播报

天问ASRPRO语音芯片内置脑神经网络处理器,支持DNN、TDNN、RNN等神经网络及卷积运算硬件运算,非软件运算,支持语音识别、声纹识别、语音增强、语音检测、单麦克风降噪增强、单麦克风回声消除、360度全方位拾音等功能。ASR-PRO可以图形化编程,降低开发难度,对小白友好。之前使用ASRPRO与ESP32进行过语音控制,这次由于一个项目需要对ESP处理过后的数据进行播报,就想到利用该模块。以下程序主要为测试代码,并非实际项目,仅供参考学习(若有错误,欢迎指正)。二者通过串口通信,波特率为9600。

weak_student的博客 5951

在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。

关于最近看到的关于类的初始化的问题,我觉得有必要在这里讲一下,可能平时不注意的话,就有可能犯错。 看下面的代码:    #include "stdafx.h" #include using namespace std; class X {      int i;  int j;    public:     X(){};     X(int val)      : i

heathyhuhu的专栏 3907

Python实战:用NumPy实现LU分解与QR分解(附代码对比)

本文深入探讨了使用NumPy实现LU分解与QR分解的实战方法,通过代码对比分析了两种矩阵分解技术的原理、数值稳定性差异及核心应用场景。LU分解适用于高效求解线性方程组,而QR分解凭借其正交化特性,在求解最小二乘问题和处理病态矩阵时更具优势。文章提供了详细的Python代码示例,帮助开发者根据具体问题选择最合适的分解方法。

php55的博客 1218

构造函数初始化列表中对变量的初始化顺序与变量的声明顺序一致

参考链接:https://www.cnblogs.com/lidabo/p/3628987.html 输出为一个随机数和98,为什么呢? 因为对于初始化列表而言,对成员变量的初始化,是严格按照声明次序,而不是在初始化列表中的顺序进行初始化,如果改为赋值初始化则不会出现这个问题,当然,为了使用初始化列表,还是严格注意声明顺序吧。 ...

bbtang5568的博客 960

LTM4644 四通道并联 16A 输出配置:PCB 布局 3 要点与热仿真验证

本文详细解析了LTM4644四通道并联实现16A输出的PCB布局与热管理要点,包括电流路径对称性设计、热优化布局技巧和接地系统优化。通过实际工程案例,展示了如何确保电流均流、热分布均衡及长期可靠性,为FPGA、ASIC和服务器主板供电设计提供高效解决方案。

weixin_33314040的博客 399

RK平台PCIE-Ethernet扩展:Intel I210移植与性能飞升之路

本文详细介绍了Intel I210千兆以太网控制器在瑞芯微RK平台的移植与优化过程。通过硬件适配、内核配置、驱动开发及性能调优四个关键环节,实现了RK平台的网络性能提升。硬件方面,重点说明了PCIE接口的规范连接与供电检查;软件方面,系统阐述了内核配置、设备树修改和驱动编译流程。在性能优化环节,详细介绍了中断优化、缓冲区设置和TCP/IP协议栈调优策略,并采用Iperf和Netperf工具进行量化测试验证。测试结果显示,优化后的网络吞吐量提升20%以上,延迟降低40%,为工业控制、智能安防等场景提供了可靠的

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 353

必须使用【初始化列表】初始化数据成员的情况

类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员; 2.进入构造函数后在构造函数中执行一般赋值与计算。使用初始化列表有两个原因: 原因1.必须这样做:《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);

不很正派的专栏 4953

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Effective C++ 2e Item12

条款12: 尽量使用初始化而不要在构造函数里赋值看这样一个模板,它生成的类使得一个名字和一个T类型的对象的指针关联起来。templateclass NamedPtr {public:  NamedPtr(const string& initName, T *initPtr);  ...private:  string name;  T *ptr;};(因为有指针成员的对象在进行拷贝

lostmouse的专栏 948

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c++ item

C++书单: 1:第一本   基础好一些的,可以看Stanley B. Lippman的C++ Primer,基础不太好的话,可以看Stanley B. Lippman的  Essential C++ 2:第二本   Pike和Kernighan的The Practice of Programming 3:第三本   Bruce Eckel写的、台湾候捷译的Thinking in C+

u012526180的专栏 3020

Effective C++【学习笔记】Item1

Chapter1 Accustoming yourself to C++ 本书教导读者如何高效地使用C++编程,给读者提出了甚多有用的建议。在这些建议里,其中的一些比其他的更基础更重要。本章讲的就是这些最基础最重要的某些建议。 Item1 --------------------------------------------------------------------------...

cyy2learn的博客 318

Effective C++ Item 13 以对象管理资源

经验1:为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源 经验2:两个常被使用的RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null

778

[翻译] Effective C++, 3rd Edition, 附录 B. 第二和第三版之间的 Item 映射

附录 B. 第二和第三版之间的 Item 映射作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/Effective C++ 的第三版在很多方面与第二版不同,其中最引人注目的是它包含很多新的信息。然而,第二版的大部分内容依然保留在第三版中,虽然经常会改变形式和位置

艺术编程 5819

【Effective C++】 Item 1 View C++ as a federation of language 中英自译

当看完这一节,开始对C++有一点更深的了解。为什么C++这么难去学会,掌握?这里Scott Meyers讲到——View C++ as a federation of language(将C++视为一个语言联邦),看着这个标题我也是各种不懂的= =,但看下去,便会发现如何去理清C++的大方向了。     In the beginning, C++ was just C with some obj

jason__ye的专栏 536

Effective C++----3rd Edition, Item 1:将C++视为语言的联合体

Item 1: 将 C++ 视为 federation of languages(语言联合体) 作者:Scott Meyers 译者:fatalerror99 (iTePub's Nirvana) 发布:http://blog.youkuaiyun.com/fatalerror99/ 最初,C++ 仅仅是在 C 的基础上附加了一些 object-oriented(面向对象)的特性。C+

烽火前秦路 460

Effective C++之 Item 28: 避免返回对象内部构件的“句柄”

假设你正在一个包含矩形的应用程序上工作。每一个矩形都可以用它的左上角和右下角表示出来。为了将一个 Rectangle 对象保持在较小状态,你可能决定那些点的定义的域不应该包含在 Rectangle 本身之中,更合适的做法是放在一个由 Rectangle 指向的辅助的结构体中: class Point { // class for representin...

janeqi1987的专栏 196

读书笔记 effective c++ Item 13 用对象来管理资源

正文回到顶部1.不要手动释放从函数返回的堆资源假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来,1classInvestment{...};//rootclassofhierarchyof23//investmenttypes进一步假设这个程序库通过一个工厂函数(Item 7)来...

weixin_34007886的博客 64

[翻译] Effective C++, 3rd Edition, Item 1: 将 C++ 视为语言的联合体

Item 1: 将 C++ 视为 federation of languages(语言联合体)作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/最初,C++ 仅仅是在 C 的基础上附加了一些 object-oriented(面向对象)的特性。C++ 最初

艺术编程 7360

读书笔记 effective c++ Item 52 如果你实现了placement new,你也要实现placement delete

1. 调用普通版本的operator new抛出异常会发生什么? Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉。当你像下面这样实现一个new表达式的时候,回忆一下Item 16和Item 17: 1 Widget *pw = new Widget;   两个函数会被调用:一个是调用operator new来分配...

HarlanC的专栏 207

读书笔记 effective c++ Item 48 了解模板元编程

1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行。你可以想一想:一个模板元程序是用C++实现的并且可以在C++编译器内部运行的一个程序,它的输出——从模板中实例化出来的C++源码片段——会像往常一样被编译。 2. 使用TMP的优势 如果这没有冲击到你,是因为你没有足够尽力去想。   C++不是...

HarlanC的专栏 200

Effective c++之Item 28: 避免返回对象内部构件的“句柄”

假设你正在一个包含矩形的应用程序上工作。每一个矩形都可以用它的左上角和右下角表示出来。为了将一个 Rectangle 对象保持在较小状态,你可能决定那些点的定义的域不应该包含在 Rectangle 本身之中,更合适的做法是放在一个由 Rectangle 指向的辅助的结构体中: class Point { // class for representing points public: Poi

janeqi1987的专栏 348

读书笔记 effective c++ Item 5 了解c++默认生成并调用的函数

1 编译器会默认生成哪些函数  什么时候空类不再是一个空类?答案是用c++处理的空类。如果你自己不声明,编译器会为你声明它们自己版本的拷贝构造函数,拷贝赋值运算符和析构函数,如果你一个构造函数都没有声明,编译器同样会为你声明一个默认拷贝构造函数。这些所有的函数会是public和inline的(Item30)。因此,如果你写了下面的类: 1 class Empty{}; 本质上来说和下面的类...

HarlanC的专栏 179

读书笔记 effective c++ Item 49 理解new-handler的行为

1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常。很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做。你仍然会看到这种旧行为,但是我会把关于它的讨论推迟到本条款结束的时候。 1.1 调用set_new_handler来指定全局new-handler 在operator new由于不能满足内存分配要求而抛出异常之前,它会调用一个客户指定的叫...

HarlanC的专栏 165
上一篇: Effective C++ 2e Item12
下一篇: Effective C++ 2e Item14
lostmouse
博客等级 码龄26年 22粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值