c++ class总结

c++ class的使用总结

  • 1.继承
  • 2.静态成员变量与静态成员函数
  • 3.多态
  • 4.虚函数
  • 5.纯虚函数
  • 6.友元类、友元函数
    • 6.1 友元类
    • 6.2 友元函数

1.继承

ManWoMan 继承于类Person

ManWoMan 的实例对象都可以使用类Person中public属性的成员及成员函数。

#include<iostream>class Person
{
public://friend Man;Person() { m_age = 0; }Person(int age):m_age(age){};void spleep() { std::cout << "Sleeping zzz" << std::endl; }void speak() { std::cout << "Speaking" << std::endl; }void play() { std::cout << "Playing ..." << std::endl; };virtual ~Person() {};
private:int m_age;int get_age() { return m_age; }};class Man: public Person
{
public:Man() {};void play()  { std::cout << "Playing basketball!" << std::endl; }~Man() {};
};class WoMan : public Person
{
public:WoMan() {};void play() { std::cout << "Playing tennis!" << std::endl; }~WoMan() {};
};int main()
{Person p1;p1.play();Man m1;m1.spleep();WoMan wm1;wm1.speak();return 0;
}
//Playing ...
//Sleeping zzz
//Speaking

2.静态成员变量与静态成员函数

静态成员变量不专属于某一个类对象,可以通过类或者类对象进行访问。
静态成员变量处于全局区。

静态成员函数也是相似的,可以通过类或者类对象进行访问。
静态成员函数只能访问静态变量,不能访问非静态变量。
m_salary 非静态变量,则:

static void get_salary() { cout << "static func: " << m_salary << endl; }

会报错。

完整demo如下:

