標籤:

C++中的struct?

想問一下,下面定義的兩個結構體Book和Booky有什麼區別?

typedef struct Book
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Booky;

平台:windows 7,64位

編譯器:g++ (GCC) 5.3.0


實際上是有區別的,不過自己寫代碼還是不要利用這種東西為好:你可以再定義一個名為 Book 的函數,但沒法再定義一個名為 Booky 的函數。

typedef struct Book {
// whatever
} Booky;

void Book(); // OK
void Booky(); // Error: 重定義

在 Book 成功變成一個函數後,如果還想用以前的 Book,那麼就得學 C 語言寫 struct Book 了。

p.s. 類名、枚舉名亦然。

p.p.s. 實際上這裡發生的事情是函數名 Book 隱藏了結構體名 Book。

---

究其原因,是因為 C 語言中 struct Book 是定義了一個名叫 Book 的 tag name,它和其它類型的標識符是分屬不同的命名空間的,所以這種 C 代碼是合情合理的:

int status();
struct status;

所以,這又是一個 C++ 為了兼容 C 語言搞出來的黑暗角落。


基本如 @邱昊宇 所說

本質上來說,不應該有不同。

但是現實是骨感的。

c裡面的結構體是什麼樣子?

struct Book book;

每次用的時候,我們都要加上struct前綴。

為了避免這個,我們定義的時候每次都用typedef。

但是有了這個struct 前綴,從語法上就可以顯式的區分一個struct和一個非struct了,所以你不會有重名的問題,別的類型跟struct重名也沒關係。

c++里可不支持你這麼干,c++ struct 聲明變數的時候不需要加struct前綴。

那為了兼容那隻好。。。

所以寫c++就按c++的風格寫,要把它跟c當成兩種完全不同的語言來對待,他們只是長得像罷了。


C++里的struct跟class幾乎是完全等同的——區別僅僅在於如果你什麼訪問標識都不寫的話,那麼你在class里定義的成員都是private的,而在struct里的成員則是public

所以這裡你直接自動把struct腦補成class再來看看代碼……


首先,在C++裡面是沒有區別的。

在C語言時代,實例化一個結構體必須要加上關鍵字struct,也就是假如你有個結構體 struct A{}那麼你必須這樣: struct A a;

因此為了減少多打一個struct,我們可以把struct A來typedef一下,如:typedef struct _A {} A,這樣你就可以直接使用A來定義變數了。

C++裡面則沒有這樣的規定。


這樣定義了兩個類型

一個是 struct Book 注意struct不能省

另一個是 Booky

在C語言中 struct Book 才是一個完整類型名

而 Booky也是。

在cpp中 聲明變數時struct可以省略


乃用 C 語言的話就可以這樣寫:

Booky x; // 不用加struct後綴

這個代碼在 C++ 里也能用,這樣可能是為了少寫代碼?


我一般這樣寫

typedef struct

{

int a;

}Block;


C++中struct就是class,區別在於class默認成員private,stuct默認成員public。

typedef只是給Book一個別名Booky。

有區別的是C。


有區別嗎?

typedef意思就是給同一個類型取兩個名字

就比如說你既叫張三,又叫張四,但本質上還是同一個你


推薦閱讀:

如何快速入門UE4開發?
關於 《C++ Primer 5th》,使用了「 =default 」的默認構造函數相關問題?
內存池除了減少內存申請和釋放的開銷之外還有什麼提升性能或者方便之處?
為什麼c++不能把「= [] () ->」操作符重載為非成員函數?
為什麼這些年c語言統治了幾乎所有方面?

TAG:C | 編譯器 |