C++:类与面向对象static和this关键字其他关键字

类与面向对象

  • struct和class
    (1)struct是C中用户自定义类型,主要功能是对功能相关数据的封装
    (2)struct不能直接封装函数,但可以通过封装函数指针来间接封装函数
    (3)struct就是class的初级阶段,class在struct基础上做了很多扩展,便有了面向对象

  • 访问权限
    (1)类是对数据(成员变量)和方法(成员函数)的封装
    (2)封装的一个重要特征就是访问权限管控,本质是为了隐藏实现细节,避免意外篡改
    (3)C++支持三个访问管控级别:private、protected、public

  • C++的对象创建和销毁
    (1)对象的本质等同于C中的变量,对象的创建和销毁也就是变量的产生和销毁,本质上是变量对应的内存地址的分配和释放归还
    (2)C中全局变量和局部变量都是自动分配和回收内存的,堆内存需要用户手工申请和释放(malloc和free调用)
    (3)C++中因为变量升级成了对象,设计到构造函数和析构函数,因此malloc和free升级为了new和delete
    (4)C++中仍然大量使用全局变量和局部变量,但是动态分配占比例越来越多。这是业务特点决定的,不是C++语言决定的。语言只是提供机制,业务才决定策略。

#include <iostream>// 定义一个 struct
struct Person {// 默认是 public 的std::string name;int age;void introduce() {std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl;}
};int main() {// 创建一个 Person 对象Person person;person.name = "Alice";person.age = 30;person.introduce();return 0;
}
#include <iostream>// 定义一个 class
class Person {// 默认是 private 的std::string name;int age;public:// 构造函数Person(std::string n, int a) : name(n), age(a) {}void introduce() {std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl;}// 设置和获取名称的方法void setName(std::string n) {name = n;}std::string getName() const {return name;}// 设置和获取年龄的方法void setAge(int a) {age = a;}int getAge() const {return age;}
};int main() {// 创建一个 Person 对象Person person("Bob", 25);person.introduce();// 修改名称和年龄person.setName("Charlie");person.setAge(28);person.introduce();return 0;
}

static和this关键字

  • static在C中的用法
    (1)静态全局变量和函数,限制链接属性。C++中建议优先使用命名空间机制替代
    (2)静态局部变量,更改地址域和生命周期。C++中继续沿用。
  • static在C++中新增用法
    (1)用在class中,有静态数据成员和静态成员函数
    (2)简单理解:静态成员和方法是属于class的,而非静态是属于对象的
    (3)静态类往往用在单例模式中,实际上和面向对象的思想有所差异
    (4)要真正理解静态类,得先学习面向对象和普通非静态类后才可以
  • this关键字
    (1)本质是个指针,指向当前对象
    (2)this的主要作用是让我们在未定义对象前可以在方法中调用对象里的成员
    (3)this的深度讲解在第2部分,包括具体使用和实现原理

面向对象的其他关键字

  • 面向对象允许类的继承机制
    (1)C++中用:来表示继承关系,有些编程语言有extends关键字表示继承关系
    (2)virtual修饰class的成员函数为虚函数,一般在基类中,只有接口声明没有实体定义
    (3)基类的virtual成员可以在派生类中override重写,以实现面向对象的多态特性
    (4)注意区分重写override与重载overload
    (5)override关键字是C++11引入,用来在派生类中成员函数声明时明确表明需要派生类去重写的那些成员方法,这样如果程序员在成员方法实体定义中做的不对编译器可以报错提醒

  • 继承的终止final
    (1)一个class不希望被继承(不想做父类),可以定义时用final修饰
    (2)一个成员方法不希望被子类override,可以声明时用final修饰
    (3)final是C++11引入的
    (4)很多其他面向对象语言如java中也有final关键字,也是这个作用

  • using关键字
    (1)用法1就是using namespace std;这种
    (2)用法2与class的继承和访问权限限制有关,属于一个声明,能够让private继承的子类去声明并访问父类中本来无权限访问的成员

  • operator
    (1)用于运算符重载,也就是为一个class重定义某种运算符

  • friend
    (1)让不属于一个class的外部函数也能访问class内受保护的成员变量
    (2)实际上是对面向对象的一种扩展或者说破坏,在面向对象深入理解之后再来学习更好

  • explicit
    (1)本意为显式的,对应implicit隐式的
    (2)用来修饰只有一个参数的构造函数,以阻值构造函数不合时宜的类型转换
    (3)很简单一个特性,第2部分再详解

