C++中局部类的使用
類可以定義在某個函數的內部,我們稱這樣的類為局部類(local class)。局部類定義的類型只在定義它的作用域內可見。和嵌套類不同,局部類的成員受到嚴格控制。局部類的所有成員(包括函數在內)都必須完整定義在類的內部。因此,局部類的作用與嵌套類相比相差很遠。局部類只在函數內部有效,無法在函數外部調用。
在實際編程的過程中,因為局部類的成員必須完整定義在類的內部,所以成員函數的復雜性不可能太高。局部類的成員函數一般只有幾行代碼,否則我們就很難讀懂它了。類似的,在局部類中也不允許聲明靜態數據成員,因為我們沒法定義這樣的成員。在局部類中,可以聲明靜態成員函數。
局部類不能使用函數作用域中的變量:局部類對其外層作用域中名字的訪問權限收到很多限制,局部類只能訪問外層作用域定義的類型名、靜態變量以及枚舉成員。如果局部類定義在某個函數內部,則該函數的普通局部變量不能被該局部類使用。
常規的訪問保護規則對局部類同樣適用:外層函數對局部類的私有成員沒有任何訪問特權。當然,局部類可以將外層函數聲明為友元;或者更常見的情況是局部類將其成員聲明成公有的。在程序中有權訪問局部類的代碼非常有限。局部類已經封裝在函數作用域中,通過信息隱藏進一步封裝就顯得沒什么必要了。
局部類中的名字查找:局部類內部的名字查找次序與其它類相似。在聲明類的成員時,必須先確保用到的名字位于作用域中,然后再使用該名字。定義成員時用到的名字可以出現在類的任意位置。如果某個名字不是局部類的成員,則繼續在外層函數作用域中查找;如果還沒有找到,則在外層函數所在的作用域中查找。
嵌套的局部類:可以在局部類的內部再嵌套一個類。此時,嵌套類的定義可以出現在局部類之外。不過,嵌套類必須定義在與局部類相同的作用域中。局部類內的嵌套類也是一個局部類,必須遵循局部類的各種規定。嵌套類的所有成員都必須定義在嵌套類內部。
下面是從其他文章中copy的測試代碼,詳細內容介紹可以參考對應的reference:
#include "local_class.hpp"
#include <iostream>
#include <vector>
#include <algorithm>namespace local_class_ {
// reference: C++ Primer(Fifth Edition) 19.7
int a{ 0 }, val{ 0 };void foo(int val)
{static int si;enum Loc {a = 1024, b};// Bar is local to foostruct Bar {Loc locVal; // ok: uses a local type nameint barVal;void fooBar(Loc l = a) // ok: default argument si Loc::a{//barVal = val; // error: val is local to foobarVal = ::local_class_::val; // ok: uses a global objectbarVal = si; // ok: uses a static local objectlocVal = b; // ok: use an enumerator}};
}int test_local_class_1()
{return 0;
}// reference: http://www.geeksforgeeks.org/local-class-in-c/
void fun()
{class Test { // local to funpublic:// Fine as the method is defined inside the local classvoid method() {std::cout << "Local Class method() called" << std::endl;}};Test t;t.method();
}
int test_local_class_2()
{fun();return 0;
}/
// reference: http://www.geeksforgeeks.org/local-class-in-c/
void fun2()
{class Test { // local to funpublic:static void method(){std::cout << "Local Class method() called"<<std::endl;}};Test::method();
}
int test_local_class_3()
{fun2();return 0;
}/
// http://www.geeksforgeeks.org/local-class-in-c/
void fun3()
{static int x = -3;enum { i = 1, j = 2 };// Local classclass Test {public:void method() {std::cout << "x = " << x << std::endl; // fine as x is staticstd::cout << "i = " << i << std::endl; // fine as i is enum}};Test t;t.method();
}int test_local_class_4()
{fun3();return 0;
}///
// http://www.geeksforgeeks.org/local-class-in-c/
int x = 11;void fun4()
{// First Local classclass Test1 {public:Test1() { std::cout << "Test1::Test1()" << std::endl; }};// Second Local classclass Test2 {// Fine: A local class can use other local classes of same functionTest1 t1;public:void method() {// Fine: Local class member methods can access global variables.std::cout << "x = " << x << std::endl;}};Test2 t;t.method();
}int test_local_class_5()
{fun4();return 0;
}/
// reference: https://stackoverflow.com/questions/3235172/local-classes-in-c
int pqr()
{class abc {int x;public:abc() : x(4) { }friend int pqr();};return abc().x;
}int test_local_class_6()
{std::cout << "Return " << pqr() << std::endl;return 0;
}//
// reference: https://www.hscripts.com/tutorials/cpp/local-classes.php
int y;
void g()
{class local {public:void put(int n) { ::local_class_::y = n; }int get() { return ::local_class_::y; }} ab;ab.put(20);std::cout << "The value assigned to y is::" << ab.get() << std::endl;
}int test_local_class_7()
{g();return 0;
}//
// reference: http://en.cppreference.com/w/cpp/language/class
int test_local_class_8()
{struct Local {bool operator()(int n, int m) {return n > m;}};std::vector<int> v{ 1, 2, 3 };std::sort(v.begin(), v.end(), Local()); // since C++11for (int n : v) std::cout << n << ' ';std::cout << std::endl;return 0;
}} // namespace local_class_
GitHub:? https://github.com/fengbingchun/Messy_Test
總結
以上是生活随笔為你收集整理的C++中局部类的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu14.04上安装Tensor
- 下一篇: C++中嵌套类的使用