clear关于初始化C++类成员

实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit()) 关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了。是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为那样对程序的效率几乎没有影响。但是当vector中存入大量的数据后,并且都数据进行了一些操作,比如删除后,如果我们能积极主动的去释放内存,那么是非常明智的。写到这里,应该明确了size和capacity的 阅读详情

  在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种:

  第一种方法:

双击代码全选
1
2
3
4
5
CMYClass::CSomeClass()
{
  x=0;
  y=1;
}

  第二种方法:

双击代码全选
1
2
3
CMYClass::CSomeClass() : x(0), y(1)
{
}

  本文将要探讨这两种方法的异同以及如何使用这两种方法。

  从技术上说,第二种方法比较好,但是在大多数情况下,两者实际上没有什么区别。第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑。

  让我们先看一下第一个原因——必要性。设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。

双击代码全选
1
2
3
4
class CMember {
public :
  CMember( int x) { ... }
};
  

  因为CMember有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建CMember的一个实例。

双击代码全选
1
2
CMember* pm = new CMember;     // 出错!!
CMember* pm = new CMember(2);   // OK
  

  如果CMember是另一个类的成员,你怎样初始化它呢?答案是你必须使用成员初始化列表。

双击代码全选
1
2
3
4
5
6
7
8
9
10
class CMyClass {
  CMember m_member;
public :
  CMyClass();
};
// 必须使用初始化列表来初始化成员 m_member
CMyClass::CMyClass() : m_member(2)
{
•••
}
  

  没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。

  使用初始化列表的第二个原因是出于效率考虑,当成员类具有一个缺省的构造函数和一个赋值操作符时。MFC的CString提供了一个完美的例子。假定你有一个类CMyClass具有一个CString类型的成员m_str,你想把它初始化为"Hi,how are you."。你有两种选择:

双击代码全选
1
2
3
4
5
6
7
8
9
10
CMyClass::CMyClass() {
// 使用赋值操作符
// CString::operator=(LPCTSTR);
m_str = _T( "Hi,how are you." );
}
// 使用初始化列表
// 和构造函数 CString::CString(LPCTSTR)
CMyClass::CMyClass() : m_str(_T( "Hi,how are you." ))
{
}
  

  在它们之间有什么不同吗?是的。编译器总是确保所有成员对象在构造函数体执行之前被初始化,因此在第一个例子中编译的代码将调用CString::Cstring来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString:: CString(LPCTSTR)的调用并将"Hi,how are you."传递给这个函数。结果是在第一个例子中调用了两个CString函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。

  在CString的例子里这是无所谓的,因为缺省构造函数是内联的,CString只是在需要时为字符串分配内存(即,当你实际赋值时)。但是,一般而言,重复的函数调用是浪费资源的,尤其是当构造函数和赋值操作符分配内存的时候。在一些大的类里面,你可能拥有一个构造函数和一个赋值操作符都要调用同一个负责分配大量内存空间的Init函数。在这种情况下,你必须使用初始化列表,以避免不要的分配两次内存。

  在内建类型如ints或者longs或者其它没有构造函数的类型下,在初始化列表和在构造函数体内赋值这两种方法没有性能上的差别。不管用那一种方法,都只会有一次赋值发生。有些程序员说你应该总是用初始化列表以保持良好习惯,但我从没有发现根据需要在这两种方法之间转换有什么困难。在编程风格上,我倾向于在主体中使用赋值,因为有更多的空间用来格式化和添加注释,你可以写出这样的语句:x=y=z=0;或者memset(this,0,sizeof(this));注意第二个片断绝对是非面向对象的。

  当我考虑初始化列表的问题时,有一个奇怪的特性我应该警告你,它是关于C++初始化类成员的,它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

双击代码全选
1
2
3
4
5
6
7
8
class CMyClass {
  CMyClass( int x, int y);
   int m_x;
   int m_y;
};
CMyClass::CMyClass( int i) : m_y(i), m_x(m_y)
{
}
  

  你可能以为上面的代码将会首先做m_y=i,然后做m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。这个例子是故意这样设计来说明这一点的,然而这种bug会很自然地出现。有两种方法避免它,一个是总是按照你希望它们被初始化的顺序来声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。

ubuntu20.4源码安装最新gcc(gcc V12.2) Ubuntu20.4自带的gcc为V9.4.0的版本,老版本的gcc存在不支持新版本C语言规范,在配置、编译、安装应用软件或工具时,可能存在不能正确安装的问题。(比如:libpqxx-7.7.4在配置时要求c++17版本的支持,但gcc V9.4.0版本不支持c++17)。因此本文介绍ubuntu20.4的系统下载最新gcc12.2版本源码,并进行本地编译、安装。本节内容包括gcc12.2的必备库安装和gcc12.2安装两部分内容组成。 阅读详情

