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窗口类的信息更加明朗化. 在本文中,"类", ...
随机推荐
- 新手使用python以及pycharm看过来
前言 随着互联网时代的进步,人类与计算机之前的沟通交流越来越便捷,自此交流的媒介--编程语言吸引力更多的人学习,今天我们就来谈谈当前市面上最火的编程语言 1.文件的概念 什么是文件夹.文件 其实是操作 ...
- css 马赛克悬停效果
css 马赛克悬停效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset=
- JAVA线上常见问题排查手段(小结)
在平时开发过程中,对于线上问题的排查以及系统的优化,免不了和Linux进行打交道.每逢大促和双十一,对系统的各种压测性能测试,优化都是非常大的一次考验.抽空整理了一下自己在线上问题排查以及系统优化的一 ...
- java框架面试高频问题(SpringMVC)
1.SpringMVC是什么? 请说出你对它的理解? SpringMVC是Spring将Web层基于MVC封装后的框架. 在没有SpringMVC之前,Web层的Servlet负责的事情很多,很杂. ...
- (四)DQL查询数据(最重点)
4.1 DQL Data Query Language 数据查询语言 1 所有的查询操作都用它 Select 2 简单的查询,复杂的查询它都能做 3 数据库中最核心的语言,最重要的语 ...
- [noi713]魔法
分治,维护一个dp数组,当递归到区间[l,r]时,需要保证这个dp数组维护的是除去[l,r]以外的dp数组维护其实很简单,就是递归左区间是先将右区间加入,然后再将左区间加入(要先复原)然后递归右区间即 ...
- java及python调用RabbitMQ
1,python调用MQ发送消息(生产者),话不多说,直接上干货 import pika 如下图 2.java调用MQ发送消息(生产者) 具体代码如下: python 的代码如下 connection ...
- Python学习手册——第二部分 类型和运算(1)之字符串
Python全景 1.程序由模块构成. 2.模块包含语句. 3.语句包含表达式. 4.表达式建立并处理对象. 在python中数据是以对象的形式出现的!!! 为什么使用内置类型 内置对象使程序更容易编 ...
- Python+selenium之键盘和鼠标事件
- JavaWeb 请求转发重定向
请求转发和重定向 request除了可以作为请求对象之外,还可以作为域对象,但是该域对象的取值范围,是一次请求范围之内(浏览器地址栏没有发生跳转访问别的资源) 作用:将servlet中的数据通过req ...