#include<iostream>
using namespace std;
class Person
{
public:static int m_age;int m_salary=10;static void get_age() { cout <<"static func: "<< m_age << endl; }//static void get_salary() { cout << "static func: " << m_salary << endl; }};int Person::m_age = 10;int main()
{Person p;cout << "static var: " << p.m_age << endl;	cout << "static var: " << Person::m_age<< endl;p.get_age() ;Person::get_age();	return 0;
}//static var: 10
//static var: 10
//static func: 10
//static func: 10

3.多态

ManWoMan 继承于类Person,同时这三个类中都有成员函数play。这就是多态。

#include<iostream>class Person
{
public:Person() { }void play() { std::cout << "Playing ..." << std::endl; };~Person() {};
};class Man: public Person
{
public:Man() {};void play()  { std::cout << "Playing basketball!" << std::endl; }~Man() {};
};class WoMan : public Person
{
public:WoMan() {};void play() { std::cout << "Playing tennis!" << std::endl; }~WoMan() {};
};

实例化并打印结果:

int main()
{Person p1;p1.play();Man m1;m1.play();WoMan wm1;wm1.play();return 0;
}//Playing ...
//Playing basketball!
//Playing tennis!

4.虚函数

当基类指针指向派生类对象时,调用时却使用了基类中相应的成员函数。


int main()
{Man m1;Person *p1 = &m1;p1->play();
}
//Playing ...

解决方法是在父类的成员函数前,加上virtual关键字。

另外,子类对应的成员函数定义时,也可加上 override 关键字(可选,推荐)。

#include<iostream>class Person
{
public:Person() { }virtual void play() { std::cout << "Playing ..." << std::endl; };~Person() {};
};class Man: public Person
{
public:Man() {};void play() override  { std::cout << "Playing basketball!" << std::endl; }~Man() {};
};class WoMan : public Person
{
public:WoMan() {};void play()override { std::cout << "Playing tennis!" << std::endl; }~WoMan() {};
};int main()
{Man m1;Person *p1 = &m1;p1->play();
}//Playing basketball!

这样仍然可以调用子类的成员函数。

5.纯虚函数

在父类中对某成员函数不进行实现,而放在子类中具体实现,就要用到纯虚函数。

virtual void play() =0;

它会强制要求子类进行实现。

#include<iostream>class Person
{
public:Person() { }virtual void play() =0;~Person() {};
};class Man: public Person
{
public:Man() {};void play() override  { std::cout << "Playing basketball!" << std::endl; }~Man() {};
};class WoMan : public Person
{
public:WoMan() {};void play()override { std::cout << "Playing tennis!" << std::endl; }~WoMan() {};
};int main()
{Man m1;Person *p1 = &m1;p1->play();
}
//Playing basketball!

6.友元类、友元函数

6.1 友元类

类进行实例化后,通过其对象不能访问类的私有属性和函数。

如这个例子中,Person类的m_age是其私有属性。若Friend类想要访问,则可以将在Person定义中将其添加为友元类。

friend class Friend;	

完整代码如下:

#include<iostream>
class Person;class Friend
{
public:Friend() {};void get_age(Person p);~Friend() {};
};class Person
{
public:friend class Friend;	Person(int age) :m_age(age) {};virtual ~Person() {};
private:int m_age;
};void Friend::get_age(Person p)
{std::cout << p.m_age<<std::endl;
}int main()
{Person p1(10);Friend f1;f1.get_age(p1);return 0;
}
//10

6.2 友元函数

除了将整个类都作为友元类,还可以定义将类的函数作为其他类的友元。
如将 Friendget_age成员函数作为Person类的友元函数。

friend void Friend::get_age(Person p);

完整代码如下:

#include<iostream>
class Person;class Friend
{
public:Friend() {};void get_age(Person p);~Friend() {};
};class Person
{
public:friend void Friend::get_age(Person p);;Person() { m_age = 0; }Person(int age) :m_age(age) {};virtual ~Person() {};
private:int m_age;
};void Friend::get_age(Person p)
{std::cout << p.m_age<<std::endl;
}int main()
{Person p1(10);Friend f1;f1.get_age(p1);return 0;
}
//10

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

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

相关文章

使用GtkSharp下载zip包过慢问题解决方案

背景 安装GtkSharp这个包准备使用C#进行跨平台窗体应用程序开发&#xff0c;运行时发现其需要从github上下载【https://github.com/GtkSharp/Dependencies/raw/master/gtk-3.24.24.zip】这个依赖包&#xff0c;不知道是被墙了还是咋的&#xff0c;下载超时导致运行失败。 解决…

【算法练习】leetcode算法题合集之动态规划篇

普通动规系列 LeetCode343. 整数拆分 LeetCode343. 整数拆分 将10的结果存在索引为10的位置上&#xff0c;需要保证数组长度是n1&#xff0c;索引的最大值是n&#xff0c;索引是从0开始的。 n的拆分&#xff0c;可以拆分为i和n-i&#xff0c;当然i可以继续拆分。而且拆分为n-…

django mysql in 有序返回

from django.db.models import * ordering f"FIELD(id, {,.join([str(_) for _ in ids])})" # 默认就按照算法返回的 id 排序p_data_result PeptidesDataResult.objects.using("polypeptide").filter(id__inids).values().extra(select{ordering: orderi…

Cybellum—信息安全测试工具

产品概述 由于软件和数据在汽车上的使用越来越多&#xff0c;汽车越来越“智能化”&#xff0c;汽车行业面临着重大的信息安全挑战。2021年8月&#xff0c;ISO/SAE 21434正式发布&#xff0c;标准中对汽车的信息安全提出了规范化的要求&#xff0c;汽车信息安全不容忽视。 Cyb…

Redis数据结构与底层实现揭秘

在高并发的系统开发中&#xff0c;缓存和高效的数据存储机制对于提升应用性能至关重要。Redis&#xff0c;作为其中的佼佼者&#xff0c;以其卓越的性能和丰富的数据结构赢得了开发者的青睐。本文将深入探讨Redis的数据结构及其底层实现&#xff0c;带领读者走进这个高性能数据…

CentOS7 安装PostgreSQL以及配置服务

文章目录 前言1. 安装步骤2. 连接PostgreSQL3. 配置服务配置文件所在路径设置监听地址修改数据库密码已经修改了密码,为什么没有生效?不需要密码就可以连接?设置访问权限4. 新的配置生效前言 PostgreSQL是一种功能强大的开源关系型数据库管理系统,被广泛用于各种应用程序和…

多个SSH-Key下,配置Github SSH-Key

首先&#xff0c;检查 github 的连接性&#xff0c;因为DNS污染的原因&#xff0c;很多机器ping不通github&#xff0c;就像博主的机器&#xff1a; 怎么解决DNS污染的问题&#xff0c;博主查了很多教程&#xff0c;测试出一个有效的方法&#xff0c;那就是修改hosts文件。host…

设计模式_组合模式_Composite

案例引入 学校院系展示 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系 【传统方式】 将学院看做是学校的子类&#xff0c;系是学院的子类&#xff0c;小的组织继承大…

代码随想录算法训练营第二天—数组02 | *977.有序数组的平方 ,209.长度最小的子数组 ,*59.螺旋矩阵II

*977.有序数组的平方 题目链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/ 文章讲解&#xff1a;https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html 视频讲解&#xff1a; https://www.bilib…

HarmonyOS 鸿蒙应用开发( 六、实现自定义弹窗CustomDialog)

自定义弹窗&#xff08;CustomDialog&#xff09;可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗。 在应用的使用和开发中&#xff0c;弹窗是一个很常见的场景&#xff0c;自定义弹窗…

idea连接docker

idea 插件无法连接docker问题 原文&#xff1a;idea 插件无法连接docker问题 // 修改docker配置 vi /usr/lib/systemd/system/docker.service // 加上该段配置允许任何ip访问 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock // 重启docker即可 systemctl restart dock…

虹科数字化与AR部门升级为安宝特AR子公司

致关心虹科AR的朋友们&#xff1a; 感谢您一直以来对虹科数字化与AR的支持和信任&#xff0c;为了更好地满足市场需求和公司发展的需要&#xff0c;虹科数字化与AR部门现已升级为虹科旗下独立子公司&#xff0c;并正式更名为“安宝特AR”。 ”虹科数字化与AR“自成立以来&…

opencv010 卷积02(方盒滤波和均值滤波)

今天继续学习滤波器的相关知识&#xff01;这篇比较简单&#xff0c;也短一些&#xff0c;明天写高斯滤波 方盒滤波 boxFilter(scr, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) 方盒滤波的卷积核如下&#xff1a; normalize&#xff08;标准化&#xff0…

python(fastapi) 后端请求url 获取pdf并转发给angular 前端 实现 预览功能

写前端时,总会遇到跨域问题,解决方案单一(配置服务器代理),且效果不佳,所以面对跨域。甩给后端,简单高效,算得上“一步到位”。 python 后端接收来自其他服务器的pdf链接,并转为字节流,转发给前端; import requests from starlette.responses import StreamingRes…

UDP简单的接收和发送

注释 udp简单的接收和发送&#xff0c;不分服务器和客户端&#xff0c;代码都一样&#xff0c;可以通用 using System; using System.Net; using System.Net.Sockets; using UnityEngine;public class UDPManager {/// <summary>/// 客户端/// </summary>private…

Linux 挂载读取、卸载 ntfs格式硬盘

windows常用的ntfs硬盘分区格式&#xff0c;在linux通常不能直接读取&#xff0c;不过挂载也是非常容易 一、挂载ntfs分区 1.安装 apt-get install ntfs-3g2.查看现在接上的硬盘 fdisk -l可以找到类似如下的&#xff0c;会显示microsoft basic data 3.创建挂载的目录 创…

微服务JWT的介绍与使用

1. 无状态登录 1.1 微服务的状态 ​ 微服务集群中的每个服务&#xff0c;对外提供的都是Rest风格的接口&#xff0c;而Rest风格的一个最重要的规范就是&#xff1a;服务的无状态性。 ​ 什么是无状态&#xff1f; 服务端不保存任何客户端请求者信息客户端的每次请求必须具备…

数据结构—基础知识(13):树的存储结构

数据结构—基础知识&#xff08;13&#xff09;&#xff1a;树的存储结构 双亲表示法 这种表示方法中&#xff0c;以一组连续的存储单元存储树的结点&#xff0c;每个结点除了数据域data外&#xff0c;还附设一个parent域用以指示其双亲结点的位置。 这种存储结构利用了每个结…

短信登录接口

后台 urls.py path(mobile/login/, views.MobileLoginViewSet.as_view({post: login})),serializers.py import re from django.core.cache import cache class MobileLoginSerializer(serializers.ModelSerializer):# 覆盖mobile serializers.CharField(requiredTrue, wri…

手搓反向迭代器

前言 关于反向迭代器&#xff0c;字如其名&#xff0c;就是将正向迭代器&#xff0c;从反方向再迭代一次就成了&#xff0c;所以我们如此设计反向迭代器&#xff1a; 假设我们已经拥有了一套能够使用&#xff0c;且包含模板的正向迭代器利用适配器模式&#xff0c;让反向迭代…