【C++】类和对象(3)

C++笔记3•类和对象2• 类和对象2 阅读详情


一、初始化列表

首先我们先回顾一下构造函数,对象的初始化由构造函数来完成,我们可以在构造函数的函数体内对对象的成员变量进行赋值,但这就有一个问题,如下:
在这里插入图片描述

答案:显然不是,因为变量只能定义一次。
在这里插入图片描述

也就是说,构造函数的函数体内部并不是初始化的地方(定义的地方),而是赋值的地方。那这些成员变量定义的地方在哪里呢?在初始化列表中。


初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

在这里插入图片描述
初始化列表有以下特性:

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)。 意思是:即使你没有写初始化列表,每个成员变量还是会走一遍初始化列表,你写了初始化列表,每个成员变量你也只能写一次。
    在这里插入图片描述
  2. 类中包含以下成员,必须放在初始化列表位置进行初始化。引用成员变量,const成员变量,自定义类型成员(且该类没有合适的默认构造函数)
    在这里插入图片描述

c++11可以给成员变量缺省值,这里的缺省值实际上是提供给了初始化列表。在这里插入图片描述

  1. 初始化列表的初始化顺序与成员变量的声明顺序一致。因此一定要注意初始化列表是初始化顺序,最好代码的顺序与成员变量的声明顺序一致。
    在这里插入图片描述

因此尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。(当然这并不代表构造函数的函数体没有用了)
在这里插入图片描述


二、explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用

在这里插入图片描述

按语法来说是:(int)2 先进行构造产生一个 (A)的临时对象,然后再将(A)临时对象拷贝构造给a2
但是一般情况下:在同一个表达式里面,连续的构造,编译器都会优化为 直接使用2来构造,相当于a1的那种方式。
验证如下:
在这里插入图片描述

那有人就问了,有没有这种可能性:不存在隐式类型转换,编译器也没有进行优化,不管哪种情况都是直接用进行了拷贝构造。一样可以进行验证:
在这里插入图片描述

那这有什么用呢?
传参可以像这样传:
在这里插入图片描述


那如果我不允许这种转换发生呢,可以使用explicit关键字。
在这里插入图片描述
此时就不允许从 (int) 转换到 A了


三、static成员

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

在这里插入图片描述
static成员的特性:

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区,故下面的A类大小为4

在这里插入图片描述

  1. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明,即静态成员变量不会走初始化列表。
    在这里插入图片描述

  2. 类静态成员即可用 类名::静态成员或者对象.静态成员来访问
    在这里插入图片描述

  3. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员,因为没有this指针,所以可以像这样调用A::fun()
    在这里插入图片描述

  4. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

  5. 非静态成员函数可以调用静态成员函数,静态成员函数不可以调用非静态成员函数
    在这里插入图片描述
    思考题:如何构造一个类,使其对象只能在栈、堆上创建?
    在这里插入图片描述
    操作如下:
    在这里插入图片描述


牛客网:计算1+2+3+……+n

class Sum {
public:
    Sum() {
        sum += i;
        i++;
    }
    static int GetSum() {
        return sum;
    }
private:
    static int sum;
    static int i;
};
int Sum::sum = 0;
int Sum::i = 1;
class Solution {
public:
    int Sum_Solution(int n) {
        Sum a[n];
        return Sum::GetSum();
    }
};

四、友元

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
友元分为:友元函数和友元类

4.1 友元函数

在这里插入图片描述
友元函数的特性:

  1. 友元函数可访问类的私有和保护成员,但不是类的成员函数

  2. 友元函数不能用const修饰:这里的const修饰指的是在后面加constvoid func() const {}

  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
    在这里插入图片描述

  4. 一个函数可以是多个类的友元函数

  5. 友元函数的调用与普通函数的调用原理相同

4.2 友元类

友元类的特性:

  1. 友元关系是单向的,不具有交换性。
    比如A类和B类,在A类中声明B类为其友元类,那么可以在B类中直接访问A类的私有成员变量,但想在A类中访问B类中私有的成员变量则不行。
  2. 友元关系不能传递
    如果B是A的友元,C是B的友元,则不能说明C时A的友元。
  3. 友元关系不能继承
    在这里插入图片描述

五、内部类

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

内部类的特征:

  1. 内部类受访问限定符的限制
    在这里插入图片描述
  2. 内部类天生是外部类的友元类
    在这里插入图片描述

