【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(二)

简介: 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(二)

友元类


友元类 , 友元类中所有的成员函数都是该类的友元函数 , 可以访问该类对象的私有成员变量 ;


友元类声明 , 声明友元类方法 friend class 友元类名称; , 友元类中所有的成员函数都是该类的友元函数 ;


Student.h 中友元类声明


//声明友元类 , 可以在友元类中访问修改类中的私有成员变量
  //友元类中的所有的成员函数都是友元函数
  friend class Teacher;


友元类定义与实现 , 友元类中定义的方法都是 Student 类的友元函数 , 其中需要传入 Student* 参数来访问 Student 对象的私有成员变量 ; 可以在定义的时候 , 直接将该方法实现 ;


//Student 中的友元类 , 该友元类中的所有函数都是 Student 对象的友元函数
class Teacher {
public:
  //友元类中声明方法 , 修改 Student 中的 id 编号
  void setId(Student* student, int id) {
  student->id = id;
  }




单例类


单例类三要素


① 私有静态单例类类型的静态成员变量 ;

② 私有构造函数 ;

③ 静态共有方法 , 该方法中调用私有构造方法创建唯一一个单例类对象 ;

单例类声明 , 创建 Instance 单例类 ;


① 声明一个私有的静态成员变量 , 外部不能直接访问该成员变量 ; private : static Instance* instance; ;

② 声明私有构造函数 , 外部不能直接调用构造方法创建该类对象 ; private : Instance(); ;

③ 声明静态共有的方法 , 在该方法中调用私有构造函数创建单例对象 , public : static Instance* getInstance(); , 注意创建的这个单例对象是唯一的 , 只能创建一个 ;

Instance.h 单例类声明


#pragma once
class Instance {
//声明一个私有的静态成员变量 , 及构造方法
//外部不能直接调用构造方法创建该类对象
private :
  static Instance* instance;
  Instance();
//声明共有静态方法  
//该方法中可调用私有构造方法并返回 Instance 对象
public :
  static Instance* getInstance();
public : 
  int number = 888;



单例类实现 , 在实现中 , 首先给 Instance::instance 静态成员变量赋值初始值 0 , 静态成员变量可以使用 类名::静态成员变量名 访问 ; 然后实现私有的构造函数 , 最后实现共有的单例类获取函数 , 在该函数中首先判定单例类对象是否已经创建 , 如果已经创建 , 直接返回该单例类对象 , 如果没有创建那么先创建该单例类对象 , 再返回该单例对象 instance ;


//设置Instance 静态成员变量 初始值值
//静态成员变量可以使用 类名::静态成员变量名 访问
Instance* Instance::instance = 0;
//实现构造函数
Instance::Instance() {
}
//实现 getInstance 静态成员函数
//方法的实现中 , 可以使用 this-> 调用成员变量或成员方法
//静态的成员变量和成员函数可以直接调用
Instance* Instance::getInstance() {
  if (!instance) {
  instance = new Instance();
  }
  return instance;


单例类使用 , 首先在 CMakeList.txt 中配置上面的 Instance.h 和 Instance.cpp 两个文件 , 然后在 main() 函数所在文件 , 包含 Instance.h 头文件 , 即可在 main() 中使用该单例类了 ; 调用 Instance::getInstance(); 可创建单例类 , 注意单例类使用完毕后要释放该类 , 否则会造成内存泄漏 ;


//创建单例对象
  Instance* instance = Instance::getInstance();
  //打印单例对象中的变量值
  cout << "单例 instance->number : " << instance->number << endl;
  //释放单例类
  delete instance;


代码执行结果 :


单例 instance->number : 888

image.png

目录
相关文章
|
3天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0
|
3天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
19 0
|
2天前
|
设计模式 Java C++
【C++高阶(八)】单例模式&特殊类的设计
【C++高阶(八)】单例模式&特殊类的设计
|
2天前
|
人工智能 C++
【重学C++】【指针】轻松理解常量指针和指针常量
【重学C++】【指针】轻松理解常量指针和指针常量
9 0
|
2天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
6天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
8天前
|
C++
面向对象的C++题目以及解法2
面向对象的C++题目以及解法2
15 1
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
8天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
8天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”