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风格字符串数组的类,自动生成的复制构造函数是怎么搞定的?

猜你喜欢

转载自blog.csdn.net/weixin_43233774/article/details/86411682