C++内嵌类

内嵌类有两种类型:内联(inner)类和静态内嵌(static nested)类。

c++嵌套类等同于内部类的概念,定义嵌套类的目的是为了隐藏信息,提高代码的抽象能力,相当与在内部为外部类提供了一种新的类型。
查阅了相关资料,发现内嵌类有两种类型:内联(inner)类和静态内嵌(static nested)类。但是经过个人测试并没有太大差异,所以现将使用方法及注意要点作出总结如下。

1.内嵌类可以访问定义在外围类(enclosing class)中的静态实例变量。外围类不可以访问嵌套类的私有成员.

看下面这段代码:

#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
class Singleton
{
public:

static Singleton* GetInstance() {
// 注意这里一定要使用Double-Check的方式加锁,才能保证效率和线程安全
   if (nullptr == m_pInstance) {
           m_mtx.lock();
   if (nullptr == m_pInstance) {
           m_pInstance = new Singleton();
}
    m_mtx.unlock();
}
   return m_pInstance;
}



// 实现一个内嵌垃圾回收类 
class CGarbo {
public:
   ~CGarbo(){
           if (Singleton::m_pInstance)
              delete Singleton::m_pInstance;
  }
  };

// 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
static CGarbo Garbo;


private:

// 构造函数私有
Singleton(){};
// 防拷贝
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
static Singleton* m_pInstance; // 单例对象指针
static mutex m_mtx; //互斥锁
};


Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;

这是之前提到过的单例模式中的“懒汉模式”;
我们在Singletion中内嵌了一个“垃圾回收类”;定义一个静态成员变量(回收类的对象),程序结束时,系统会自动调用它的析构函数从而释放单例对象。

2.不能从内嵌类中访问外部类的非静态成员.
错误的访问方式:
在这里插入图片描述
加上static修饰后:
在这里插入图片描述

3.可以在外部通过作用域限定符调用.

//静态嵌套类的测试
#include<iostream>
#include<windows.h>
using namespace std;

class  outer
{
 public:
   static class inner
  {
	 public:
	   inner(int a) :_in(a)
		 {
			 cout << "你好世界" << endl;
		 }
  	   
      int _in;

	};

private:	
	static int _a;

};

int outer::_a = 2;


void func()
{
   //通过类+作用域限定符创建对象
	outer::inner in(5);
	cout << in._in;

}
int main()
{
    
	func();
	system("pause");
	return 0;
}

测试结果:
在这里插入图片描述

个人总结,评论区欢迎补充讨论。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥抱@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值