当前位置: 首页 > article >正文

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

友元

        友元可以访问与其好友关系的类中的私有成员,使用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.kler.cn/a/377061.html

相关文章:

  • STM32-笔记30-编程实现esp8266联网功能
  • REVERSE-COMPETITION-CCSSSC-2025
  • 海外招聘丨 弗拉瑞克商学院—博士研究员:智能家居技术业务和能源管理中的数据分析和人工智能
  • 125个Docker的常用命令
  • Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)
  • Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案
  • 【MySQL】InnoDB存储引擎内存结构Ⅱ
  • Linux curl命令下载显示时间/速度/大小
  • LLC Power Switches and Resonant Tank 笔记
  • 【算法-选择排序】挑挑拣拣,排出顺序——选择排序入门
  • 大学城水电资源管理:Spring Boot解决方案
  • 使用Python高效处理CSV和Excel文件的多种方法
  • 基于Spring Boot的信息学科平台系统开发与优化
  • LeetCode 每日一题 2024/10/28-2024/11/3
  • 用Fiddler如何对Jmeter的请求进行抓包
  • python的json库的基本应用
  • 富格林:可信措施提升追损效率
  • 光学基础知识(2)体全息光存储技术
  • 终于弄懂了Python中列表的定义
  • springboot 自动装配和bean注入原理及实现
  • 贪心算法---java---黑马
  • 【ChatGPT】让ChatGPT根据固定模板生成报告或文档
  • 七、Go语言快速入门之函数func
  • 智能呼叫中心详细介绍
  • Android——显式/隐式Intent
  • Air780EP之RC522开发板,你了解吗?