2010-06-06 62 views
1

這真的開始混淆了我的地獄。我什麼時候使用它們?我什麼時候使用它們?何時使用()與類?

struct CarPart 
{ 
    long PartNumber; 
    char Partname[40]; 
    double UnitPrice; 

    CarPart *next; 
}; 

class ListOfParts 
{ 
    int size; 

public: 
    CarPart *head; 

    ListOfParts(); 
    ~ListOfParts(); 

    const int count() const; 
    void insert(CarPart *item); 
    CarPart *retrieve(int pos); 
}; 

有了這個代碼,爲什麼我可以寫

ListOfParts *pPart = new ListOfParts(); 
CarPart *pCarPart = new CarPart; 

聲明ListOfParts的一個實例,需要:

比如我上鍊表,其類的聲明是讀一個.cpp (),但不是我的CarPart?這讓我感到困惑。當我之前問過一個問題時,人們告訴我這樣的聲明是一個返回ListOfParts對象的函數,但不是實際的構造函數。所以我猜這還是不一樣的。

這裏發生了什麼?

PS:我是否正確地認爲count()的右邊的const意味着我無法修改count中的任何值?

+1

重複的(http://stackoverflow.com/questions/620137/do-the-parentheses -after-the-type-name-make-a-with-new) – 2010-06-06 14:31:17

+0

感謝您的鏈接! – IAE 2010-06-06 14:42:20

回答

9

在堆上分配時聲明ListOfParts類的實例並不需要()。這兩種形式都是有效的:

ListOfParts *pPart1 = new ListOfParts(); 
ListOfParts *pPart2 = new ListOfParts; 

編輯:正如評論者所指出的那樣,it makes a difference初始化一個POD type(但是是是不相關的代碼示例)時。

但是,聲明棧變量或靜態變量時,它很重要,因爲()的表單與聲明函數相同。

ListOfParts pPart1(); // a function prototype 
ListOfParts pPart2; // a object construction 

constcount()權意味着你不能修改任何值在這個函數當前對象,這將是this->sizethis->head內(注意,你仍然可以改變的對象指出head) 。

+0

那麼兩者之間沒有什麼不同?一點都沒有? – IAE 2010-06-06 14:09:13

+0

@SoulBeaver,什麼都不是。 – 2010-06-06 14:10:12

+4

POD類型有所不同 - 帶圓括號的版本將零初始化對象。 – avakar 2010-06-06 14:14:15

1

至於你的帖子scriptum:是的,這意味着當你在ListOfParts實例上調用count()時,你不能修改任何實例成員變量。除非他們被宣佈爲mutable

2

由於它被寫,你可以使用這兩個版本,有和沒有()

ListOfParts *pPart = new ListOfParts(); 

等同於:

ListOfParts *pPart = new ListOfParts; 

從對方的回答無恥複製:Excep POD

聲明中的修飾符const表示:

  1. 除非聲明爲mutable,否則不能修改此類的任何變量。

  2. 當對象爲const時,可以將其稱爲此方法。

嘗試:[?難道類型名稱後括號做出了新的差異]

#include <iostream> 

class test 
{ 
    void testf() { 
      std::cout << "void test();" << std::endl; 
    } 

    void testf() const { 
      std::cout << "void test() const;" << std::endl; 
    } 
}; 

int main() { 
     test t; 
     t.testf(); 
     const test &t2 = t; 
     t2.testf(); 
} 
+0

非法的功能風格演員。這可能相當有見地,但我不完全確定你在做什麼。你怎麼能把測試本身作爲一個測試對象的方法?此外,兩人都給了我我提到的那個錯誤。這是正常的嗎? – IAE 2010-06-06 14:29:51

+0

固定。對不起 - 我做了一個小的拼寫錯誤,我固定在磁盤上,但我沒有'端口'在這裏。 – 2010-06-06 15:28:52