类于对象(三)

######C++课程网笔记,感谢Mr.J老师

1)类作用域

2)前向声明

3)嵌套类

4)局部类

1、类作用域

每个类都定义了自己的作用域称为类作用域。

类作用域中说明的标识符只有类中可见。

#include <iostream>
using namespace std;

class Test
{public:
	int num_;

};
//num_ = 20; error num_的作用域在类内部
int num_ = 20;  //num_的作用域是文件作用域,与类中的num_是不同的作用域,可行

int main(void)
{
	return 0;
}

(1)块作用域

(2)文件作用域

(3)函数原型作用域

(4)函数作用域

(5)类作用域

#include <iostream>
using namespace std;

class Test
{public:
	int num_;

};
//num_ = 20; error num_的作用域在类内部
int num_ = 20;  //num_的作用域是文件作用域,从定义位置开始到文件结束有效,与类中的num_是不同的作用域,可行

int add(int a,int b); //函数原型作用域,a,b两个标识符的作用域为函数声明的这条语句内有效。定义函数时可以使用a,b,标识符。

int main(void)
{
	int num_ = 30; //num_为块作用域
	{
		int num_ = 100; //num_为块作用域,所谓块作用域是指{}内的代码。
	}

	cout << num_ << endl;   //输出为:30   因此块作用域只对块内的有效
	cout << ::num_ << endl;  //输出为:20  使用::,域运算符指定文件作用域下的num_

	return 0;
}

int add(int a, int b) //形参a,b也可以看成块作用域。
{
	return a + b;

}

int test()
{
LABEL1:
	cout << "label1" << endl;
	goto LABEL3;				//函数作用域是针对goto语句来讲的,这里LABEL3还未定义就可以使用,因为函数作用域下,goto语句可以使用函数内的内容。
LABEL2:
	cout << "label2" << endl;
	goto LABEL1;
LABEL3:
	cout << "label3" << endl;
	goto LABEL2;
}

2)前向声明

        C++中的类必须先定义,才能够实例化。

        两个类需要相互引用形成一个“环形”引用时,无法先定义使用,这个时候需要用到前向声明。

        前向声明的类不能实例化。

为说明这个概念,我们定义了两个类,一个A,一个B,这里再A类中包含B类,在B类中包含A类,这样相互包含是不允许的,

#ifndef _A_H_
#define _A_H_

#include "B.h"

class A
{
public:
	A(void);
	~A(void);
    //B b_; error,//这里需要定义一个B类对象,要包含B.h
};

#endif
#ifndef _B_H_
#define _B_H_

//#include "A.h"
class A;//前向声明

class B
{
public:
	B(void);
	~B(void);
    //A a_;  error,尽管定义了前向声明,也是错误,不能实例化对象,可以定义指针或者引用//B类中需                
      //要            
      //定义一个A对象,要包含A.h
	A* a;

};


#endif // !_B_H_

 在B.cpp文件中使用到A类中的内容要包含A.h文件。如下

#include "B.h"
#include "A.h"

	B::B(void)
	{
		A* a;
	}

	B::~B(void)
	{

	}

3)嵌套类

外围类需要使用嵌套对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。

#include <iostream>

using namespace std;

class Outer
{
	class Inter
	{
	public:
		void Fun()
		{
			cout << "Inter::Fun..." << endl;
		}

	};
	Inter obj_;

public:
	void Fun()
	{
		cout << "Outer::Fun.." << endl;
		obj_.Fun();
	}

};

int main(void)
{
	Outer o;
	o.Fun();
	return 0;
}

/*
输出:
Outer::Fun..
Inter::Fun...
*/

从作用域的角度,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用,如果在外围类的作用域外使用该类名时,需要加名字限定。

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

嵌套类的成员函数对外围类的成员没有访问权,反之亦然。

嵌套类仅仅只是语法上的嵌套。

#include <iostream>

using namespace std;

class Outer
{
public:
	class Inter
	{
	public:
		void Fun();
		/* {
			cout << "Inter::Fun..." << endl;
		}*/

	};
	Inter obj_;

public:
	void Fun()
	 {
		cout << "Outer::Fun.." << endl;
		obj_.Fun();
	}

};
void Outer::Inter::Fun()   //嵌套类的实现放在类外
{
	cout << "Inter::Fun..." << endl;
}
int main(void)
{
	Outer o;
	o.Fun();
	Outer::Inter i;   //外部也可以定义嵌套类的对象i
	i.Fun();
	
	return 0;
}

/*
输出:
Outer::Fun..
Inter::Fun...
*/

4)局部类

类也可以定义在函数体内,这样的类被称为局部类(local class).局部类只在定义它的局部域内可见。

局部类的成员函数必须被定义在类体中。

局部类中不能有静态成员。

#include <iostream>

using namespace std;

class Outer
{
public:
	class Inter
	{
	public:
		void Fun();
		/* {
			cout << "Inter::Fun..." << endl;
		}*/

	};
	Inter obj_;

public:
	void Fun()
	 {
		cout << "Outer::Fun.." << endl;
		obj_.Fun();
	}

};
void Outer::Inter::Fun()   //嵌套类的实现放在类外
{
	cout << "Inter::Fun..." << endl;
}

void Fun()
{
	class LocalClass    //局部类,只能在定义它的函数体使用。
	{
	public:
		int num_;
		void Init(int num)
		{
			num_ = num;  //局部类的实现只能在类体中实现。

		}
		void Display()
		{
			cout << "num_ = " << num_ << endl;
		}
		//static int num2_;不能在局部类中定义静态成员。

	};

	LocalClass lc;
	lc.Init(10);
	lc.Display();
}
int main(void)
{
	Outer o;
	o.Fun();
	Outer::Inter i;   //外部也可以定义嵌套类的对象i
	i.Fun();

	Fun();

	
	return 0;
}

/*
输出:
Outer::Fun..
Inter::Fun...
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值