C++(友元、异常机制、静态成员、单例模式)

news2024/11/22 22:34:19

友元

        友元可以访问与其好友关系的类中的私有成员,使用friend关键字进行修饰。(友元破坏了类的封装性)。

特点

        (1)友元是单向的
        (2)友元不能传递
        (3)友元不能继承

友元函数

        友元函数是一个友元全局函数,friend+函数声明

练习       

        1.有个学生类Student 包括:私有成员:姓名 成绩
           void setData(string name, int score)给成员变量赋值,没有初始化列表
           void show();
        2.在main定义 student数组5个元素并赋值 Students[5] 初始化
        3.设计一个全局友元函数 比较两个学生的成绩的高低 int compare(Student& a, Student& b);
           a的成绩>b的成绩 return 1; a<b return -1; 相等 0
        4. 求出最高分和最低分的学生

student.h

#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
using namespace std;

class Student
{
private:
    //友元函数声明
    friend int compare(Student& a,Student& b);
    string name;
    int score;
public:
    void setData(string name, int score);
    void show();
};

#endif // STUDENT_H

student.cpp

#include "student.h"
void Student::setData(string name, int score)
{
    this->name = name;
    this->score = score;
}
void Student::show()
{
    cout << "姓名:"<<name << " 分数:" <<score << endl;
}

main.cpp

#include "student.h"
// 全局函数,比较两个学生成绩的高低
int compare(Student& a,Student& b)
{
    if(a.score > b.score)
        return 1;
    else if(a.score < b.score)
        return -1;
    else
        return 0;
}
int main()
{
    Student s[5];
    string name;
    int score;
    for(int i = 0; i < 5; i++)
    {
        cin >> name >> score;
        s[i].setData(name, score);
    }
    int indexMax = 0;
    int indexMin = 0;
    for(int i = 1; i < 5; i++)
    {
        if(compare(s[indexMax],s[i]) == -1)
            indexMax = i;
        else if(compare(s[indexMin],s[i]) == 1)
            indexMin = i;
    }
    cout << "高分"<<endl;
    s[indexMax].show();
    cout << "低分"<<endl;
    s[indexMin].show();
    return 0;
}

友元类

        friend+类声明

异常机制

        异常是程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况。

检查异常的步骤

        try(检查):try块中的代码标识将激活的特定异常,通常后面跟1个或者多个catch;
        throw(抛出):当问题出现时,程序会抛出一个异常;
        catch(捕获):在想处理问题的地方,通过异常处理程序捕获异常。

练习

#include <iostream>
using namespace std;
class Triangle
{
    int a;
    int b;
    int c;
public:
    Triangle(int a, int b, int c)
    {
        this->a = a;
        this->b = b;
        this->c = c;
    }
    void show()
    {
        cout << a <<","<<b<<","<<c<<"不是三角形"<<endl;
    }
};
int getLength(int a, int b, int c)
{
    if(a+b<=c || a+c<=b || b+c<=a) // 不满足两边之和大于第三边,就抛出异常
    {
        Triangle t(a,b,c);
        throw t; // 创建三角形异常对象,并且抛出异常
    }
    return a+b+c;
}
int main()
{
    int a,b,c;
    while(1)
    {
        cin >> a>>b>>c;
        try
        {
            int length = getLength(a,b,c);
            cout << "三角形长度:" << length <<endl;
        }
        catch(Triangle t)
        {
            t.show();
        }
    }
    return 0;
}

捕获多异常

        同一时刻只能抛出一个异常,当第一个抛出异常时,整个try就结束了。

C++中静态成员

静态成员变量

        (1)属于整个类,静态成员变量只存储一份供所有对象使用;
        (2)必须在类外单独初始化,而且只能全局进行,否则不会分配空间编译报错

静态成员函数

        (1)静态成员函数不能访问本类中的非静态成员;
        (2)静态函数只能调用静态成员
        (3)对象可以调用,类名直接调用 A::fun();

        静态成员函数时不能使用this指针的,就不能使用类中普通的成员变量
        静态函数只能访问静态的成员变量。
         

