C++初阶——权限与继承

news2024/11/29 10:53:40

 

目录

一、C++权限方面的问题

1.访问权限

2.继承机制

二、C++const引用

const引用有以下几个特点

临时对象引用

常量引用成员变量

 二、c++引用空间相关问题

三.auto


 

一、C++权限方面的问题

【C++入门】访问权限管控和继承机制详解_权限继承功能-CSDN博客文章浏览阅读840次。(2)但是在派生类还是可以调用基类的同名成员的,可以使用指定域名的方法:父类::成员;显示的指定要调用父类的成员而不是派生类的成员;_权限继承功能https://blog.csdn.net/weixin_42031299/article/details/127342114

C++ 中的访问权限(Access Specifiers)管控和继承机制是面向对象编程的重要概念之一。通过访问权限和继承,可以控制类成员的可见性和访问级别。

1.访问权限

  1. C++ 提供了三种访问权限:公有(public)、私有(private)和保护(protected)。它们用于限制类成员的可见性和访问级别。

  2. 默认情况下,类的成员是私有的。我们可以使用访问权限来控制哪些成员对外部可见,哪些成员对外部隐藏。

    例如:

    • 公有(public):公有成员在类的内部和外部都是可见的,可以被任何代码访问。
    • 私有(private):私有成员只能在类的内部访问,外部无法直接访问私有成员。
    • 保护(protected):保护成员在类的内部和子类中可见,但在外部不可直接访问。
  • class MyClass {
    public:
        int publicVar;    // 公有成员变量
        void publicFunc();    // 公有成员函数
    
    private:
        int privateVar;   // 私有成员变量
        void privateFunc();   // 私有成员函数
    
    protected:
        int protectedVar;   // 保护成员变量
        void protectedFunc();   // 保护成员函数
    };
    

2.继承机制

  • C++ 中的继承机制允许一个类(称为派生类或子类)从另一个类(称为基类或父类)继承属性和行为。

    继承可以通过关键字 classstruct 来定义。

    例如:

    • 公有继承(public inheritance):派生类继承了基类的公有成员和保护成员,但私有成员不可直接访问。
    • 私有继承(private inheritance):派生类继承了基类的公有成员和保护成员,但都变为私有成员。
    • 保护继承(protected inheritance):派生类继承了基类的公有成员和保护成员,但都变为保护成员。
  1. // 基类
    class BaseClass {
    public:
        int publicVar;
        void publicFunc();
    
    private:
        int privateVar;
        void privateFunc();
    
    protected:
        int protectedVar;
        void protectedFunc();
    };
    
    // 公有继承
    class DerivedClass : public BaseClass {
        // DerivedClass 可以访问 BaseClass 的公有成员和保护成员
    };
    
    // 私有继承
    class DerivedClass : private BaseClass {
        // DerivedClass 可以访问 BaseClass 的公有成员和保护成员,但都变为私有成员
    };
    
    // 保护继承
    class DerivedClass : protected BaseClass {
        // DerivedClass 可以访问 BaseClass 的公有成员和保护成员,但都变为保护成员
    };
    

    通过继承,派生类可以获得基类的属性和行为,并且可以在派生类中添加新的成员或修改继承的成员。

二、C++const引用

在C++中,const引用是指对常量进行引用的一种方式。通过使用const修饰符来声明引用,可以确保被引用对象在引用期间不会被修改。

const引用有以下几个特点

对常量引用:const引用主要用于传递常量参数给函数,防止函数内部对参数进行修改。例如:

void printValue(const int& value) {
    // value是一个const引用,不能在函数内部修改它
    cout << "Value: " << value << endl;
}

临时对象引用

const引用还可以绑定到临时对象(即右值)上。这种用法可以避免在使用临时对象时进行不必要的拷贝构造。例如:

const int& result = getSum(3, 4);

常量引用成员变量

在类中,可以使用const引用作为成员变量的类型,以确保该成员变量在对象的整个生命周期内都不能被修改。例如:

class MyClass {
private:
    const int& constantRef;
public:
    MyClass(const int& value) : constantRef(value) {}
};

需要注意的是,const引用只能绑定到具有相同或更长生命周期的对象上,而不能绑定到临时对象的非const引用或非const指针上。

 二、c++引用空间相关问题

在 C++ 中,引用不开辟空间。引用不是一个对象,它只是已存在的变量或对象的别名。引用本身不占用内存,它只是一个已存在对象的别名或昵称。引用变量在内存中只是原变量的另一个名称,所以对引用变量的任何操作都会影响到原变量。

因为引用只是一个别名,所以我们在创建引用时必须将其初始化成一个已经存在的对象,否则会导致编译错误。同时,在使用引用时也要注意,如果被引用的对象被销毁或释放了,那么该引用就会成为悬空引用(dangling reference),访问它会引发未定义行为的错误。因此,我们应该始终确保引用指向的对象在引用生命周期内都是有效的。

