2017-05-30 47 views
0

我在C++初學者,並得到了困惑在頭聲明爲const指針的初始化。舉個例子,我有我的頭就像一個結構和類:初始化一個const指針結構的C++

/* header file.h */ 
typedef struct A{ ... } A; 

class myClass{ 
    protected: 
     A *const myPtrA; 
} 

,並想以實例myPtrA的內容,例如在一個構造函數,知道是由一個相當複雜的結構子結構,需要動態實例化:

/* source file.cpp */ 
#include file.h 

myClass::myClass() { 
    A *tmpA = new A; 
    *myPtrA = *tmpA; 
} 

這是初始化我的const指針myPtrA的好方法嗎?並且就每個新的呼叫需要專用的刪除呼叫而言,我可以在* myPtrA = * a之後立即刪除我的指針tmpA;沒有丟失myPtrA指向的內容的風險?

預先感謝您爲您的時間(和原諒我的英語;))

qroh

+1

[找到一個很好的入門書(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)和閱讀有關*構造函數初始化列表*。 –

+0

順便說一下,在C++中,'struct'就像一個類,唯一的區別就是默認的可見性(''public'''struct','''''''''private')。這意味着你不需要'typedef'作爲'struct'。 –

+1

'typedef struct A {...} A;''是定義結構的C方式。在C++中,您可以像定義類一樣定義它:''struct A {...};''。 C++中結構和類之間的唯一區別是默認的可見性。 – nefas

回答

1
*myPtrA = *tmpA; 

這是好辦法來初始化我的常量指針myPtrA?

不,您還沒有初始化myPtrA。它是默認初始化的,因此具有不確定的值。取消引用不確定值(*myPtrA)的指針具有未定義的行爲。

我可以在行* myPtrA = * a後立即刪除我的指針tmpA;沒有丟失myPtrA指向的內容的風險?

是的,它是安全的。 myPtrA指向的對象是tmpA指向的對象的副本(通過賦值)。然而,分配一個動態對象,複製它然後在第一時間銷燬它,當你可以直接創建/修改拷貝時,完全沒有意義。

下面是如何正確地初始化構件指針的例子:

class myClass{ 
    protected: 
     A *const myPtrA = new A; 
}; 

PS。學習如何做到這一點很有用,但在實際程序中幾乎不應該手動管理內存。而是使用RAII容器,如std::unique_ptr

+0

非常感謝,非常清楚! 「這是完全沒有意義的分配一個動態對象,複製它,然後它detroy擺在首位」 我同意,但我想,以確保它是毫無意義的;) 再次感謝 – qrohan