C++虚函数基础

2023-11-15

c++静态成员变量和静态成员函数

  1. 类的静态成员有两种:静态成员变量和静态成员函数。静态成员变量本质上是全局变量,静态成员函数本质也是全局函数,

  2. 静态成员变量和静态成员函数都可以使用类名去调用。

    非静态成员的访问方式(对象名.成员名),需要指明被访问的成员变量是属于哪个对象的,或者是调用的成员函数作用于哪个对象的。静态成员的访问方式(类名::成员),不需要指明被访问的成员是属于哪个对象的或是作用于哪个对象的。

    两者的相同点:两者在定义的前面都有static关键字。

静态成员函数总结:

  • 静态成员函数**只能**直接访问静态成员变量(函数),不能直接访问普通成员函数。
  • 静态成员函数是类中的特殊成员函数,
  • 静态成员函数**没有隐藏的this指针**:当调用一个对象的非静态成员函数时,系统会将该对象的起始地址赋给成员函数的this指针,静态函数不属于某一个对象所有,是该类的所有对象共享,所以静态成员函数没有隐藏的this指针。

静态成员变量总结:

  • 特性:使用static修饰,在类外部初始化,使其分配空间。举个例子:
    在这里插入图片描述

  • 如果static成员变量使用const修饰,则可以直接在类内部初始化赋值。举个例子:
    在这里插入图片描述
    扩展:使用const加以限制的变量,不允许再次修改。

C++之const类成员函数,成员变量。又称常成员函数和常成员变量。

  • 什么时候使用const常成员变量呢?在类中,如果你希望某些数据不被改变,就可以加关键字const来加以限定。const可以修饰成员变量和成员函数。

  • const成员函数(常成员函数):const成员函数可以使用类的所有成员变量,但是不能修改它们的值,仅仅只能获取值,这种措施主要是为了保护数据而设定的。

  • 需要强调的是**const函数声明和定义需要同时在函数头部结尾处加上const关键字**。举个例子:

