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窗口类的信息更加明朗化. 在本文中,"类", ...
随机推荐
- jenkins 生成HTML报表,邮件推送
1.登录jenkins,系统管理=>插件管理 =>可选插件安装 安装成功: 2.打开任务,进入配置 3.添加构建后操作 4.配置页面 5.构建后report输出配置完成后点击立即构建,构建 ...
- 【Python+postman接口自动化测试】(4)HTTP 协议
前言 HTTP:超文本传输协议,是用于从WWW服务器传输超文本到本地浏览器的传输协议. HTTP协议是一种无状态协议,主要包含请求和相应两大部分. 请求(Request) get请求示范: GET h ...
- python调试出现报错:SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xb0 in position 9: invalid start byte
原因:如图,代码里字符串里加上汉字就会报相关错误: 解决办法:开头加上 #-*-coding:GBK -*- 即可解决
- liteIDE配置环境变量
1.下载安装go https://www.cnblogs.com/Jack-cx/p/9878213.html 2.下载ide https://www.golangtc.com/download/li ...
- requestAnimationFrame 执行机制探索
1.什么是 requestAnimationFrame window.requestAnimationFrame() 告诉浏览器--你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更 ...
- 8大原则带你秒懂Happens-Before原则
摘要:在并发编程中,Happens-Before原则是我们必须要掌握的,今天我们就一起来详细聊聊并发编程中的Happens-Before原则. 本文分享自华为云社区<[高并发]一文秒懂Happe ...
- liunx基础知识点1:系统管理相关命令、目录操作命令、文本编辑、关闭防火墙、重启和关闭
Linux(一) liunx系统那么重要,作为一个测试人员,不掌握你就损失了好几千,为了这个钱,也为了面子,什么鬼?我爱膨胀.你看看这些知识喽.我整理的,可费工夫了. 下次给大家一个面试题啊,更直观
- [atAGC020E]Encoding Subsets
令$f_{S}$表示字符串$S$的答案(所有子集的方案数之和),考虑转移: 1.最后是一个字符串,不妨仅考虑最后一个字符,即$f_{S[1,|S|)}$(字符串下标从1开始),特别的,若$S_{|S| ...
- [atAGC050B]Three Coins
记$p_{i}$表示该位置是否有硬币 称使得$p_{i,i+1,i+2}$都变为1的操为对$i$的添加操作,使得$p_{i,i+1,i+2}$都变为0的操作为对$i$的删除操作 考虑一个简单的操作:若 ...
- [atARC099E]Independence
考虑这张图的反图,相当于这两个集合内部没有边,这也就是二分图的限制 换言之,我们要将这张图黑白染色(不能则为-1),$x$即为某种颜色的数个数 对于一个联通块,记连通块大小为$sz$,则白色点个数为$ ...