总结

理解struct和class的使用
理解什么是面向对象
理解static在C中的用法和C++中新增用法
理解关键字virtual、重写override与重载overload、final、using、operator、friend、explicit

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cartographer代码学习-扫描匹配(暴力搜索)

在学习栅格地图的时候&#xff0c;我们知道在栅格更新前会先进行扫描匹配获取当前机器人最有可能所在的位姿&#xff1a; // local map frame <- gravity-aligned frame// 扫描匹配, 进行点云与submap的匹配std::unique_ptr<transform::Rigid2d> pose_estimate_2d Sca…

[4]python+selenium - UI自动框架之封装基类BasePage页面

这部分内容是页面上的一些基本操作 from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException, \StaleElementReferenceException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support im…

某安全公司DDoS攻击防御2024年6月报告

引言&#xff1a; 在2024年6月&#xff0c;网络空间的安全挑战汹涌澎湃。分布式拒绝服务&#xff08;DDoS&#xff09;攻击频发&#xff0c;针对云服务、金融科技及在线教育平台的精密打击凸显出当前网络威胁环境的严峻性。 某安全公司作为网络安全防护的中坚力量&#xff0c…

mybatis之动态标签

有些时候&#xff0c;sql语句where条件中&#xff0c;需要一些安全判断&#xff0c;例如按性别检索&#xff0c;如果传入的参数是空的&#xff0c;此时查询出的结果很可能是空的&#xff0c;也许我们需要参数为空时&#xff0c;是查出全部的信息。这是我们可以使用动态sql&…

代码随想录算法训练营Day55|42.接雨水、84.柱状图中最大的矩形

接雨水 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 暴力解法 对计算接到的雨水&#xff0c;有两种方式&#xff0c;一是按照行来计算。 另一种是按列计算 按列计算容易不乱。基本思路如下&#xff1a; 对每列i进行循环&#xff0c;在循环中&#xff0c;找到该列左…

HarmonyOS Next开发学习手册——视频播放 (Video)

Video组件用于播放视频文件并控制其播放状态&#xff0c;常用于为短视频和应用内部视频的列表页面。当视频完整出现时会自动播放&#xff0c;用户点击视频区域则会暂停播放&#xff0c;同时显示播放进度条&#xff0c;通过拖动播放进度条指定视频播放到具体位置。具体用法请参考…

【JVM-02】垃圾收集(回收)算法

【JVM-02】垃圾收集/回收算法 1. 分代收集算法2. 标记-清除算法3. 标记-复制算法4. 标记-整理算法 1. 分代收集算法 分代收集(回收)算法根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代&#xff0c;这样我们就可以根据各个年代的特点选择合适的垃圾收集…

Kotlin中object关键字的作用

1、对象声明&#xff0c;通过这种方式创建一个单例对象。 object MySingleton{ fun function{ //方法代码块 } } 调用方式&#xff1a;MySingleton.function(),类似像Java的静态方法 2、在类内部声明伴生对象 class OutClass { companion object{ val value 1 fun method(…

【算法题】爬楼梯 (经典递归)

题 爬楼梯&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 输入&#xff1a; n 2 输出&#xff1a; 2 解释&#xff1a; 有两种方法可以爬到楼顶。 1 阶 1 阶 2 阶 示例 2&#x…

寒武纪实现高维向量的softmax进阶优化和库函数对比

