在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.区分初始化和赋值
View Code
/** * @file Main.cpp */ #include <iostream> using std::cout; using std::endl; class CDummy { public: CDummy(void); CDummy(const CDummy& dummy); CDummy& operator=(const CDummy& dummy); }; CDummy::CDummy() { cout << "无参构造" << endl; } CDummy::CDummy(const CDummy& /*dummy*/) { cout << "复制构造" << endl; } CDummy& CDummy::operator=(const CDummy& /*dummy*/) { cout << "赋值操作" << endl; return *this; } int main(int argc, char* argv[]) { CDummy d1; //初始化,无参构造函数被调用 CDummy d2 = d1; //初始化,复制构造函数被调用 CDummy d3; //初始化,无参构造函数被调用 d3 = d1; //赋值,operator=操作符函数被调用 return 0; } 另外要注意,在赋值时被赋值对象已经有值,因此可能需要对原值做适当处理,特别是资源的归还和重新申请等等。在这方面,String类的operator=操作符函数的实现是典型例子。
View Code
class PhoneNumber { }; class AddressBookEntry { public: AddressBookEntry(const string& name, const string& address, const list<PhoneNumber>& phones); private: string _name; string _address; list<PhoneNumber> _phones; }; AddressBookEntry::AddressBookEntry(const string& name, const string& address, const list<PhoneNumber>& phones) { _name = name; //这些都是赋值,而非初始化 _address = address; _phones = phones; } C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。在AddressBookEntry构造函数内,_name,_address,_phones都不是被初始化,而是被赋值。初始化的发生时间更早,发生于这些成员的default构造函数被自动调用之时(比进入AddressBookEntry构造函数本体的时间更早)。
View Code
AddressBookEntry::AddressBookEntry(const string& name, const string& address, const list<PhoneNumber>& phones) :_name(name), //现在,这些都是初始化 _address(address), _phones(phones) { } 赋值的那个版本先调用default构造函数然后再调用operator=操作符函数;而成员初始化列表的那个版本只调用一次copy构造函数,是比较高效的,有时甚至高效得多。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论