2012-02-25 424 views
-4

1.使用 - >例如test->名稱與test.name相同?2初學者有關C++的問題

2.頭文件用於什麼?我習慣於其他編程語言,如java,你只需要一個文件(類文件)。我們是否需要使用頭文件來聲明所有的東西?

+10

這兩個問題將在任的前幾章來回答[體面的入門書對C++](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and -list)。 – 2012-02-25 16:48:29

+3

以及我沒有書 – John 2012-02-25 16:48:53

+1

@OliCharlesworth他所說的其實是我聽過的最好的迴應... – 2012-02-25 16:51:21

回答

1

那麼,我會試着用簡單的方式來解釋一下,讓初學者更容易理解。

  1. 是的,它和點一樣,但它用於指針。

    MyClass a; 
    a.myMethod(); 
    
    MyClass* b = new MyClass; 
    b->myMethod(); 
    delete b; 
    

    a和b都調用相同的方法,但a分配在堆中,b是由new分配的指針。內存的顯式分配應該總是被解除分配(因此刪除B語句)。 這實際上是一個簡化,箭頭所做的是取消引用指針並將點操作符稱爲它。如果現在讓你的頭腦轉動,現在就做簡單的解釋,隨着你變得更加習慣於語言,它會沉下去。

  2. 頭文件不是強制性的,但它們是有用的,用於引用在另一個翻譯單元中聲明的內容。因此,例如,您可以在頭文件中聲明MyClass,而不用在myfilea.cpp和myfileb.cpp中使用MyClass,而不必多次聲明它。

    要正確理解,你需要知道,當你使用像語句的頭文件:

    #include "myheader.h" 
    

    編譯器的預處理程序所做的什麼是副本和myheader.h的所有內容粘貼到它包含的文件。由於編譯器在讓你使用它們之前需要知道類型(通常是類),所以在每個文件中你需要「重新聲明類型是什麼」。 實際上,實際上可能在頭文件中實現所有內容,類似於Java代碼,然後在一個main.cpp文件中包含這些文件,但代碼編譯所需的時間會更長,而且會更難跟隨。

+0

a不太可能在堆上分配。 – tinman 2012-02-25 17:15:15

+0

有時需要將定義與聲明分開。例如,在循環模式下,即如果'A'需要''B實例並且'B'需要''A'實例,那麼除了將實現從聲明中分離出來以避免類似雙重定義和用法的錯誤之外別無選擇不完整的類型。 – netcoder 2012-02-25 18:27:38

1

structure->member

(*structure).member

等效因此,它是一個快捷方式。它取消引用指針structure並訪問構件member

+0

爲什麼在括號中是結構? – John 2012-02-25 16:51:13

+0

它們是括號,用於操作順序。 – nerozehl 2012-02-25 16:51:49

+1

@jeremyskateboard:你可能*應該*得到一本書... – netcoder 2012-02-25 16:52:24

4
  1. a->b相同(*a).ba是一個指針。對於同樣的事情,這只是方便的語法。當a是一個類時,它調用該類的operator->作爲調用對象,其中a。如果你不明白這一點,那麼不用擔心,當你進一步使用C++時,你會的。
  2. 頭文件包含聲明,而.cpp文件包含定義。當你想編寫可以從其他文件使用的函數時,你需要它們。這是因爲您可以根據需要對結構(即變量,函數,類等)進行儘可能多的聲明,但只能使用該結構的一個定義。頭文件包含在代碼中的很多地方(通過每個需要使用它的實現提供的工具的文件),併爲包含它們的每個.cpp文件編譯一次,所以它不會放置任何你只能擁有一個在頭文件中。實現文件(.cpp或.c文件)只爲整個程序編譯一次,所以它們是實現的正確位置(只能有一個)。頭文件也是爲了方便實現和界面的分離。

但是,所有這些問題都可以通過一本好的C++書來解答,所以請在購買之前仔細閱讀,這會節省很多時間和頭痛。

+0

(* a)表示:D – UmNyobe 2012-02-25 16:53:23

+0

@UmNyobe如果'a'是一個類實例,當'a'是一個指針或者調用'operator *'時,它將指針'a'解引用。 – 2012-02-25 16:54:01

+1

謝謝seth。我在拖釣,但如果他不知道什麼是 - >意思,也許他也不知道* a。 – UmNyobe 2012-02-25 16:55:21

0

我想你需要閱讀一本關於C++和C的書,' - >'與''不一樣。但幾乎和頭文件都與編譯器和內存佈局有關。 C++比Java更關注實際的機器,這意味着你必須以不同的方式思考編程。

我推薦閱讀Bjarne Staustrups關於C++的書,或者至少瀏覽它。如果C++只是帶有其他語法的Java,那麼就沒有理由去發明Java了 - 每種語言都有它們的應用程序,並且在開始使用它之前,您需要了解語言的含義。 :-)

1

1)「箭頭」操作符->一樣的操作.,但是當你使用快捷方式指向結構,而不僅僅是結構。見this explanation,例如:

struct Point { 
    int x; 
    int y; 
}; 

Point* p;  // p points to a Point struct 

p = new Point; 
p->x = 12;  // This is an useful shortcut for... 
(*p).x = 12; // .. this 

2)關於頭文件,它們是沒有必要的,你還可以在.c文件的開頭添加的聲明,但它是有聲明和實際代碼很有用的約定分隔。

0
std::string str("foo"); 
std::string *str_p=new std::string("bar"); /
//Please use smart pointers in real code 
std::cout << str.size() << " " << str_p->size(); 

所以基本上-> deferences指針比訪問類型的成員。

據equivelent太

(*str_p).size(); 

這裏str_p首先手動解除引用然後大小成員函數調用。

0
  1. test->name完全等於(*test).name,不test.name
  2. 正在使用的頭包括許多翻譯單元相同的定義,爪哇不要使用它們,因爲從來沒有被要求的定義,所有的對象都是使用指針。

請看下面的例子:

class A 
{ 
    B member; 
}; 

如果不包括B的定義,你可以不知道A級在java中的大小,member將是一個指針,所以這是無用。