友元
友元可以访问与其好友关系的类中的私有成员,使用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;elsereturn 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)公有静态成员函数返回类指针,用来实例化对象
懒汉模式
没有对象需要调用它的时候不去实例化,调用的时候才实例化对象。
饿汉模式
不管调用不调用对外接口,都已经实例化对象了(可直接用于多线程而不会出现问题)