单例模式

        作用:保证一个类仅有一个实例,并且提供了一个访问它的全局访问点
        目的:保证类的实例化对象只有一个,主要解决一个全局使用的类频繁的创建和销毁
        关键点是构造函数和拷贝构造函数私有化。

实现方法

        (1)私有构造函数和拷贝构造函数,不让类的外部创建对象
        (2)私有静态类指针,在静态成员函数中实现只创建一个对象的逻辑
        (3)公有静态成员函数返回类指针,用来实例化对象

懒汉模式

        没有对象需要调用它的时候不去实例化,调用的时候才实例化对象。

饿汉模式

        不管调用不调用对外接口,都已经实例化对象了(可直接用于多线程而不会出现问题)

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

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

相关文章

Halcon区域分割之分水岭分割法

现实中我们见到过有山有湖的景象&#xff0c;那么一定是水绕山、山围水的情形。当然可在需要的时候人工构筑分水岭&#xff0c;以防集水盆之间的互相穿透。而区分高山与水的界线以及湖与湖之间的间隔&#xff0c;就是分水岭。 分水岭分割法是一种基于拓扑理论的数学形态…

【python】OpenCV—Tracking(10.4)—Centroid

文章目录 1、任务描述2、人脸检测模型3、完整代码4、结果展示5、涉及到的库函数6、参考 1、任务描述 基于质心实现多目标&#xff08;以人脸为例&#xff09;跟踪 人脸检测采用深度学习的方法 核心步骤&#xff1a; 步骤#1&#xff1a;接受边界框坐标并计算质心 步骤#2&…

使用Jupyter Notebook进行数据科学项目

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jupyter Notebook进行数据科学项目 Jupyter Notebook 简介 安装 Jupyter Notebook 创建和管理 Notebook 编写和运行代码 示例…

MR30分布式IO:石化行业的智能化革新

在浩瀚的工业领域中&#xff0c;石化行业如同一座巨大的化工厂&#xff0c;将自然界的原始资源转化为人们日常生活中不可或缺的各种产品。然而&#xff0c;随着生产规模的扩大和工艺复杂度的提升&#xff0c;石化行业面临着前所未有的挑战&#xff1a;如何在保证生产效率的同时…

Android 使用ninja加速编译的方法

ninja的简介 随着Android版本的更迭,makefile体系逐渐增多,导致make单编模块的时间越来越长,每次都需要半个小时甚至更长时间,其原因为每次make都会重新加载所有mk文件,再生成ninja编译,此完整过程十分耗时,实际编译代码仅占其中的一小部分。 因此我们可以使用google提…

要在微信小程序中让一个 `view` 元素内部的文字水平垂直居中,可以使用 Flexbox 布局

文章目录 主要特点&#xff1a;基本用法&#xff1a;常用属性&#xff1a; 要在微信小程序中让一个 view 元素内部的文字水平垂直居中&#xff0c;可以使用 Flexbox 布局。以下是如何设置样式的示例&#xff1a; .scan-button {display: flex; /* 启用 Flexbox 布局 */justify…

网关如何传递信息给微服务

前情回顾 上篇我们已经完成了网关对所有微服务请求的拦截以及JWT的登录校验。 客户端和微服务之间的桥梁--网关&#xff08;身份校验&#xff09;https://mp.csdn.net/mp_blog/creation/editor/143425484 问题引入 现在的问题是在一些微服务业务中&#xff0c;需要用到用户…

ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题

下载安装包 下载地址 https://software.openkylin.top/openkylin/yangtze/pool/all/ 页面搜索 easyconnect 选择 easyconnect_7.6.7.3.0_amd64.deb安装 sudo dpkg --install easyconnect_7.6.7.3.0_amd64.deb卸载 sudo dpkg --remove easyconnect出现的问题 安装以后第…

