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

 

目录

一、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;// 创建一个整型引用,并将其初始化为numint& 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: 6return 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.mzph.cn/news/591181.shtml

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

相关文章

YOLOv8训练自己的数据集(超详细)

一、准备深度学习环境 本人的笔记本电脑系统是&#xff1a;Windows10 YOLO系列最新版本的YOLOv8已经发布了&#xff0c;详细介绍可以参考我前面写的博客&#xff0c;目前ultralytics已经发布了部分代码以及说明&#xff0c;可以在github上下载YOLOv8代码&#xff0c;代码文件夹…

LVM和磁盘配额

一&#xff1a;LVM概述&#xff1a; LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 能够在保持现有数据不变的情况下&#xff0c;动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件&#xff0c;不能基于LVM创建…

MongoDB vs MySQL:项目选择哪一个数据库系统?

由于市场上有各种可用的数据库&#xff0c;用户经常会就MongoDB与MySQL进行辩论&#xff0c;以找出更好的选择。 使用MySQL等关系数据库的组织在根据不断变化的需求管理和存储数据时可能会面临一定的困难。同时&#xff0c;新公司想知道选择什么数据库&#xff0c;这样他们就不…

【ArcGIS微课1000例】0085:甘肃省白银市平川区4.9级地震震中位置图件制作

据中国地震台网正式测定,12月31日22时27分在甘肃白银市平川区发生4.9级地震,震源深度10公里,震中位于北纬36.74度,东经105.00度。 文章目录 一、白银市行政区划图1. 县级行政区2. 乡镇行政区二、4.9级地震图件制作1. 震中位置2. 影像图3. 震中三维地形一、白银市行政区划图…

【LLM 】7个基本的NLP模型,为ML应用程序赋能

在上一篇文章中&#xff0c;我们已经解释了什么是NLP及其在现实世界中的应用。在这篇文章中&#xff0c;我们将继续介绍NLP应用程序中使用的一些主要深度学习模型。 BERT 来自变压器的双向编码器表示&#xff08;BERT&#xff09;由Jacob Devlin在2018年的论文《BERT:用于语言…

数据结构初阶之栈和队列(C语言版)

数据结构初阶之栈和队列&#xff08;C语言版&#xff09; ✍栈♈栈的结构设计♈栈的各个接口的实现&#x1f47a;StackInit(初始化)&#x1f47a;push&#xff08;入栈&#xff09;&#x1f47a;pop&#xff08;出栈&#xff09;&#x1f47a;获取栈顶元素&#x1f47a;获取栈中…

软件工程期末总结

软件工程期末总结 软件危机出现的原因软件生命周期软件生命周期的概念生命周期的各个阶段 软件开发模型极限编程 可行性研究与项目开发计划需求分析结构化分析的方法结构化分析的图形工具软件设计的原则用户界面设计结构化软件设计面向对象面向对象建模 软件危机出现的原因 忽视…

7.13N皇后(LC51-H)

算法&#xff1a; N皇后是回溯的经典题 画树&#xff1a; 假设N3 皇后们的约束条件&#xff1a; 不能同行不能同列不能同斜线 回溯三部曲&#xff1a; 1.确定函数参数和返回值 返回值&#xff1a;void 参数&#xff1a; int n&#xff1a;题目给出&#xff0c;N皇后的…

骨传导蓝牙耳机什么牌子好用?为你揭晓不踩雷的骨传导耳机排行

喜欢运动的朋友们&#xff0c;你们一定不能错过骨传导耳机&#xff01;它真的是我们运动时的好帮手。为什么这么说呢&#xff1f;因为它不会像普通耳机那样塞住我们的耳朵&#xff0c;让我们在运动时感觉不舒服&#xff0c;甚至伤害耳朵。而且&#xff0c;它还可以帮助我们听到…

如何选择适用于光束分析应用的工业相机?

为光束质量分析系统选择合适的相机时&#xff0c;需要考虑许多关键特性。例如&#xff1a; ◈ 合适的波长范围&#xff1a;支持准确拍摄和测量所需波长的光束。 ◈ 高空间分辨率&#xff1a;更好地分析光束特征&#xff0c;如光束宽度、形状和强度分布。 ◈ 合适的传感器尺寸…

