C++中的几种构造函数和析构函数
本篇文章,我们来了解一下C++中的几种构造函数,以及析构函数
#include <format> #include <iostream> #include <string> using std::format; using std::cout; using std::string; const string unk {"unknown"}; const string clone_prefix {"clone-"}; // -- interface -- class Animal { string a_type {}; string a_name {}; string a_sound {}; public: Animal(); // default constructor 这个是默认构造函数 Animal(const string& type, const string& name, const string& sound); //带参数的构造函数 Animal(const Animal&); // copy constructor copy构造函数 ~Animal(); // destructor Animal& operator = (const Animal&); // copy/assignment operator copy/assignment操作符 void print() const; }; // -- implementation -- 默认构造函数的实现 Animal::Animal() : a_type(unk), a_name(unk), a_sound(unk) { cout << "default constructor\n"; }
// 带参数构造函数的实现 Animal::Animal(const string& type, const string& name, const string& sound) : a_type(type), a_name(name), a_sound(sound) { cout << "constructor with arguments\n"; } // copy构造函数的实现 Animal::Animal(const Animal& a) { cout << "copy constructor\n"; a_name = clone_prefix + a.a_name; a_type = a.a_type; a_sound = a.a_sound; }
// 析构函数的实现 Animal::~Animal() { cout << format("destructor: {} the {}\n", a_name, a_type); }
// copy/assignment 操作符的实现 Animal& Animal::operator = (const Animal& o) { cout << "assignment operator\n"; if(this != &o) { // this在这里代表当前对象current object, 判断传入的Animal对象的地址和this当前对象不是同一个地址,也就是说不是同一个对象,否则 避免同一个对象进行copy a_name = clone_prefix + o.a_name; a_type = o.a_type; a_sound = o.a_sound; } return *this; //D-reference当前对象,进行返回 } void Animal::print () const { cout << format("{} the {} says {}\n", a_name, a_type, a_sound); } int main() { Animal a {}; a.print(); const Animal b("goat", "bob", "baah"); b.print(); const Animal c = b; //这里用的就是copy 的构造函数,注意是这种写法,而不是 const Animal c(&b); =>不确定是否可以这样写 c.print(); a = c; //这里用的就是copy/assiganment 操作符 a.print(); cout << "end of main\n"; return 0; }