c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了
我有相當(dāng)長的一段時(shí)間(數(shù)月)沒有更新文章了。
并不是我放棄了寫技術(shù)文章,而是因?yàn)檫@段時(shí)間,我把精力主要放在了圖像智能算法的學(xué)習(xí)上了。去年12月時(shí),我對(duì)圖像智能算法還懵懵懂懂,做著 Linux 嵌入式應(yīng)用程序開發(fā),現(xiàn)在我已經(jīng)正式入職到算法公司了,收入翻了一番,哈哈,不過累了好多。廢話就到這里,我的轉(zhuǎn)行辛酸史,以后再詳談。
轉(zhuǎn)行啦
坦誠的說,就編程語言而言,因?yàn)橐恢痹谧?Linux 嵌入式程序開發(fā)的緣故,我對(duì)C語言更加了解一點(diǎn),讀者應(yīng)該能夠發(fā)現(xiàn),我之前的大部分文章都是關(guān)于C語言的。不過現(xiàn)在做算法,C++更加適合。C++和C語言雖然很像,但是在細(xì)節(jié)上還是有所區(qū)別的。今天閱讀前輩同事的代碼時(shí),注意到了 struct 關(guān)鍵字,這個(gè)關(guān)鍵字在C++中做了不少擴(kuò)展。本文將嘗試做下總結(jié)。
C語言與C++中的struct
struct關(guān)鍵字是C語言中非常重要的關(guān)鍵字,在實(shí)際的C語言程序開發(fā)中,struct 不僅可以用于封裝各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu),還能夠?qū)崿F(xiàn)一些開發(fā)技巧——比如輔助數(shù)組賦值、模擬類等等,這些我之前的文章都討論過。C++不僅保留了C語言中 struct 的功能,還做了不少擴(kuò)展,具體的可以通過下面這個(gè)表說明:
struct在C語言和C++中的區(qū)別
請(qǐng)看下面這段C++代碼示例,我們首先使用 struct 定義了 S1,接著又定義了 S2,S2 繼承了 S1,因此我們可以在 test2 中使用 S1 中定義的成員 a、b。同時(shí)也可以看出,C++中的 struct 還可以定義成員函數(shù),包括構(gòu)造函數(shù)和析構(gòu)函數(shù)。
#include using namespace std;struct S1 { int a; int b; S1() { a = 1; b = 2; } void print_mem() { cout << "a = "<< a << ", b = "<C++ 中的 struct 和 class 關(guān)鍵字從上面的例子不難看出,C++中的 struct 除了像C語言那樣可以定義數(shù)據(jù)結(jié)構(gòu)外,還可以像 class 關(guān)鍵字那樣定義成員函數(shù)。不過,二者是有區(qū)別的。
成員的默認(rèn)訪問控制屬性
首先,struct 默認(rèn)的訪問控制屬性是 public,而 class 默認(rèn)的訪問控制屬性是 private,這一點(diǎn)可以通過下面這段C++代碼示例看出:
struct A { int a;};class B { int b;};A ta;ta.a = 1; // 沒有問題B tb;tb.b = 2; // 編譯報(bào)錯(cuò)繼承的默認(rèn)訪問控制屬性
類似的,在繼承的過程中,struct 和 class 關(guān)鍵字的默認(rèn)訪問控制屬性也是有所區(qū)別的:struct 默認(rèn) public,class 默認(rèn) private,例如下面這段C++ 代碼:
struct A { int a;};struct B: A { int b;};B tb;tb.a = 1; // 正常這是沒有問題的,對(duì)象 tb 可以訪問由 A 繼承而來的成員 a。但是如果將 B 的 struct 改為 class,也即:
struct A { int a;};class B: A { int b;};B tb;tb.a = 1; // 編譯報(bào)錯(cuò)此時(shí)編譯就會(huì)報(bào)錯(cuò),提示“‘int A::a’ is inaccessible”,因?yàn)?class 的默認(rèn)繼承屬性為 private。現(xiàn)在我們將 A 的 struct 修改為 class,B 的 class 再改回 struct,會(huì)發(fā)現(xiàn),對(duì)象 tb 依然能夠正常訪問成員 a:
class A {public: int a;};struct B: A { int b;};B tb;tb.a = 1; // 正常應(yīng)注意,這里的討論重點(diǎn)是繼承的默認(rèn)訪問控制屬性,因此我們將 A 中的 a 定義為 public 的。
可以看出,當(dāng) class 和 struct 混合使用時(shí),默認(rèn)的訪問控制屬性由子類決定,而不是由基類決定。不過,依賴默認(rèn)屬性不是特別清晰的寫法,在實(shí)際的C++程序開發(fā)中,更推薦的做法是指明繼承的方式:
class B: private A { ...};class B: public A { ...};定義模板
相較于C語言,C++還能夠定義模板函數(shù),請(qǐng)看下面這段代碼示例:
template void fun(T num) { cout << "num = " << num << endl;} fun(1); // num = 1fun(1.01); // num = 1.01在一些開源工程中,我還發(fā)現(xiàn)過有使用 class 定義模板函數(shù)的,也即使用class替換typename關(guān)鍵字:
template void fun(T num) { cout << "num = " << num << endl;}這種定義方式和上面使用typename的定義方式完全相同,但是 struct 就不能用于定義模板函數(shù),如果讀者嘗試了,應(yīng)該會(huì)得到編譯報(bào)錯(cuò)的結(jié)果。
小結(jié)
本文先是討論了 struct 關(guān)鍵字在C語言和C++中的不同,不難發(fā)現(xiàn),C++對(duì) struct 關(guān)鍵字是做了不少擴(kuò)充的,這些擴(kuò)充讓 struct 看起來更像是 class 關(guān)鍵字。事實(shí)上,我認(rèn)為就單純C++來說,class 關(guān)鍵字是完全可以取代 struct 的,C++ 仍然保留著 struct 關(guān)鍵字,其中一個(gè)重要原因就是兼容C語言。既然保留了 struct 關(guān)鍵字,總不能讓它完全等價(jià)于 class,因此二者在一些細(xì)節(jié)上有區(qū)別,這些輕微的區(qū)別往往能夠針對(duì)不同的需求提供不同的方便:struct 更適合封裝數(shù)據(jù)結(jié)構(gòu),class 則更適合封裝對(duì)象。
總結(jié)
以上是生活随笔為你收集整理的c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机接电信光猫无法上网,电信光猫上网设
- 下一篇: Debian sequeeze编译cor