需要注意的是,引用和指针虽然有相似之处,但二者之间存在一些重要的区别。指针是一个实际的对象,它存储了一个地址值,指向一个具体的内存位置,而引用只是一个别名,没有实际的对象来支持它。因此,我们可以对指针进行运算、赋值等操作,而对于引用则不能进行这些操作。

总之,在 C++ 中,引用不开辟空间,它只是一个已存在对象的别名或昵称,对引用进行的任何操作都会直接影响到原变量。

 

当我们创建一个引用时,它必须初始化为一个已经存在的对象或变量。下面是一些关于引用的示例:

int main() {
    int num = 10;
  
    // 创建一个整型引用,并将其初始化为num
    int& ref = num;
    
    // 修改引用的值会直接修改原变量的值
    ref = 20;
    std::cout << "num: " << num << std::endl;  // 输出:num: 20
  
    // 创建一个常量引用,它不能修改被引用的对象的值
    const int& constRef = num;
    // constRef = 30;  // 错误,不能修改常量引用
    
    // 引用作为函数参数,可以方便地传递和修改变量的值
    void increment(int& value) {
        value++;
    }
  
    int value = 5;
    increment(value);
    std::cout << "value after increment: " << value << std::endl;  // 输出:value after increment: 6
  
    return 0;
}

在上面的示例中,我们创建了一个整型变量 num 和一个与之关联的引用 ref。通过修改 ref 的值,我们实际上修改了 num 的值。

另外,我们还创建了一个常量引用 constRef,它不能修改被引用的对象的值。

最后,我们定义了一个函数 increment,它以引用作为参数。这使得我们可以直接修改传递给函数的变量的值,而无需使用指针或返回值。

这些示例展示了引用在C++中的使用方式,它们提供了一种方便而灵活的方式来操作和传递变量。

 

三.auto

在 C++11 标准中,引入了 auto 关键字,用于自动推导变量的类型。auto 关键字可以使代码更简洁、可读性更高,并且可以轻松地处理复杂的类型声明。

auto 关键字的使用方法如下:

auto 变量名 = 表达式;

在这里,变量名是我们要定义的变量的名称,表达式是一个用于初始化变量的表达式。auto 关键字会根据表达式的类型来推断变量的类型,从而省略了我们手动指定类型的步骤。

例如,我们可以使用 auto 来推导一个整数类型的变量:

auto i = 42;  // 推导为 int 类型

我们还可以使用 auto 来推导一个 std::vector<int> 类型的变量:

std::vector<int> v = {1, 2, 3};
auto vec = v;  // 推导为 std::vector<int> 类型

auto 关键字的好处在于,我们不必手动指定变量类型,这样可以简化代码并提高可读性。此外,auto 还可以处理一些比较复杂的类型声明,例如函数指针和 lambda 表达式等。这些类型声明通常会很冗长,使用 auto 可以避免这种情况。

需要注意的是,auto 关键字不能用于函数参数、类成员变量、非静态局部变量等场景。此外,在使用 auto 推导变量类型时,要注意表达式的类型,以避免类型推导错误。

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

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

相关文章

C#中string.ToUpper()和string.ToLower()的用法

目录 一、关于ToUpper()和ToLower() 1.ToUpper() 2.ToLower() 3.小结 二、实例 三、生成效果 一、关于ToUpper()和ToLower() 1.ToUpper() 使用字符串对象的ToUpper方法可以将字符串中的字母全部转换为大写。 string P_str_book "mingribook".ToUpper()…

简单Diff算法

简单Diff算法 渲染器的核心 Diff算法 解决的问题 比较新旧虚拟节点的子节点&#xff0c;实现最小化更新。 虚拟节点key属性的作用 就像虚拟节点的“身份证号”&#xff0c;在更新时&#xff0c;渲染器会通过key属性找到可复用的节点&#xff0c;然后尽可能地通过DOM移动操…

Spring Boot Admin健康检查引起的Spring Boot服务假死

问题现象 最近在spring boot项目中引入了 spring-boot-starter-actuator 后&#xff0c;测试环境开始出现服务假死的现象&#xff0c; 且这个问题十分怪异&#xff0c;只在多个微服务中的简称A的这个服务中出现&#xff0c;其他服务都没有出现这个问题&#xff0c; 之所以说…

Proxmox Backup Server(PBS)从2.X升级到PBS3

作者&#xff1a;田逸&#xff08;formyz&#xff09; 2023年11月31日&#xff0c;Proxmox 官方正式发布Proxmox Backup Server 3.1版本。现在我负责管理的Proxmox Backup Server&#xff08;以下简称PBS&#xff09;版本号为2.3&#xff0c;打算将部分PBS升级到PBS 3.1&#x…

微信小程序自定义步骤条效果

微信小程序自定义一个步骤条组件&#xff0c;自定义文字在下面&#xff0c;已完成和未完成和当前进度都不一样的样式&#xff0c;可点击上一步和下一步切换流程状态&#xff0c;效果如下。 这是视频效果&#xff1a; 前端实现步骤条效果 下面我们一步步实现编码&#xff0c;自定…

