2013-08-26 72 views
0

我是學生,學習C++併發編程。我想知道如何通過我的C++程序訪問功能圖形卡芯片和聲卡芯片。是否有另一種方式來連接各自的驅動程序和我的應用程序,而無需使用外部庫,如OpenGL,Op​​enAL等。您可以通過示例簡要描述解決方案。 謝謝。如何直接從C++訪問GPU和SoundCard芯片的功能?

+0

我通過這個網站消失了: http://duramecho.com/ComputerInformation/WhyHowCppConst .html 但無法掌握我想要的確切想法。需要更好地解釋如何將這些「const」關鍵字適當地放在每個地方,以及它如何影響程序效率。 –

+4

我對自己有一個簡單的規則:當有些東西我不需要改變,那麼我使用'const'。 –

+0

也許你應該說*你認爲這個詞的意思,然後在上面的每個用法中意味着什麼。畢竟,你只是通過一個教程。你從中學到了什麼? – WhozCraig

回答

11
const int * const function_name(const int * point) const; 
//(1)  (2)     (3)    (4) 

第一個防止返回的指針被用來修改函數正在訪問的任何數據。這很好(除非你想修改它),因爲它可以防止共享數據的意外修改。

第二個阻止調用者修改返回的指針。這在返回內置類型(如指針)時不起作用,並且在返回類類型時可能很糟糕,因爲它禁止移動語義。

第三個阻止函數修改數據。由於與第一個相同的原因,這是很好的(適當的時候)。

第四種防止函數修改對象的(不可變)狀態。這是很好的(適當時),因爲它允許在const對象上調用該函數,並且使得更容易跟蹤對象何時可能改變。

const int * const Functiontwo(const int * const &) const; 
//          (5) 

這裏唯一的新東西是通過const參考傳遞指針。這樣做沒有意義;按值傳遞給出了相同的語義,並且不那麼冗長,可能更有效。通過const參考可以比通過價值傳遞更大的類型是大型或昂貴的複製。

細微變化是通過一個const值:

const int * const Functiontwo(const int * const) const; 
//          (6) 

這是不感興趣的呼叫者(實際上,該功能可以在有或沒有它被聲明不改變的含義);所以沒有必要把它放在聲明上,就在的定義上。這意味着指針在函數內不能改變。這可能是好的(正如可以聲明局部變量const),因爲它可以使函數實現更容易遵循。

+0

非常感謝// bro非常。 –

+0

最後一個例子:因爲這實際上是一個函數*聲明*,所以參數的最高級別const根本沒有意義。函數* definition *可以保留或添加頂級const,因爲它認爲合適。 –

+0

@ArneMertz:確實;我已經更新,更明確地說,在聲明中放置頂級'const'沒有意義。 –

1

const一個成員函數之後意味着該函數不修改父對象的狀態:

struct foo 
{ 
    int bar() const; // does not modify the instance of foo 
    int & bar(); // might modify the instance of foo 
}; 

在您的例子的函數返回

int const * const 

第一const裝置,該你指出的int一定不能改變;你告訴你的用戶他可能會讀取這個值,但不能修改它。這也是相關const -correctness:

int const * foo() const; // can be used from const functions 
int * foo(); // cannot be used from const function 

第二const意味着指針本身是const,即:

int * ptr = &a; 
*ptr = 42; // valid 
ptr = &b; // valid 

int const * ptr = &a; 
*ptr = 42; // INVALID 
ptr = &b; // valid 

int * ptr const = &a; 
*ptr = 42; // valid 
ptr = &b; // INVALID 

int const * ptr const = &a; 
*ptr = 42; // INVALID 
ptr = &b; // INVALID 

使得指針本身const作爲返回值從函數幾乎非常有用。

對於參考文獻,C++ 03的快速指南是如果您想要修改對象並希望修改保持不變,您希望通過引用傳遞;如果要修改對象但不想修改爲粘貼(複製),或者(例外!),如果您傳遞的值是POD類型,則按值傳遞值;您通過恆定的參考,如果你不需要修改非POD類型,從而節省自己的拷貝費用:

void foo(int & a); // changes to a are applied to a itself, no copy made 
void foo(int a); // changes to a are applied to a copy of a, copy made 
void foo(std::string const & a); // no changes allowed, no copy made