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

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

    关注

    123

    文章

    7238

    浏览量

    141025
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72878

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

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

收藏 人收藏

    评论

    相关推荐

    vlookup绝对引用和相对引用的区别

    绝对引用和相对引用是在Excel中使用VLOOKUP函数时的两种引用方式,它们的主要区别在于在填充公式时,引用的单元格地址是否会发生改变。 相对引用
    的头像 发表于 12-01 10:27 1163次阅读

    vlookup函数什么时候用绝对引用

    单元格时,引用的单元格位置不会改变。在使用VLOOKUP函数时,有几种情况下我们需要使用绝对引用。本文将详细介绍VLOOKUP函数以及绝对引用的使用情况。 首先,我们先来了解一下VLOOKUP函数的
    的头像 发表于 12-01 10:25 2799次阅读

    C++程序设计精简版

    章 指针第 7 章 自定义数据类型 第 3 篇 基于对象的程序设计第 8 章 类和对象第 9 章 关于类和对象的进一步讨论第 10 章 运算符重载 第 4 篇 面向对象的程序设计第 11 章 继承与派生第 12 章 多态性与虚函数第 13 章 输入输出流第 14 章 C++
    发表于 10-09 07:26

    嵌入式C/C++语言精华文章集锦

    /C++编程,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 经验不足的开发人员往往将所有需要传送的内容依顺序保存在 char 型数组,通过
    发表于 09-25 08:00

    C++多态详解

    在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
    发表于 09-20 17:18 322次阅读

    C++演示的推理速度比Python演示的推理速度更快是为什么?

    在同一主机机上采用相同型号的 Ran Object Detection C++ 演示 和 对象检测 Python 演示 。 C++ 演示的推理速度比 Python 演示的推理速度
    发表于 08-15 06:52

    【开源三方库】Aki:一行代码极简体验JS&C++跨语言交互

    :同步异步接口封装 示例一期望将C++业务逻辑(GetName)注册为JS同步接口(getSync)、异步接口(getAsync),Aki提供了极简的JSBind函数绑定语法糖,一行代码绑定跨语言调用接口
    发表于 08-07 17:04

    如何为Arm编译Cc++代码

    Studio或Keil MDK IDE环境。 Linux编译常见的编程语言在Arm上得到了很好的支持,大多数开源工具都可以在Linux发行版提供的包中使用。用于C++C和Fortran的商业编译器可从
    发表于 08-02 17:28

    C++ std::tie函数的作用和用法

    C++中std::tie函数的作用就是从元素引用中生成一个tuple元组,其在头文件中定义
    的头像 发表于 07-18 17:28 554次阅读

    一起探索C++的世界!

    C++
    YS YYDS
    发布于 :2023年07月07日 19:10:25

    嵌入式-C++函数的重载

    的函数名定义,从而形成重载,方便使用,某种层度上函数的重载也是C++三大特性之一的多态的一种形式 三、函数重载的应用场景 #include //利用using指令打开std空间 //这样命名空间std内定
    发表于 06-28 13:54

    如何为xtensa编译C++

    我想为 xtensa 编译简单的 C++ 代码,但我不能。 代码:全选#include \"ets_sys.h\" #include \"osapi.h\"
    发表于 06-09 07:02

    多态性实现原理及其在面向对象编程中的应用

    在面向对象的编程中,多态性是一个非常重要的概念。
    的头像 发表于 06-08 14:19 402次阅读

    HarmonyOS/OpenHarmony应用开发-ArkTS语言基本语法说明

    封装和复用UI描述。 @Extend/@Style:扩展内置组件和封装属性样式,更灵活地组合内置组件。 stateStyles:多态样式,可以依据组件的内部状态的不同,设置不同样式。*附件:HarmonyOSOpenHarmo
    发表于 06-01 10:25

    利用C++提供的队列封装一个消息队列

    最近的C++项目中,需要用到消息队列,但是C++中又没有原生的消息队列,就在网上找了一下相关资料,利用C++提供的队列,自己封装一个消息队列,以后的项目也可以复用。
    的头像 发表于 05-20 15:16 1071次阅读
    利用<b class='flag-5'>C++</b>提供的队列<b class='flag-5'>封装</b>一个消息队列