【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

目录
相关文章
|
11天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
41 9
|
14天前
|
存储 开发框架 Java
|
15天前
|
Java C++ iOS开发
|
19天前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
16 0
|
23天前
|
存储 编译器 开发工具
C++语言教程分享
C++语言教程分享
|
23天前
|
自然语言处理 编译器 C语言
C++语言入门教程
C++语言入门教程
|
23天前
|
存储 编译器 程序员
C++语言基础学习
C++语言基础学习
|
6天前
|
设计模式 安全 编译器
【C++11】特殊类设计
【C++11】特殊类设计
25 10
|
6天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
14天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。