初始化和赋值对内置类型的成员没有什么大的区别,像任一个构造函数都可以。但有的时候必须用带有初始化列表的构造函数:
(2) const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
还有一个赋值次数,效率上的区别:
初始化参数列表在对象初始化时对成员变量赋值一次,
构造函数内直接赋值,对成员变量赋值两次,一次是对象构造是用默认值进行赋值,第二次是调用构造函数赋值
显然使用 构造函数初始化列表 的方式得到更高的效率
举例:
class Food
{
public:
Food(int type = 10)
{
m_type = 10;
}
Food(Food &other) //拷贝构造函数
{
m_type = other.m_type;
}
Food & operator =(Food &other) //重载赋值=函数
{
m_type = other.m_type;
return *this;
}
private:
int m_type;
};
(1)构造函数赋值方式 初始化成员对象m_food
class Dog: public Animal
{
public:
Dog(Food &food)
//:m_food(food)
{
m_food = food; //初始化 成员对象
}
private:
Food m_food;
};
//使用
Food fd;
Dog dog(fd); //
Dog dog(fd);结果:
先执行了 对象类型构造函数Food(int type = 10)——>
然后在执行 对象类型构造函数Food & operator =(Food &other)
想象是为什么?
(2)构造函数初始化列表方式
class Dog: public Animal
{
public:
Dog(Food &food)
:m_food(food) //初始化 成员对象
{
//m_food = food;
}
private:
Food m_food;
};
//使用
Food fd;
Dog dog(fd); //
Dog dog(fd);结果:执行Food(Food &other)拷贝构造函数完成初始化