Learn QOpenGL 读取obj模型

/* ** File name: OpenGLModelWidget.h ** Author: ** Date: 2024-10-31 ** Brief: 读取模型文件并渲染的OpenGL控件 ** Copyright (C) 1392019713qq.com All rights reserved. */#ifndef OpenGLModelWidget_H #define OpenGLModelWidget_H#include…

C++入门基础知识133—【关于C 库函数 - asctime()】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 库函数 - asctime()的相关内容&#x…

Java版企电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

沟通工具选错了,团队效率会下降多少?

沟通工具的选择对团队的工作效率和协作能力有着直接影响。选用不当的沟通工具可能导致信息传递不畅、工作效率低下、团队士气下降等严重后果。具体来说&#xff0c;沟通不畅会造成误解、信息延迟和团队合作困难。例如&#xff0c;使用不适合团队规模和工作流程的工具&#xff0…

ElasticSearch - Bucket Script 使用指南

文章目录 官方文档Bucket Script 官文1. 什么是 ElasticSearch 中的 Bucket Script&#xff1f;2. 适用场景3. Bucket Script 的基本结构4. 关键参数详解5. 示例官方示例&#xff1a;计算每月 T 恤销售额占总销售额的比率百分比示例计算&#xff1a;点击率 (CTR) 6. 注意事项与…

Java中IO的高级操作

目录 缓冲流 缓冲字节输入流&#xff1a; 缓冲字节输出流&#xff1a; 缓冲字符输入流&#xff1a; 缓冲字符输出流&#xff1a; 转换流 转换流字符输入&#xff1a; 转换流字符输出&#xff1a; 练习案例&#xff1a; 打印流 字节打印流&#xff1a; 字符打印流&a…

VsCode中搭建 Rt-Thread 开发环境(编译,调试,下载)

VsCode中搭建 Rt-Thread 开发环境&#xff08;编译&#xff0c;调试&#xff0c;下载&#xff09; 文章目录 VsCode中搭建 Rt-Thread 开发环境&#xff08;编译&#xff0c;调试&#xff0c;下载&#xff09;一 . 下载rt-thread源码二. 安装env脚本环境三 . 配置工具链3.1 使用…

Pinctrl子需要中client端使用pinctrl过程的驱动分析

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析&#xff1a;imx_pinctrl_soc_info结构体 input子系统专栏…

初探Flink的序列化

Flink中的序列化应用场景 程序通常使用(至少)两种不同的数据表示形式[2]&#xff1a; 1. 在内存中&#xff0c;数据保存在对象、结构体、列表、数组、哈希表和树等结构中。 2. 将数据写入文件或通过网络发送时&#xff0c;必须将其序列化为字节序列。 从内存中的表示到字节序列…

项目一:使用 Spring + SpringMVC + Mybatis + lombok 实现网络五子棋

一&#xff1a;系统展示: 二&#xff1a;约定前后端接口 2.1 登陆 登陆请求&#xff1a; GET /login HTTP/1.1 Content-Type: application/x-www-form-urlencodedusernamezhangsan&password123登陆响应&#xff1a; 正常对象&#xff1a;正常对象会在数据库中存储&…

CentOS7配置静态IP(非解决方法指导,纯笨蛋记录)

一、这篇博客算是记录我终于解决我安装的虚拟机ping不通外网的问题&#xff0c;前前后后我尝试了很多次花了很多时间&#xff0c;最后弄完发现其实都是因为我之前根本不知道什么是虚拟机的网络配置。。。。。 这个链接介绍了vmware虚拟机三种网络模式及配置详解_vmware 特定虚…

opencv-day2-图像预处理1

图像预处理 在计算机视觉和图像处理领域&#xff0c;图像预处理能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。 常见的图像预处理操作&#xff1a; 图像色彩空间转换 图像大小调整 图像仿射变换 图像翻转 图像裁剪 图像二值化处理 图…