C++
中的
嵌套类和局部类
最近趁着春节假期空闲,找了本
C++ Primer
学了几章,发现
C++
中的许多特性自己都不知道。其中
嵌套类和局部类感觉还是蛮有用的,简单的写写他们的用法。
所谓嵌套类就是可以在一个类中定义另一个类。这个被嵌套的类的作用域就只在它的上一级类中。下面是个例子:
#include <iostream>
using namespace std;
class c1
public:
int a;
void foo();
class c2
public:
int a;
void foo();
void c1::foo()
a = 1;
void c1::c2::foo()
a = 2;
int main()
class c1 f;
f.foo();
f.b.foo();
cout << f.a << endl;
cout << f.b.a << endl;
return 0;
其实在C语言中也有类似的用法,在一个结构体中嵌套另一个结构体,或者在一个结构体中嵌套一个union 。我们还知道,C 语言中被嵌套的结构体或union 通常是匿名的。在C++中也是可以的,我们可以在一个类中嵌套另外一个匿名类。不过,匿名类的成员函数只能在类的声明中同时定义,因为这个类没有名称,我们没法在外部指代它。
下面就是一个类似的例子:
class c3
public:
int a;
void foo() {a = 3;}
class
public:
int a;
void foo() {a = 4;}
int main()
class c3 ff;
ff.foo();
ff.b.foo();
cout << ff.a << endl;
cout << ff.b.a << endl;
return 0;
所谓局部类,就是定义在一个函数内部的类,这个类只能在这个函数内部使用。下面是个例子:
int main()
class c4
public:
int a;
void foo() {a = 4;}
class c4 ff;
ff.foo();
cout << ff.a << endl;
return 0;
通常,嵌套类和局部类的所有成员变量我们都会声明为共有的。因为这两种类只在很小的范围内使用,没有必要通过定义接口来隐藏内部的信息。所以,可以把 class 改换成 struct,这样就可以不写public 了。
另外,多说一句,函数是不能嵌套的。比如下面的例子是无法编译通过的。
int main()
void foo() { cout << "WRONG";};
foo();
但是我们可以通过一些变通的方法来模拟出一个局部函数来。具体来说就是通过重载一个类的operator () 方法来模拟一个函数调用,下面给个例子:
int main()
struct
void operator () ( void )
cout << "HELLO" << endl;
int operator() (int a, int b)
return a + b;
} foo;
foo();
cout << foo(1, 2);
1. 嵌套类外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定。
嵌套类中的成员函数可以在它的类体外定义。
嵌套类的成员函数对外围类的私有成员没有访问权,反之亦然。
嵌套类仅仅只是语法上的嵌入。
2. 局部类类也可以定义在函数体内,这样的类被称为局部类(loacl class)。局部类只在定义它的局部域内可见。
局部类的成员函数必须被定义在类体中。
局部类中不能有静态成员函数。
在实践中,局部类很少使用。
下面给出一段代码
嵌套类就是:在一个类的作用域里,又定义了一个类。
1、为什么引入嵌套类?
之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外层类的实现,同时可以对用户隐藏该底层实现。
可以这样理解:有一些工作不想被用户知道怎么实现的,那么就把这些工作交给嵌套类实现,然后对外层类提供一个接口即可。
class A
private:
class Imp;
Imp* impl;
public:
virtual ~A();
1. 嵌套类(nested class)
一个类可以定义在另一个类的内部,前者称为嵌套类,嵌套类时一个独立的类,和外层类基本没什么关系,它通过提供新的类型类作用域来避免名称混乱.
嵌套类必须声明在类的内部,但是可以定义在类的内部或者外部。在外层类之外定义一个嵌套类时,必须以外层类的名字限定嵌套类的名字。
嵌套类的名字只在外围类可见。
类的私有成员只有类的成员和友元可以访问,因此外围类不...
嵌套类介绍二级目录三级目录
在c++中,可以将类的声明放在另一个类中。在另一个类中声明的类被称为嵌套类,它通过提供新的类型类作用域来避免混乱。包含类的成员函数可以创建和使用被嵌套类的对象;而仅当声明位于公有部分,才能在包含类的外面使用嵌套类,而且必须使用作用域解析运算符。
对类进行嵌套与包含并不不同。包含意味着将类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型,该类型仅在包含嵌套类声明的类中有效。
对类进行嵌套通常是为了帮助实现另一个类,并避免名称冲突。Queue类示例嵌套了结
相比,基本上没什么区别,除了一点:就是嵌套类的名称会被隐藏在外围类的内部,也就是说嵌套类的名称不是全局可见的,只能在外围类内部可见,因此也不会与其他相同名字的类产生冲突。另外,事实上嵌套类的成员只能被外围类访问(因为在外围类之外是不可见的),所以嵌套类通常所有的成员都被定义为public型,因为只有外围类才能访问他们(对于非静态成员)。外围类不能访问嵌套类的非public成员,嵌套类也不能访问外围类的非public成员,嵌套类于外围类彼此独立,没有什么实际的关系。通常A被称作为外围类,B被称作为嵌套类。
文章目录前言一、类的大小跟static的关系二、多态和虚函数底层原理分析1.原理:2.C++中多态可以划分为两大类3.代码实例三、内部类----》类的嵌套四、纯虚函数和抽象类1.纯虚函数2.抽象类3.代码实例总结
C++精准知识讲解
提示:以下是本篇文章正文内容,下面案例可供参考
一、类的大小跟static的关系
更新类的大小:类的大小由类中所有非静态成员属性的大小决定(静态成员属性不占用类的大小,因为静态成员属性存放在数据段中)
代码实例:
#include <iostream>..
函数的嵌套调用
C++不允许对函数作嵌套定义,也就是说在一个函数中不能完整地包含另一个函数。在一个程序中每一个函数的定义都是互相平行和独立的。虽然C++不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数
所谓嵌套调用,是在调用一个函数并执行该函数的过程中,又调用另一个函数的情况。如在main()函数中调用了a函数,而在a函数的执行过程中又调用b函数。这就构成...
嵌套类是一个独立的类:
外层类的对象和嵌套类的对象是相互独立的;
嵌套类的对象中不包含任何外层类定义的成员,外层类的对象中不包含任何嵌套类定义的成员;
嵌套类的名字在外层类作用域中是可见的,在外层类作用域之外不可见
嵌套类中成员的种类与非嵌套类是一样的,...
嵌套类分为两种:静态嵌套类和内部类。内部类中又有两种特殊的内部类:局部类和匿名类。如果局部类只使用一次,则使用匿名类更简洁。如果实现的接口只有一个方法,则lambda表达式更简洁。...