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; }

 

posted on 2022-11-28 16:06  新西兰程序员  阅读(89)  评论(0编辑  收藏  举报