ClickHouse基础知识(七):ClickHouse的分片集群

副本虽然能够提高数据的可用性&#xff0c;降低丢失风险&#xff0c;但是每台服务器实际上必须容纳全量数据&#xff0c;对数据的横向扩容没有解决。 要解决数据水平切分的问题&#xff0c;需要引入分片的概念。通过分片把一份完整的数据进行切 分&#xff0c;不同的分片分布到…

Sectigo和Certum的区别

为了保护用户在互联网的隐私&#xff0c;网站使用SSL数字证书为http明文传输协议加上安全套接层&#xff0c;对网站传输数据加密。Sectigo和Certum是正规的CA认证机构&#xff0c;它们颁发的SSL证书经过市场认证&#xff0c;已经兼容大多数浏览器以及终端&#xff0c;今天就随S…

令人吃惊的SLM34x系列SLM340CK-DG 通过国际安全标准兼容光耦的单通道隔离驱动器

40V, 1A兼容光耦的单通道隔离驱动器SLM34x系列SLM340CK-DG产品已通过UL1577认证&#xff0c;通过UL1577安规标准的认可&#xff0c;意味着产品已符合相关的国际安全标准&#xff0c;在产品质量及可靠性上。 关于UL1577科普&#xff1a; UL1577规范适用于光隔离器、磁隔离器以…

同城拼车约车顺风车/同城顺风车小程序/顺风车小程序/拼车小程序

同城拼车约车顺风车/同城顺风车小程序/顺风车小程序/拼车小程序 演示小程序搜索:上车信息 可以打开封装APP 套餐一:源码+包安装+包过审(无需许可证)=300 套餐二:全包服务 包服务器+域名+APP+免费认证小程序+H5+PC=800 包审核 PC端联系客服看 PC端+H5+公众号+小程序…

深度生成模型之自编码器与变分自编码器 ->(个人学习记录笔记)

文章目录 深度生成模型之自编码器与变分自编码器自编码器AE1. 定义2. 自编码器的应用 变分自编码器(VAE)1. 理论求解2. 模型求解3. 优化目标4. 再参数化策略 AE与VAE的对比AE与VAE的主要局限性 深度生成模型之自编码器与变分自编码器 自编码器AE 1. 定义 Auto-Encoder&#…

线性代数_对角矩阵

对角矩阵是线性代数中一种特殊的矩阵类型&#xff0c;它在数学理论和实际应用中都有着重要的地位。对角矩阵的定义如下&#xff1a; 设 \( A \) 是一个 \( n \times n \) 的方阵&#xff0c;如果满足除主对角线上的元素外&#xff0c;其他元素都为零&#xff0c;即 \( A_{ij} …

C语言---扫雷(Minesweeper)

扫雷 1 了解扫雷游戏1.1 基本规则1.2 基础知识1.2.1字符相减 2 实现过程1.1 棋盘设定1.2 初始化棋盘1.3 打印棋盘1.4 放置雷1.5 排查雷1.6 game()函数 3 完整代码3.1 Minesweeper.h3.2 Minesweeper.c3.3 Test.c 4 参考 1 了解扫雷游戏 点击右侧进入扫雷游戏网页版 1.1 基本规…

探秘AI数字人克隆系统OEM源码:实现24小时无人值守直播间的奥秘

随着人工智能技术的不断发展&#xff0c;AI数字人克隆系统OEM源码正在引起广泛的关注。其中&#xff0c;实现24小时无人值守直播间成为了许多企业和机构的追求。本文将深入探讨如何利用AI数字人克隆系统OEM源码实现24小时无人值守直播间&#xff0c;并揭示其背后的奥秘。 一、…

【Linux操作系统】探秘Linux奥秘:Linux开发工具的解密与实战

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS &…

Nginx解决跨域问题过程

学习Nginx解决跨域问题 结果 server {listen 22222;server_name localhost;location / {if ($request_method OPTIONS) {add_header Access-Control-Allow-Origin http://localhost:8080;add_header Access-Control-Allow-Headers *;add_header Access-Control-Allo…