六、匿名对象

匿名对象就是没有名字的对象
匿名对象的特性:

  1. 它的生命周期就在当前行
    在这里插入图片描述
  2. 匿名对象具有常性
    在这里插入图片描述

小提一句:const引用会延长匿名对象的生命周期


七、编译器的优化

在第二节explicit关键字中提到,在连续的两次构造/拷贝构造,编译器会优化为一次构造/拷贝构造
在这里插入图片描述
像下面这样写成两行, 就不会优化。
在这里插入图片描述
因此尽量写成一行,从而让编译器能够实现优化。

3 类和对象【C++】 3 C++ 阅读详情

相关推荐

Star CCM+中的物性参数(定值、多项式、查表)

仿真过程中我们一定会遇到设置物性参数的问题,对于固定的物性参数还好说,直接输入一个固定的值即可。但是对于冷却液、气体、两相流等,物性参数是随着温度或温度和压力变化的。此时就涉及到多项式和查表。首先创建物理连续体,选择计算模型。

2201_75375391的博客 2958

Cpp类和对象(上)(3)

哈哈,类和对象可以说是我们正式学习Cpp的第一节课上篇还不算很难,甚至可以说还是蛮有意思的正文开始!声明和定义全部放在类体中请注意,成员函数如果在类中定义,编译器可能会将其当成内联函数处理声明放在头文件(.h)中,定义放在源文件(.cpp)中请注意,成员函数名前需要加 “类名::”一般情况下,更期望采用第二种方式,因为这样体现了面对对象编程的封装特性提高代码的可维护性你再看上面这两段代码的成员变量,你可能奇怪为什么每个变量前都有个下划线_,这是为了与成员函数的形参区分开class Date。

tan180°的博客 2668

Versal - 从零构建Petalinux 2024.2 AI边缘计算平台(VD100+SDT+JupyterLab实战)

本文详细介绍了如何从零开始,基于AMD Versal VD100开发板和Petalinux 2024.2构建AI边缘计算平台。内容涵盖开发环境搭建、Petalinux工程创建与配置、SDT新流程实战、启动SD卡制作,并最终集成JupyterLab与Conda,打造出开箱即用的交互式AI开发环境,帮助开发者快速进行算法验证与部署。

5f4d3s2a1q的博客 489

C++类和对象 - 3

这时候就需要初始化列表去帮助。

qiuyunoqy的博客 1040

低功耗蓝牙技术 > GAP和GATT介绍

GAP和GATT作为蓝牙协议栈中的关键协议,为BLE设备之间的通信提供了标准和框架。GAP主要负责设备的连接、广播和角色定义,而GATT则定义了BLE设备之间的具体通信方式,通过Services和Characteristics实现数据的传输和交换。在蓝牙技术的发展中,GAP和GATT两个协议扮演着关键的角色,为BLE(低功耗蓝牙)设备之间的通信提供了规范和框架。GATT连接是建立在GAP协议之上的,是一种独占连接,一个BLE外设同时只能连接一个中心设备。连接建立后,通信是双向的,不同于GAP的单向通信。

DL_62532的专栏 4031

基于ResNet-50的猫狗分类训练

基于ResNet-50的猫狗分类python训练

weixin_46352497的博客 1004

3、【C++】类和对象总结

类内定义和类外定义。成员函数在类内定义时,编译器会将其视为内联函数(inline)(建议性),适合短小的函数。public:// 类内定义:自动成为inline候选private:int _year;int _month;int _day;成员函数在类内声明,在类外定义。类外定义时需要使用作用域限定符指明所属类。public:// 类内声明private:int _year;int _month;int _day;// 类外定义:需加Date::限定注意。

gamblerofdestinyR14的博客 1225

Comsol 压电换能器声场仿真(远场分析、边界元法优化)

本文详细介绍了在Comsol中使用边界元法进行压电换能器远场声场仿真的高效方法。针对传统有限元法计算远场时内存消耗大、耗时长的问题,文章阐述了边界元法在处理无限域、提升计算效率和精确获取远场指向性方面的核心优势,并提供了从多物理场耦合设置、网格划分策略到求解器配置及结果验证的完整实战指南。

weixin_29045585的博客 407

【C++】类和对象(3.2W字剖析类和对象)

