2019.1.11 c++學習錯誤和問題總結
阿新 • • 發佈:2019-01-13
1.error: ‘std::ostream& lacksDMA::operator<<(std::ostream&, const lacksDMA&)’ must take exactly one argument|
這種錯誤一般是由於在寫類的友元函式實現時,在函式名前誤加類的解析運算子(::)導致的,如下:
std::ostream& lacksDMA::operator<<(std::ostream& os, const lacksDMA &rs)//成員函式的運算子過載一般只有一個引數,而友元函式才有可能多個 { //所以這裡應該去掉lackDMA:: os << (const baseDMA&)rs; os << "Color: " << rs.color << std::endl; return os; }
2.在派生類中過載’<<‘時,要輸出基類的內容,需要用到強制轉換,將派生類強制轉換成基類,然後利用基類的運算子’<<'過載
std::ostream& operator<<(std::ostream& os, const lacksDMA &rs) { os << (const baseDMA&)rs;//強制型別轉換,如果不轉換會遞迴 //這裡不能用作用域解析運算子,因為基類的輸出函式不是成員函式而是友元 os << "Color: " << rs.color << std::endl; return os; }
3.在寫派生類的拷貝建構函式時,對基類部分的初始化注意使用列表初始化的方法。
hasDMA::hasDMA(const hasDMA& hs):baseDMA(hs)//正確
{
... ... .. ..
}
hasDMA::hasDMA(const hasDMA& hs)
{
baseDMA::baseDMA(hs);//錯誤
int len = strlen(hs.style);
style = new char[len+1];
strcpy(style, hs.style);
}
4.string類的新學的方法
string label; label.c_str();//將string物件轉換為c風格字串
5.疑問:一般當類中有動態記憶體分配(DMA)時才寫拷貝構造、複製構造、解構函式。沒有(DMA)時,自動生成的函式就可以搞定,問題,包含c風格字串陣列的類,自動生成的複製建構函式是怎麼搞定的?