关于寒武纪编程可以参考本人之前的文章添加链接描述,添加链接描述,添加链接描述 实验证明,axis=0和axis=-1的时候,手写softmax速度可以和库函数媲美,甚至于更甚一筹。 src/softmax.mlu #include <bang.h> #include

Nik Collection by DxO:摄影师的创意利器与调色宝典

在数码摄影的世界里&#xff0c;后期处理是摄影师们展现创意、调整细节、提升作品质量的重要步骤。而Nik Collection by DxO作为一款由DxO公司开发的强大照片编辑插件套件&#xff0c;为摄影师们提供了一套全面的、功能丰富的工具集&#xff0c;让他们的创意得以充分发挥。 Ni…

遇到多语言跨境电商系统源码问题?这里有解决方案!

从手机到电脑&#xff0c;从线下到线上&#xff0c;如今&#xff0c;跨境电商正在打破地域界限&#xff0c;成为全球贸易的新引擎。在这个全球化的背景下&#xff0c;跨境电商平台的运营也面临着一系列的挑战&#xff0c;其中之一就是多语言问题。如果你遇到了多语言跨境电商系…

2065. 最大化一张图中的路径价值 Hard

给你一张 无向 图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff08;都包括&#xff09;。同时给你一个下标从 0 开始的整数数组 values &#xff0c;其中 values[i] 是第 i 个节点的 价值 。同时给你一个下标从 0 开始的二维整数数组 edges &#xf…

小抄 20240629

1 很多人当下焦虑的原因&#xff0c;是短期内无法实现别人长期才能做到的目标&#xff0c;总想几天就能追赶别人几年的努力&#xff0c;只看到了别人的结果&#xff0c;没有思考过别人的过程。 2 把时间线拉长看&#xff0c;人和人都只是阶段性在一起&#xff0c;只要人还在成…

vivado FIFO IP核 中的rd_valid信号

在Vivado中使用FIFO IP核时&#xff0c;valid信号&#xff08;通常称为rd_valid或dout_valid&#xff09;是一个重要的控制信号。让我详细解释它的作用和使用场景。 valid信号的作用&#xff1a; 功能&#xff1a; valid信号是一个输出信号&#xff0c;用于指示FIFO输出数据的…

7基于SpringBoot的SSMP整合案例-表现层开发

目录 1.基于Restfu1进行表现层接口开发 1.1创建功能类 1.2基于Restful制作表现层接口 2.接收参数 2使用Apifox测试表现层接口功能 保存接口&#xff1a; 分页接口&#xff1a; 3.表现层一致性处理 3.1先创建一个工具类&#xff0c;用作后端返回格式统一类&#xff1a;…

springboot校园购物网站APP-计算机毕业设计源码041037

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

笔记-Python文件: .py、.ipynb、.pyi、.pyc、​.pyd

.py 最常见的Python代码文件后缀名&#xff0c;官方称Python源代码文件。 不用过多解释了~ .ipynb 这个还是比较常见的&#xff0c;.ipynb是Jupyter Notebook文件的扩展名&#xff0c;它代表"IPython Notebook"。 学过数据分析&#xff0c;机器学习&#xff0c;深度…

内卷情况下,工程师也应该了解的项目管理

简介&#xff1a;大家好&#xff0c;我是程序员枫哥&#xff0c;&#x1f31f;一线互联网的IT民工、&#x1f4dd;资深面试官、&#x1f339;Java跳槽网创始人。拥有多年一线研发经验&#xff0c;曾就职过科大讯飞、美团网、平安等公司。在上海有自己小伙伴组建的副业团队&…

算法笔记:模拟过程(螺旋遍历矩阵)

1 模拟过程 “模拟过程题”通常指的是那些要求编程者通过编写代码来“模拟”或重现某个过程、系统或规则的题目。这类题目往往不涉及复杂的数据结构或高级算法&#xff0c;而是侧重于对给定规则的精确执行和逻辑的清晰表达。 其中螺旋遍历矩阵的题目就是一类典型的模拟过程题…