相关推荐

TI Sitara PRU可编程实时单元:工业自动化中的硬实时协处理器解析

在嵌入式系统与工业自动化领域,实时性和确定性是核心需求。实时性指系统对外部事件做出响应的可预测时间,确定性则要求响应时间严格一致,不受其他任务干扰。其技术原理通常通过专用硬件或实时操作系统实现,例如采用独立于主CPU的协处理器来处理高精度时序任务。这种设计的技术价值在于,它能将主CPU从高实时性要求的任务中解放出来,专注于复杂业务逻辑,同时确保关键IO操作达到纳秒级延迟和极低抖动。应用场景广泛覆盖伺服电机控制、工业通信协议加速和多接口扩展等。本文聚焦的TI Sitara系列PRU(可编程实时单元),正是此类

weixin_42526068的博客 284

clCreateBuffer中cl_mem_flags参数解释

clCreateBuffer函数用来给缓存对象分配内存,创建的内存可以是global、local、private,具体看kernel中怎么样声明限定符。 这里的buffer概念是用于kernel函数计算的,只有这里分配的内存可以用于kernel函数执行,其函数签名如下:cl_memclCreateBuffer ( cl_context context,

葫芦与瓢的博客 7822

STM32使用内部RC振荡器作为系统时钟开发项目--内晶振启动模板工程

STM32使用内部RC振荡器时,OSC32_IN,OSC32_OUT接法: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法:    2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。    2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出

overflyme的博客 1万+

clear在c语言中什么意思,c语言关于Clear=Clear的疑问

/************************************************//* 函数功能:初始化UART口 *//************************************************/void UART_init(uint32_t baudrate){uint32_t DL_value,Clear=Clear; // (用这种方式定义变量解决编...

weixin_42499999的博客 1871

芯片设计流程中的def文件

在实际的DEF文件中,每个部分都包含了与实际设计相关的详细信息,这个模板只展示了每个部分的基本结构。在实际应用中,DEF文件通常由EDA(电子设计自动化)工具在完成布局(Placement)和布线(Routing)步骤后自动生成,在集成电路设计中,DEF(Design Exchange Format)文件的模板具体内容会依设计的复杂性和特定需求而变化。简而言之,LEF文件提供了单元的物理特性和规则,而DEF文件使用这些规则来确定单元。)文件描述了特定设计中所有物理元素的精确放置和连线信息。

qq_36045093的博客 4863

Full Range && Limit Range

Full Range && Limit Range1 Full range和Limit Range定义2 为什么会需要Limit Range3 用Full range去显示limit Range图片4 YUV转RGB5 额外 1 Full range和Limit Range定义 我们知道,对于RGB和YUV的色彩空间来说,有个位深(bit-depth)的概念;位深是指记录图像每个像素的色彩通道时所使用的bit数,常见的RGB888,YUV420-8bit。以RGB888为例,其代表R G B

zjhcj1的博客 1万+

C++ STL set:erase()、clear()、find()、insert()方法

该方法不需要传入任何参数,也没有任何返回值。一、erase() 方法。二、clear()方法。

m0_57317650的博客 6088

Concentration Inequality(集中不等式)更新版

欢迎来我博客 https://wyue.name/2020/04/17/1/阅读这一篇博文 转载前请联系我,联系方式请见我博客 https://wyue.name/ Concentration inequality 刻画了一组随机变量的和(或者样本平均数)与其期望值的偏离程度,在算法收敛性分析过程中是非常有用的一类不等式。 这次主要总结一下最近一段时间遇到的集中不等式,不仅是不等式形式,...

Yue的博客 4554

C++的clear()函数

clear()函数的作用:清空容器,存储元素数目变为0,但是容量一般不变。使用shrink_to_fit后,数组被清空,同时容量也为0(空间被释放)证明clear后,数组被清空,长度变为0,但是容量不变。容量(Capacity)与大小(Size)

weixin_73453526的博客 1497

多模态特征融合方法总结

由于本人的研究是文本、语音和图像三者模态数据的融合,所以针对的是这三种模态的特征融合方法进行总结。 首先,多模态特征融合的方法大体分为三种

华辰烟雨的博客 9万+

spring boot 集成cas(一) 服务端搭建

简单点就是统一服务认证,多个系统一次登录。俗称单点登录。

慕孑晨的博客 1957

C++中vector的初始化和at函数以及clear函数的使用

目录vector的初始化at函数clear函数 vector的初始化 vector的初始化有很多,以下列举几种。 vector<int> v; //定义一个vector容器,类型是int,size为0 vector<int> v = {0,1,2}; //定义一个vector容器,类型是int,size为3,初始化值为0,1,2。 vector<int> v(3,1); //定义一个vector容器,类型是int,size为3,全部初始化为1。 at函数 vecto

liebecl的博客 2558

cs231n作业 assignment 1 q1 q2 q3

请先看课程作业地址。有两种做作业的方法,一种是在google Colab上做 (需魔法),另一种就是下载到本地,但是我懒得在本地配置环境,太麻烦了,还得修改一些基础代码,我就直接在google colab上做了google colab 配置环境只需要跟着教程走就好了最后还有一题解答题懒得做的,这个题目做的没啥意思。让我们用简单写法来实现softmax的loss函数与梯度计算。

Leezed525的博客 9278

无涯教程-C++ Multimap - clear函数

函数用于删除multimap集合的所有元素。清除multimap并将其大小设置为0。

无涯教程 1078

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ 向量(vector)一维向量的初始化,二维向量的初始化

参考博客:https://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html 1. 向量的简介 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广...

qq_36427732的博客 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

无涯教程-C++ Map - clear函数

C++ map函数用于删除映射集合的所有元素。它将清除映射并将其大小设置为0。

无涯教程 1293

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++容器的clear操作及其对象析构操作之小记

因为在大学没有好好的研究过数据结构,现在重新拾起,好好的学习一下。最近在写线性表的顺序实现时遇到了一个小问题:对于一个已经存在有数据的线性表,如何将线性表置空?也就是如何来实现ClearList()函数? 一,clear问题的引出 先约定一下线性表的数据类型: 1.  typedef int ElemType;                  //定义数据结构元

booster123456789的专栏 3985

【C++ 避坑指南】为什么 clear() 还不够?聊聊经典的 “Swap to Clear“ 内存释放技巧

是一行优雅且强力的代码。它利用了RAII(资源获取即初始化)和作用域生命周期的特性。它不仅清空了数据,还退还了物理内存。

yiyidedakeaiya的博客 777

C++ vector使用clear后仍有数据的问题

C++

菜鸡正在学习 1283

手动实现C++容器vector的clear操作

一,clear问题的引出 先约定一下线性表的数据类型: 1. typedef int ElemType; //定义数据结构元素的数据类型 2. #define LIST_INIT-SIZE 100 //线性表存储空间的初始分配量 3. #define LISTINCRENMENT 10 //线性表存储空间的分配增量 4. typedef struct{ 5. ElemType * elem; //存储空...

feikudai8460的博客 3566

《C++ set 的清空与销毁:clear 函数与内存释放细节》

C++ 标准库的实现(如 GCC 或 Clang)通常采用内存池策略,保留已分配的内存,以减少未来插入操作的开销。的成员函数,用于移除容器中的所有元素,使 set 变为空容器。调用后,set 的大小变为 0,但容器对象本身仍然存在,底层数据结构(如红黑树)可能保留部分内存以备重用。它在实际开发中常用于数据去重和快速查找,但元素的管理涉及内存分配和释放的细节。当 set 对象生命周期结束时(如超出作用域或显式删除),其析构函数被调用,自动处理所有内存释放。函数和内存释放机制是 C++ 内存管理的核心细节。

2501_93892011的博客 1170

【C++ 命名指导】C++常用动作方法命名深度解析:clear、reset、destroy、invalidate的正确用法

【C++ 命名指导】C++常用动作方法命名深度解析:clear、reset、destroy、invalidate的正确用法

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1284

【c++】vector resize()与初始化

如果使用vector的resize()之前其大小(size()==0)为0,则resize()会给每个初始化;如果之前大小不为0,则之前部分的值不变,后面扩充的空间的值会初始化。所以,如果第二种情况下希望也能全部初始化,则可以先clear(),然后在resize()。 #include <iostream> #include <vector> using namespace std; int main(){ vector<int> a; for(int

ystraw - Come on!!! 5207

C++容器擦除终极指南:erase、erase_if与clear的完美区别

C++标准库(MSVC's implementation of the C++ Standard Library)提供了多种容器元素删除方法,其中`erase`、`erase_if`和`clear`是最常用的三种。本文将深入解析这三个方法的使用场景、实现原理和性能差异,帮助开发者写出更高效、更安全的代码。 ## 一、clear:一键清空容器的快速操作 ⚡️ `clear`方法用于删除容器中的所

gitblog_00953的博客 1073

stringstream clear与str("")的问题

一、str与clear函数 C++Reference对于两者的解释: 可见:clear()用来设置错误状态,相当于状态的重置;str用来获取或预置内容 二、区别 运行下面测试代码: 1 #include<stdio.h> 2 #include<iostream> 3 #include<sstream> 4 #incl...

dianshu1593的博客 272

C++ vector容器初始化,运算及相关函数说明

C++vector容器初始化,运算,相关函数的使用方法总结。

Aslixzhou 2751
上一篇: map和pair的配合使用
下一篇: C++中申请内存的正确方法
一剑平江湖
博客等级 码龄18年 207粉丝 1070原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值