1. 程式人生 > >2019.1.11 c++學習錯誤和問題總結

2019.1.11 c++學習錯誤和問題總結

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風格字串陣列的類,自動生成的複製建構函式是怎麼搞定的?