0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++基础语法中的引用、封装和多态

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程 2021-09-12 09:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本期是C++基础语法分享的第六节,今天给大家来分享一下:

(1)引用;

(2)宏;

(3)成员初始化列表;

(4)封装;

(5)继承;

(6)多态;

引用

左值引用

常规引用,一般表示对象的身份。

右值引用

右值引用就是必须绑定到右值(一个临时对象、将要销毁的对象)的引用,一般表示对象的值。

右值引用可实现转移语义(Move Sementics)和精确传递(Perfect Forwarding),它的主要目的有两个方面:

消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。

能够更简洁明确地定义泛型函数。

引用折叠

X& &、X& &&、X&& & 可折叠成 X&

X&& && 可折叠成 X&&

宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对 “参数” 进行的是一对一的替换。

成员初始化列表

好处

更高效:少了一次调用默认构造函数的过程。

有些场合必须要用初始化列表:

常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面

引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面

没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化

initializer_list 列表初始化

用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list 参数。

initializer_list 使用

#include 《iostream》#include 《vector》#include 《initializer_list》 template 《class T》struct S { std::vector《T》 v; S(std::initializer_list《T》 l) : v(l) { std::cout 《《 “constructed with a ” 《《 l.size() 《《 “-element list

”; } void append(std::initializer_list《T》 l) { v.insert(v.end(), l.begin(), l.end()); } std::pair《const T*, std::size_t》 c_arr() const { return {&v[0], v.size()}; // 在 return 语句中复制列表初始化 // 这不使用 std::initializer_list }}; template 《typename T》void templated_fn(T) {} int main(){ S《int》 s = {1, 2, 3, 4, 5}; // 复制初始化 s.append({6, 7, 8}); // 函数调用中的列表初始化 std::cout 《《 “The vector size is now ” 《《 s.c_arr().second 《《 “ ints:

”; for (auto n : s.v) std::cout 《《 n 《《 ‘ ’; std::cout 《《 ‘

’; std::cout 《《 “Range-for over brace-init-list:

”; for (int x : {-1, -2, -3}) // auto 的规则令此带范围 for 工作 std::cout 《《 x 《《 ‘ ’; std::cout 《《 ‘

’; auto al = {10, 11, 12}; // auto 的特殊规则 std::cout 《《 “The list bound to auto has size() = ” 《《 al.size() 《《 ‘

’; // templated_fn({1, 2, 3}); // 编译错误!“ {1, 2, 3} ”不是表达式, // 它无类型,故 T 无法推导 templated_fn《std::initializer_list《int》》({1, 2, 3}); // OK templated_fn《std::vector《int》》({1, 2, 3}); // 也 OK}

面向对象

面向对象程序设计(Object-oriented programming,OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。

面向对象三大特征 —— 封装、继承、多态

封装

把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。关键字:public, protected, private。不写默认为 private。

public 成员:可以被任意实体访问

protected 成员:只允许被子类及本类的成员函数访问

private 成员:只允许被本类的成员函数、友元类或友元函数访问

继承

基类(父类)——》 派生类(子类)

多态

多态,即多种状态(形态)。简单来说,我们可以将多态定义为消息以多种形式显示的能力。

多态是以封装和继承为基础的。

C++ 多态分类及实现:

重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载

子类型多态(Subtype Polymorphism,运行期):虚函数

参数多态性(Parametric Polymorphism,编译期):类模板、函数模板

强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换

静态多态(编译期/早绑定)

函数重载

class A{public: void do(int a); void do(int a, int b);};

动态多态(运行期期/晚绑定)

虚函数:用 virtual 修饰成员函数,使其成为虚函数

动态绑定:当使用基类的引用或指针调用一个虚函数时将发生动态绑定

注意:

可以将派生类的对象赋值给基类的指针或引用,反之不可

普通函数(非类成员函数)不能是虚函数

静态函数(static)不能是虚函数

构造函数不能是虚函数(因为在调用构造函数时,虚表指针并没有在对象的内存空间中,必须要构造函数调用完成后才会形成虚表指针)

内联函数不能是表现多态性时的虚函数

动态多态使用

class Shape // 形状类{public: virtual double calcArea(){ 。.. } virtual ~Shape();};class Circle : public Shape // 圆形类{public: virtual double calcArea(); 。..};class Rect : public Shape // 矩形类{public: virtual double calcArea(); 。..};int main(){ Shape * shape1 = new Circle(4.0); Shape * shape2 = new Rect(5.0, 6.0); shape1-》calcArea(); // 调用圆形类里面的方法 shape2-》calcArea(); // 调用矩形类里面的方法 delete shape1; shape1 = nullptr; delete shape2; shape2 = nullptr; return 0;}

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装
    +关注

    关注

    128

    文章

    9139

    浏览量

    147887
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76706

原文标题:C++基础语法梳理:引用、封装、继承和多态

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C/C++条件编译

    条件编译是一种在编译时根据条件选择性地包含或排除部分代码的处理方法。在 C/C++ ,条件编译使用预处理指令 #ifdef、#endif、#else 和 #elif 来实现。常用的条件编译指令有
    发表于 12-05 06:21

    C++程序异常的处理机制

    1、什么是异常处理? 有经验的朋友应该知道,在正常的CC++编程过程难免会碰到程序不按照原本设计运行的情况。 最常见的有除法分母为零,数组越界,内存分配失效、打开相应文件失败等等。 一个程序
    发表于 12-02 07:12

    C/C++代码静态测试工具Perforce QAC 2025.3的新特性

     Perforce Validate  QAC 项目的相对/根路径的支持。C++ 分析也得到了增强,增加了用于检测 C++ 并发问题的新检查,并改进了实体名称和实
    的头像 发表于 10-13 18:11 344次阅读
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代码静态测试工具Perforce QAC 2025.3的新特性

    技能+1!如何在树莓派上使用C++控制GPIO?

    和PiGPIO等库,C++可用于编程控制树莓派的GPIO引脚。它提供了更好的性能和控制能力,非常适合对速度和精度要求较高的硬件项目。在树莓派社区,关于“Python
    的头像 发表于 08-06 15:33 3573次阅读
    技能+1!如何在树莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    请问如何在C++中使用NPU上的模型缓存?

    无法确定如何在 C++ 的 NPU 上使用模型缓存
    发表于 06-24 07:25

    在OpenVINO™ C++代码启用 AddressSanitizer 时的内存泄漏怎么解决?

    在 OpenVINO™ C++代码启用 AddressSanitizer 时遇到内存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    发表于 06-23 07:16

    主流的 MCU 开发语言为什么是 C 而不是 C++

    在单片机的地界儿里,C语言稳坐中军帐,C++想分杯羹?难喽。咱电子工程师天天跟那针尖大的内存空间较劲,C++那些花里胡哨的玩意儿,在这儿真玩不转。先说内存这道坎儿。您当stm32f4的256kRAM
    的头像 发表于 05-21 10:33 777次阅读
    主流的 MCU 开发语言为什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    C++学到什么程度可以找工作?

    C++学到什么程度可以找工作?要使用C++找到工作,特别是作为软件开发人员或相关职位,通常需要掌握以下几个方面: 1. **语言基础**:你需要对C++的核心概念有扎实的理解,包括但不限于指针、内存
    发表于 03-13 10:19

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码获得的结果与 Python* 代码不同。
    发表于 03-06 06:22

    为什么无法在运行时C++推理读取OpenVINO™模型?

    使用模型优化器 2021.1 版OpenVINO™转换模型 使用 Runtime 2022.3 版本在 C++ 推理实现 ( core.read_model()) 读取模型OpenVINO™并
    发表于 03-05 06:17

    基于OpenHarmony标准系统的C++公共基础类库案例:ThreadPoll

    1、程序简介该程序是基于OpenHarmony标准系统的C++公共基础类库的线程池处理:ThreadPoll。本案例完成如下工作:创建1个线程池,设置该线程池内部有1024个线程空间。启动5个线程
    的头像 发表于 02-10 18:09 597次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础类库案例:ThreadPoll

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序。Spire.XLS for C+
    的头像 发表于 01-14 09:40 1295次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    EE-112:模拟C++的类实现

    电子发烧友网站提供《EE-112:模拟C++的类实现.pdf》资料免费下载
    发表于 01-03 15:15 0次下载
    EE-112:模拟<b class='flag-5'>C++</b><b class='flag-5'>中</b>的类实现

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    )开发框架。它极大地简化了JS与C/C++之间的跨语言访问,为开发者提供了一种边界性编程体验友好的解决方案。通过AKI,开发者可以使用让代码更易读的语法糖,实现JS与C/
    发表于 01-02 17:08

    运动控制卡周期上报实时数据IO状态之C++

    使用C++进行运动控制卡的周期上报功能实现
    的头像 发表于 12-17 13:59 1526次阅读
    运动控制卡周期上报实时数据IO状态之<b class='flag-5'>C++</b>篇