【拆盲盒02】算法题

题目 : 假设顺序表L中的元素按从小到大的次序排列&#xff0c;编写算法删除顺序表中“多余”的数据元素&#xff0c;即操作之后的顺序表中所有元素的值都不相同&#xff0c;要求时间尽可能的少&#xff1b;并对顺序表A&#xff08;1&#xff0c;1&#xff0c;2&#xff0c;2&am…

【js】js解析Token:

一、效果&#xff1a; 二、实现&#xff1a; export function getTokenObject(token) {//通过split()方法将token转为字符串数组,数组中的第二个字符进行解析return token ? JSON.parse(decodeURIComponent(escape(window.atob(token.split(".")[1].replace(/-/g &…

在 Spring 中操作 Redis

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿 目录 1、引入依赖 2、对 Redis 的配置文件进行书写 3、S…

2022年中职组“网络安全”赛项湖南省B-3——私钥泄漏

B-3&#xff1a;应用服务漏洞扫描与利用 任务环境说明&#xff1a;需要环境有问题可以加q 服务器场景&#xff1a;Server15服务器场景操作系统&#xff1a;未知&#xff08;关闭链接&#xff09; 使用命令nmap探测目标靶机的服务版本信息&#xff0c;将需要使用的参数作为FLA…

UIToolKit使用心得

起因 因为那个uitoolkit自己写了一套graphView&#xff0c;所以想着来用用但是用完之后发现也不过如此 怎么构建自己的组件 我在继承Node之后想修改node的样式该怎么办呢是这样的。先用pick点击默认的node节点元素- 在pick默认创建的node节点之后&#xff0c;可以把它的uxml…

【产品设计】信息建设三驾马车:PLM系统拆解

本篇文章将介绍PLM的基础信息、发展及模块功能等内容&#xff0c;让大家对PLM有一个全面、完整地了解&#xff0c;方便在后期的工作中能快速地使用其解决方案&#xff0c;希望本篇文章能对你有所帮助。 PLM系统主要实现产品模块业务&#xff0c;既包含产品的创意设计、样品打样…

阶段十-分布式-docker虚拟化容器

第一章 Docker简介 1.2 节 Docker理念 Docker是基于Go语言实现的云开源项目&#xff1b;通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应用等等&#xff09;及其运行环境能够做到“一次封装&#xf…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(18)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;17&#xff09; 1.4 PCI总线的中断机制 1.4.2 中断信号与PCI总线的连接关系 在PCI总线中&#xff0c;INTx信号属于边带信号。所谓边带信号是指这些信号在PCI总线环境…

错题总结五

一. 操作访问字节个数问题 这道题考察的是指针有关的知识&#xff0c;而这种指针的知识我们提到过 指针相关知识(入门)-CSDN博客 指针相关知识(进阶)-CSDN博客 在这里&#xff0c;我们复习一下。在指针里&#xff0c;int有4个字节&#xff0c;short有2个字节&#xff0c;换句…

jsp作用域

jsp四大域对象 page 只在当前页面有效&#xff0c;跳转后无效 request 服务器跳转有效&#xff0c;客户端发生跳转无效&#xff0c;&#xff08;因为客户端跳转&#xff0c;相当于发生两次跳转&#xff09; session 保存在浏览器会话中&#xff0c;服务器或客户端跳转均有…

Spring系列:Spring如何解决循环依赖

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

【ChatGPT 默认强化学习策略】PPO 近端策略优化算法

PPO 近端策略优化算法 PPO 概率比率裁剪 演员-评论家算法演员-评论家算法&#xff1a;多智能体强化学习核心框架概率比率裁剪&#xff1a;逐步进行变化的方法PPO 目标函数的设计重要性采样KL散度 PPO 概率比率裁剪 演员-评论家算法 论文链接&#xff1a;https://arxiv.org…

万字长文谈自动驾驶occupancy感知

文章目录 prologuepaper listVision-based occupancy :1. [MonoScene: Monocular 3D Semantic Scene Completion [CVPR 2022]](https://arxiv.org/pdf/2112.00726.pdf)2. [Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction [CVPR 2023]](https://arxiv…

Android--Jetpack--Paging详解

不尝世间醋与墨&#xff0c;怎知人间酸与苦。 择一业谋食养命&#xff0c;等一运扭转乾坤。 你见过哪些令你膛目结舌的代码技巧&#xff1f; 文章目录 不尝世间醋与墨&#xff0c;怎知人间酸与苦。择一业谋食养命&#xff0c;等一运扭转乾坤。你见过哪些令你膛目结舌的代码技…

03.QT命名规范及快捷键(部分)

一、命名规范 1.类名 大驼峰规则&#xff1a;首字母大写&#xff0c;单词和单词之间首字母大写。 2.变量名 小驼峰规则&#xff1a;首字母小写&#xff0c;单词和单词之间首字母大写。 二、快捷键 1.代码操作相关 注释&#xff1a;ctrl / 运行&#xff1a;ctrl r 编译…