1.大家在定义一个动态类对象时,使用的都是new,而不用malloc,为什么?
【解析】:
malloc,free无法满足动态对象的要求,他们不能像new,delete和new,delete[]自动调用对象的构造函数和析构函数.
2.结构体和类的区别?
【解析】:
(1.)class的默认成员变量是私有的private,struct默认是公有的public
(2.)class 有成员函数,struct没有成员函数
(3.)他们各自对象的大小sizeof(class/struct),他们都遵循下面三条原则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
But:1)类中成员变量是引用&时,会把他么当成指针处理,比如:double &m_db;此时占据的大小为4
2)static成员变量,占据的公共空间,对单个对象大小没有影响,大小为0
3.什么情况下显示定义复制构造函数?
【解析】:
如果类中含有指针型的数据成员、需要使用动态内存,程序员最好显式定义自己的复制构造函数,避免各种可能出现的内存错误。
computer(const computer &cp) //自定义复制构造函数
{
//重新为brand开辟和cp.brand同等大小的动态内存
brand = new char[strlen(cp.brand) + 1];
strcpy(brand, cp.brand); //字符串复制
price = cp.price;
}
4.初始化列表中的顺序要和变量声明的顺序一致?
【解析】:
class CTotal
{
private:
int m_iy;
int m_ix;
public:
CTotal(int x=0):m_ix(x),m_iy(m_ix)
{}
};定义一个对象CTotal tol(1);打印出两个变量的值,就会发现m_iy=无穷大,m_ix=1,因为传给m_iy时m_ix还没有值。
【纠正:】上一篇中const对象除了可以访问const成员函数,也可以访问非const析构函数