类和对象相关内容,构造函数和析构函数、拷贝构造的详细解析,全文3.2w字步步剖析类和对象

就业知识博客 1348

HSPICE用户必看:用Sigrity Broadband SPICE解决复杂封装建模的3个技巧

本文为HSPICE用户分享了三个使用Sigrity Broadband SPICE解决复杂封装建模难题的实战技巧。通过将宽频带S参数高效转换为时域SPICE模型,能显著提升仿真速度、保障收敛性,并精准分析谐振、返回路径不连续及超多端口PDN等关键问题,助力实现高效稳定的系统级信号与电源完整性分析。

metal的博客 601

Spec Kit:GitHub 官方推出的规范驱动开发工具包,让 AI 编程真正可控、高效、高质量

先明确“做什么”和“为什么”,再考虑“如何做”。它通过一系列标准化命令(如/specify/plan/implement可验证的功能规格(spec)可执行的技术方案(plan)可追溯的开发任务(tasks)高质量的实现代码(code)最终实现“规范即代码,代码即规范”的闭环。📌项目地址许可证:MIT(完全开源,欢迎贡献)Spec Kit 代表了 GitHub 对AI 原生开发(AI-Native Development)AI 不应替代开发者,而应放大开发者的意图。

lpfasd123的博客 1712

从C向C++3——类和对象

C++之类和对象基础

墨城烟柳ベ旧人殇的博客 1396

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8401

【C++】类和对象3

本篇文章主要讲解类和对象的基础知识,包括初始化列表、类型转换、static 成员、友元、内部类以及匿名对象。

L_0907的博客 796

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++——类和对象3

引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则编译报错。(这三类必须在定义的时候(初始化列表)就初始化)

2302_80045891的博客 965

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【C++】类和对象(3)

本文深入探讨了C++中构造函数的初始化列表及其特性。初始化列表是构造函数中用于初始化成员变量的另一种方式,语法以冒号开始,后跟以逗号分隔的成员变量及其初始值。初始化列表的特性包括:每个成员变量只能出现一次;引用、const成员变量及无默认构造的类类型变量必须在初始化列表中初始化;C++11支持在成员变量声明时提供缺省值;初始化列表按成员变量声明顺序初始化,与列表中的顺序无关。此外,文章还提到C++支持内置类型隐式转换为类类型对象,需有相关构造函数。总结指出,无论是否显式使用初始化列表,每个构造函数都有初始化

Xie_sheng的博客 2825

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++复习3】类和对象

回答:1. 面向对象是一种编程思想,把一切东西看成是一个个对象,比如人、耳机、鼠标、水杯等,他们各 自都有属性,比如:耳机是白色的,鼠标是黑色的,水杯是圆柱形的等等,把这些对象拥有的属性 变量和操作这些属性变量的函数打包成一个类来表示2. 面向过程和面向对象的区别 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的 重写过程回答:只定义了析构函数,编译器将自动为我们生成拷贝构造函数和默认构造函数。默认构造函数和初始化构造函数。

2301_79582015的博客 1167

3. C++类和对象引入以及类的介绍使用

本文主要内容是C++类和对象引入以及类的介绍使用,面向过程与面向对象的区别

分享C/C++/Linux/网络/数据库/数据结构 1597

C++类和对象3

接下来的是对类和对象的知识点的补充,类和对象1,2是我们的基础,如果没有看过可以先看类和对象1,2哦类和对象1类和对象2一、初始化列表构造函数初始化列表就是在构造函数名后加一个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。public:: _x(x), _y(y) // ← 这里就是初始化列表{ }private:int _x;int _y;本质。

Hike的博客 1227

C++类和对象梳理3

比如下面的Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。静态的成员变量一定要在类外进行初始化。,因为缺省值是给初始化列表用的,初始化列表只初始化对象的成员(成员存在类中),虽然静态成员变量是类的成员,但它没有存在类中,所以不会走初始化列表。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

2301_81758005的博客 2050

c++类和对象3

c++类与对象的细节知识点

weixin_50470247的博客 331

C++入门篇3(类和对象【重点】)

C++入门篇3(类和对象【重点】)

Xpccccc的博客 2080
上一篇: 【C++】类和对象详解(2)
下一篇: 【C++】C/C++内存管理
ProcedureStone
博客等级 码龄4年 254粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值