class Student{
public:
    Student(char *name, int age, float score);
    void show();
    //声明常成员函数
    char *getname() const;
    int getage() const;
    float getscore() const;
private:
    char *m_name;
    int m_age;
    float m_score;
};

Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
void Student::show(){
    cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
//定义常成员函数
char * Student::getname() const{
    return m_name;
}
int Student::getage() const{
    return m_age;
}
float Student::getscore() const{
    return m_score;
}

其中的getname()、getage()、getscore()三个函数的功能都很简单,仅仅只是获取成员变量的值,所以我们加了const限制。
最后来区分一下const的位置问题:

  • 函数开头的 const 用来修饰函数的返回值,表示返回值是 const 类型,也就是不能被修改,例如const char * getname()
  • 函数头部的结尾加上 const 表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值,例如char * getname() const

    一、C++虚函数基础

纯虚函数:

含有纯虚函数的类叫抽象类,抽象类是绝对不能是生成对象的

但是。重点来了,,,

可以定义指向抽象类的指针或引用,此指针可以指向他的派生类,进而实现多态。

继承抽象类的派生类必须全部实现抽象类中的纯虚方法(可以不实现其他成员函数但是纯虚函数一定要派生类实现),否则,派生类也变成了抽象类。

纯虚函数也可以有函数体但必须是在类的外部,例如:
在这里插入图片描述

有函数体的纯虚函数仍然不能生成对象,但可以为派生类提供一个默认实现。

什么时候需要选用纯虚函数呢?

  • 基类不需要实例化
  • 子类基本都需要override重写父类的虚函数时
  • 抽象类的析构函数必须是纯虚函数(在这里有个比较会被继承类的析构函数一定是虚析构,否则 会造成内存泄漏。因为在析构时先析构派生类再析构被继承的类)

二、C++中的多态

c++支持两种多态性

讲讲多态:c++支持两种多态性,编译时多态性(也叫静态多态),运行时多态性(也加动态多态)。编译时多态性:通过重载函数和运算符重载实现。运行时多态性:通过虚函数和继承实现。

C++实现多态的方式:

c++中实现多态的方式共有三种:1.函数重载(函数重载有参数重载、运算符重载),2.模板函数 3.虚函数

下面是虚函数与多态之间的猫腻:hhhhh 想深入了解的童鞋,戳戳下面的链接:[(https://blog.csdn.net/weixin_43072157/article/details/82223492)链接地址
下面是学习c++教程的连接:c++学习链接

三、C++中的引用&指针

  • 先介绍一下引用C++引用:引用实质可以看做是数据的一个别名。
    引用的定义方式类似于指针,使用&取代了*,语法格式 type &name=data;引用在定义同时必须初始化。

  • 指针&引用两者的区别:指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来

    的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

    int a=1;int *p=&a;

    int a=1;int &b=a;

    上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

    而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单

    元。

    (2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。

    (3)可以有const指针,但是没有const引用;

    (4)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

    (5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

    (6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

    (7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;

    (8)指针和引用的自增(++)运算意义不一样;

    (9)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏
    《本文中如果有纰漏、错误,欢迎各位仁兄在下方留言,希望我们一起学习,一起进步。》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++虚函数基础 的相关文章

  • 如何写好一份软件开发设计文档

    设计文档 也被称作技术规范和实现手册 描述了你如何去解决一个问题 是确保正确完成工作最有用的工具 其目的是迫使你对设计展开缜密的思考 并收集他人的反馈 进而完善你的想法 同时在软件交付和交接的过程中 能让其他人更通俗易懂的了解之前的设计目的

随机推荐

  • 【Python小技巧】.py .pyd .pyw 都是干什么用文件?想分发时加密py脚本文件?

    文章目录 前言 一 什么是 py 文件 二 什么是 pyd 文件 pyd 文件是用 Python 编程语言编写的 是通过编译 Python 代码生成的 py 和 pyd 文件格式之间的区别 如何创建 pyd 文件 如何使用 pyd文件 三
  • Android USB电源管理

    The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host 1 驱动shutdown顺序 系
  • 黑盒测试方法:边界值分析具体步骤及实例

    边界值分析法也是黑盒测试方法之一 强调测试边界条件 而非等量类划分 其过程是确定输入值的最大值和最小值 然后将测试点置于这些极端值以及它们之间 使用边界值分析法可以揭示程序在处于边界条件时的bug 并能够更有效地完成测试工作 以下是该方法的
  • TypeError: defineConfig is not a function

    场景 当我们在做打包配置的时候 出现如下错误 原因 由于用vue cli直接创建了vue 3的项目 而里面的生态并非都是最新版 vue config js中的代码如下 使用了vue 3的语法 解决 输入 vue upgrade 一路向下 即
  • vue+typescript封装axios,实现取消重复请求

    vue cli3可以直接生成vue typescript项目 然后对axios进行封装 实现拦截多次重复请求 并取消 直接撸代码 也是借鉴网上的 做了修改 在根目录下新建axios tool ts文件 import Vue from vue
  • Matlab_输出成绩等级A、B、C、D、E

    输入一个百分制成绩 要求输出成绩等级A B C D E 其中90 100为A 80 89为B 70 79为C 60 69为D 60以下为E 以下会分别使用if语句和switch语句实现 1 if语句实现如下 c input 请输入成绩 if
  • Timestamp : Unable to compare with value [Binary]kettle插入到Oracle报错

    kettle插入更新到Oracle报错 Timestamp Unable to compare with value Binary Binary can t be converted to a timestamp 如图 原因 一般是前一步如
  • 设计模式(现在只总结了常用的8种)

    一 设计模式的七大原则 1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的 挑战 设计模式是为了让程序 软件 具有更好 代码复用性 相同功能的代码只需要写一次 可读性 代码简
  • 指针到底能不能修改其指向的常量字符串?

    http m blog csdn net article details id 11248789 1 指针到底能不能修改其指向的常量字符串 今天做一个字符串右移函数时 直接使用指针来修改字符串常量的值出现了奇怪运行时错误 代码如下 incl
  • openGauss学习笔记-56 openGauss 高级特性-DCF

    文章目录 openGauss学习笔记 56 openGauss 高级特性 DCF 56 1 架构介绍 56 2 功能介绍 56 3 使用示例 openGauss学习笔记 56 openGauss 高级特性 DCF DCF全称是Distrib
  • snipaste——一款强大的、免费的截图软件

    说到截图软件 大家首相想到的恐怕就是QQ 甚至有人戏称steam在中国是 吃鸡启动器 QQ在很多人眼中就是一款截图软件 诚然 日常使用QQ截个图没什么问题 但是和snipaste比起来确实小巫见大巫 加之很多朋友并不喜欢打开电脑就启动QQ
  • HashMap源码分析

    HashMap源码分析 HashMap是Java集合框架中常用的数据结构之一 它提供了一种用于存储键值对的哈希表实现 在本文中 我们将深入源码 详细分析HashMap的实现原理和关键方法 HashMap的基本结构是一个数组和一组链表 或红黑
  • Spring Boot参考指南——Starter POMs

    13 2 Gradle Gradle用户可以直接在它们的dependencies节点处导入 starter POMs 跟Maven不同的是 这里没有用于导入共享配置的 超父 super parent apply plugin java re
  • unity 毛笔字笔触(画图)

    毛笔字笔触 RawImage using System Collections Generic using UnityEngine using UnityEngine UI using Random UnityEngine Random p
  • redis相关

    如果redis没有设置expire 他是否默认永不过期 清理线上Redis没有设置过期时间的key 青苔小榭的博客 CSDN博客 如何给Redis中未设置过期时间key添加过期时间 知乎 Redis中的几种更新策略 如何实现redis数据的
  • git配置与常用命令

    git配置与常用命令 git是一个开源的分布式版本控制系统 可以有效 高速地处理从很小到非常大的项目版本管理 gitbash是一个适用于Windows环境的应用程序 它为Git命令行体验提供了一个仿真层 相当于在window上通过git b
  • Linux下tar简介

    最常见的压缩与解压命令是tar 1 命令格式 tar 参数选择 压缩后的文件名 需要压缩的文件 文件名 压缩命令 例如 tar cf all tar jpg tar 参数选择 需要解压的文件名 解压命令 例如 tar xf all tar
  • mysql 单表字段多少合适_公司DBA关于MySQL开发的一点经验

    尽量不要让数据库做过多运算 数据库主要是用来存储的 我们应避免让数据库做运算 比如写定时任务 存储过程等 复杂的计算应该在程序代码中实现 我们应该尽量简单的使用数据库 控制数据量 一年内单表数据量一般含char不超过500W条 我们需要合理
  • R语言特征提取与特征选择

    数据决定了机器学习的上限 而算法只是尽可能逼近这个上限 这里的数据指的就是经过特征工程得到的数据 特征工程指的是把原始数据转变为模型的训练数据的过程 它的目的就是获取更好的训练数据特征 使得机器学习模型逼近这个上限 特征工程能使得模型的性能
  • C++虚函数基础

    c 静态成员变量和静态成员函数 类的静态成员有两种 静态成员变量和静态成员函数 静态成员变量本质上是全局变量 静态成员函数本质也是全局函数 静态成员变量和静态成员函数都可以使用类名去调用 非静态成员的访问方式 对象名 成员名 需要指明被访问