C++ 嵌套类与局部类

代码编译运行环境:VS2017+Debug+Win32


1.嵌套类

在一个类体中定义的类叫作嵌套类。拥有嵌套类的类叫外围类。

定义嵌套类的初衷是建立仅供某个类的成员函数使用的类类型。目的在于隐藏类名,减少全局的标识符,从而限制用户能否使用该类建立对象。这样可以提高类的抽象能力,并且强调了两个类(外围类和嵌套类)之间的主从关系。

#include <iostream>
using namespace std;

class A {
public:
	class B {
	public:
		B(char* name) {
			cout<<"constructing B:"<<name<<endl;
		}
		void printB();
	};
	B b;
	A():b("In class A") {
		cout<<"constructing A"<<endl;
	}
};

void A::B::printB() {
	cout<<"B's member function"<<endl;
}

int main(int argc,char* argv[]) {
	A a;
	A::B b("outside of A");
	b.printB();
}

程序输出结果:

constructing B:In class A
constructing A
constructing B:outside of A
B's member function

对嵌套类的若干说明:
(1)从作用域的角度来看,嵌套类与外围类是两个完全独立的类,只是主从关系,二者不能相互访问,也不存在友元关系。

(2)从访问权限的角度来看,嵌套类既可为私有,也可为公有。在上面的例子中,嵌套类B的访问权限是public,可以在外围类的成员函数之外使用该嵌套类,使用时加上名字限定。如果将嵌套类B的访问权限设置为private,那么只能在外围类内使用。

(3)嵌套类中的成员函数可以在它的类体外定义。

(4)嵌套类可以访问外围类的静态成员变量,即使它的访问权限是私有的,访问方式通过”ClassName::staticVarName”来直接访问。

2.局部类

在一个函数体内定义的类称为局部类。局部类可以定义自己的数据成员和函数成员。它也是一种作用域受限的类。

使用示例:

#include <iostream>
using namespace std;

int global=100;

void func() {
	static int s;
	class A {
	// static int t; // 编译出错
	public:
		int num;
		void init(int i) { s=i; }
		void print() {
			num = global;
			cout << num << endl;
		}
	};

	A a;
	a.init(8);
	cout<<"s:"<<s<<endl;
	a.print();
}

int main(int argc,char* argv[]) {
	func();
}

程序输出结果:

s:8
100

关于局部类的几点说明:
(1)局部类只能在定义它函数内部使用,在其他地方不能使用;
(2)局部类的所有成员函数都必须定义在类体内,因此在结构上不是特别灵活;
(3)在局部类的成员函数中,可以访问上级作用域的所有变量,如函数局部变量、全局变量等;
(4)局部类中不能定义静态数据成员,因为这种数据成员的初始化无法完成,静态成员数据的定义和初始化必须放在全局作用域。

在实践过程中,局部类很少使用。


参考文献

[1] C++静态数据成员定义及应用浅谈
[2] 陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.C4.7.P153-156

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值