对象的初始化

1.使用对象前需要确保对象已经初始化

初始化和赋值

class PhoneNumber
{

};

class ABEntry
{
public:
ABEntry(std::string name, std::string address, std::list<PhoneNumber>& phone, int num);
private:
std::string mName;
std::string mAddress;

std::list<PhoneNumber> mPhones;
int mNumTimeConsulted;

};

// 赋值
ABEntry::ABEntry(std::string name, std::string address, std::list<PhoneNumber>& phone, int num)
{
mName = name;
mAddress = address;
mPhones = phone;
mNumTimeConsulted = num;
}

以上操作都是进行赋值操作,而不是初始化,这样能够带来你想要的成员变量的值,但是C++有更好的办法

初始化发生的阶段比较早,一般是在进入构造函数本地之前,所以更好的做法就是使用初始化模板

ABEntry::ABEntry(std::string name, std::string address, std::list<PhoneNumber>& phone, int num)
: mName(name),mAddress(address),mPhones(phone),mNumTimeConsulted(num)
{

}

这种做法的结果和上面的赋值操作是相同,但是相率更高,赋值操作需要调用进入构造函数本体里面进行操作,刚好初始化模板就避免了这个问题

2.构造析构和赋值

每一个所写的类都有一个或者多个默认构造函数,析构函数,copy assignment操作符

为了避免编译器为我们自动生成一些不是期待的相关函数,应该直接定义相关函数,拒绝编译器自动生成相关的函数

不要在构造函数和析构函数调用virtual相关的函数

class Transaction
{
public:
Transaction();
virtual void logTransaction() const = 0;
};


class BuyTransaction : public Transaction
{
public:
virtual void logTransaction() const;
};

class SellTransaction : public Transaction
{
public:
virtual void logTransaction() const;
};

Transaction::Transaction()
{
logTransaction();
}

BuyTransaction b; // 会发生什么?

C++对象初始化_初始化

C++对象初始化_初始化_02