Local Classes in C++
A class declared inside a function becomes local to that function and is called Local Class in C++.
For example, in the following program, Test is a local class in fun().
1 #include<iostream>
2 using namespace std;
3
4 void fun()
5 {
6 class Test // local to fun
7 {
8 /* members of Test class */
9 };
10 }
11
12 int main()
13 {
14 return 0;
15 }
Following are some interesting facts about local classes.
(1) A local class type name can only be used in the enclosing function.
For example, in the following program, declarations of t and tp are valid in fun(), but invalid in main().
1 #include<iostream>
2 using namespace std;
3
4 void fun()
5 {
6 // Local class
7 class Test
8 {
9 /* ... */
10 };
11
12 Test t; // Fine
13 Test *tp; // Fine
14 }
15
16 int main()
17 {
18 Test t; // Error
19 Test *tp; // Error
20 return 0;
21 }
(2)All the methods of Local classes must be defined inside the class only.
For example, program 1 works fine and program 2 fails in compilation.
1 // PROGRAM 1
2 #include<iostream>
3 using namespace std;
4
5 void fun()
6 {
7 class Test // local to fun
8 {
9 public:
10 // Fine as the method is defined inside the local class
11 void method()
12 {
13 cout << "Local Class method() called";
14 }
15 };
16
17 Test t;
18 t.method();
19 }
20
21 int main()
22 {
23 fun();
24 return 0;
25 }
Output:
Local Class method() called
1 // PROGRAM 2
2 #include<iostream>
3 using namespace std;
4
5 void fun()
6 {
7 class Test // local to fun
8 {
9 public:
10 void method();
11 };
12
13 // Error as the method is defined outside the local class
14 void Test::method()
15 {
16 cout << "Local Class method()";
17 }
18 }
19
20 int main()
21 {
22 return 0;
23 }
Output:
Compiler Error: In function 'void fun()': error: a function-definition is not allowed here before '{' token
(3)A Local class cannot contain static data members. It may contain static functions though.
For example, program 1 fails in compilation, but program 2 works fine.
1 // PROGRAM 1
2 #include<iostream>
3 using namespace std;
4
5 void fun()
6 {
7 class Test // local to fun
8 {
9 static int i;
10 };
11 }
12
13 int main()
14 {
15 return 0;
16 }
Compiler Error:
In function 'void fun()': error: local class 'class fun()::Test' shall not have static data member 'int fun()::Test::i'
1 // PROGRAM 2
2 #include<iostream>
3 using namespace std;
4
5 void fun()
6 {
7 class Test // local to fun
8 {
9 public:
10 static void method()
11 {
12 cout << "Local Class method() called";
13 }
14 };
15
16 Test::method();
17 }
18
19 int main()
20 {
21 fun();
22 return 0;
23 }
Output:
Local Class method() called
(4)Member methods of local class can only access static and enum variables of the enclosing function. Non-static variables of the enclosing function are not accessible inside local classes.
For example, the program 1 compiles and runs fine. But, program 2 fails in compilation.
1 // PROGRAM 1
2 #include<iostream>
3 using namespace std;
4
5 void fun()
6 {
7 static int x;
8 enum {i = 1, j = 2};
9
10 // Local class
11 class Test
12 {
13 public:
14 void method()
15 {
16 cout << "x = " << x << endl; // fine as x is static
17 cout << "i = " << i << endl; // fine as i is enum
18 }
19 };
20
21 Test t;
22 t.method();
23 }
24
25 int main()
26 {
27 fun();
28 return 0;
29 }
Output:
x = 0
i = 1
1 // PROGRAM 2
2 #include<iostream>
3 using namespace std;
4
5 void fun()
6 {
7 int x;
8
9 // Local class
10 class Test
11 {
12 public:
13 void method()
14 {
15 cout << "x = " << x << endl;
16 }
17 };
18
19 Test t;
20 t.method();
21 }
22
23 int main()
24 {
25 fun();
26 return 0;
27 }
Output:
In member function 'void fun()::Test::method()': error: use of 'auto' variable from containing function
(5)Local classes can access global types, variables and functions. Also, local classes can access other local classes of same function..
For example, following program works fine.
1 #include<iostream>
2 using namespace std;
3
4 int x;
5
6 void fun()
7 {
8
9 // First Local class
10 class Test1
11 {
12 public:
13 Test1()
14 {
15 cout << "Test1::Test1()" << endl;
16 }
17 };
18
19 // Second Local class
20 class Test2
21 {
22 // Fine: A local class can use other local classes of same function
23 Test1 t1;
24 public:
25 void method()
26 {
27 // Fine: Local class member methods can access global variables.
28 cout << "x = " << x << endl;
29 }
30 };
31
32 Test2 t;
33 t.method();
34 }
35
36 int main()
37 {
38 fun();
39 return 0;
40 }
Output:
Test1::Test1()
x = 0
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
转载请注明:http://www.cnblogs.com/iloveyouforever/
2013-11-27 14:33:59
Local Classes in C++的更多相关文章
- Java Inner Classes
When thinking about inner classes in java, the first thing that comes to my mind is that, WHY do we ...
- Effetive Java 22 Favor static member classes over nonstatic
Nested class types Usage and remark Advantage Disadvantage static member classes Use for public help ...
- Java - Nested Classes
(本文参考:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) Nested Classes class OuterClas ...
- JAVA匿名内部类(Anonymous Classes)
1.前言 匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣科地用,虽然也在用,但往往忽略了以下几点:为什么能这么用?匿名内部类的语法是怎样的?有哪些限制?因此,最近,我在 ...
- Java Nested Classes(内部类~第一篇英文技术文档翻译)
鄙人最近尝试着翻译了自己的第一篇英文技术文档.Java Nested Classes Reference From Oracle Documentation 目录 嵌套类-Nested Classes ...
- Window Classes in Win32
探索Win32系统之窗口类(Window Classes in Win32) Kyle MarshMicrosoft Developer Network Technology GroupMSDN技术组 ...
- Java
2016-12-17 21:10:28 吉祥物:Duke(公爵) Logo:咖啡(爪哇岛盛产咖啡) An overview of the software development proce ...
- 让VisualVM+BTrace进入unsafe mode
让VisualVM+BTrace进入unsafe mode http://kenai.com/projects/btrace/pages/UserGuide BTrace很强大,但有很多安全限制,比如 ...
- 探索Win32系统之窗口类(转载)
Window Classes in Win32 摘要 本文主要介绍win32系统里窗口类的运做和使用机制,探索一些细节问题,使win32窗口类的信息更加明朗化. 在本文中,"类", ...
随机推荐
- github上传和删除文件(三)
上传文件: git init git add * git commit -m "description" //git remote rm origin 或查看当前 git remo ...
- 论文翻译:Fullsubnet: A Full-Band And Sub-Band Fusion Model For Real-Time Single-Channel Speech Enhancement
论文作者:Xiang Hao, Xiangdong Su, Radu Horaud, and Xiaofei Li 翻译作者:凌逆战 论文地址:Fullsubnet:实时单通道语音增强的全频带和子频带 ...
- RocketMQ源码详解 | Consumer篇 · 其一:消息的 Pull 和 Push
概述 当消息被存储后,消费者就会将其消费. 这句话简要的概述了一条消息的最总去向,也引出了本文将讨论的问题: 消息什么时候才对被消费者可见? 是在 page cache 中吗?还是在落盘后?还是像 K ...
- 设计模式学习-使用go实现外观模式
外观模式 定义 适用范围 代码实现 优点 缺点 关于接口粒度的思考 参考 外观模式 定义 外观模式也叫门面模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接 ...
- [Comet1173]最简单的题
称区间$[l,r]$的"信息"为其的答案和第一个.最后一个大于$x$的位置,显然通过$[l,mid]$和$[mid+1,r]$的信息可以$o(1)$合并得到$[l,r]$的信息 考 ...
- 【NetWork】外网和内网
外网和内网 2019-11-16 11:22:37 by冲冲 1.内网 ① 内网的电脑们,需要经过交换机.路由器,才能访问Internet(外网). ② 因为外网IP比较紧张,现在的电脑普及使得外 ...
- java内部类的调用方式
public class DotThis { public class Inner{ public DotThis outer(){ return DotThis.this; }; } /* 1.第一 ...
- AtCoder Beginner Contest 188题解
A 题意 问\(x,y\)相差是否小于\(3\) #include<iostream> #include<cstdio> #include<cmath> #defi ...
- Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)
Atcoder 题面传送门 & 洛谷题面传送门 神仙调整+乱搞题. 首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发. 首先将 \(a_i ...
- 对 SAM 和 PAM 的一点理解
感觉自己学 SAM 的时候总有一种似懂非懂.云里雾里.囫囵吞枣.不求甚解的感觉,是时候来加深一下对确定性有限状态自动机的理解了. 从 SAM 的定义上理解:SAM 可以看作一种加强版的 Trie,它可 ...