freelsn / notes

0 stars 0 forks source link

C++ 面向对象特性 #5

Open freelsn opened 1 year ago

freelsn commented 1 year ago

复制构造函数与移动构造函数

class Test {
public:
    Test(): m_ptr(new int(3)) {}
    ~Test() { if (m_ptr != nullptr) {delete m_ptr;} }
    Test(const Test &obj)  // 深拷贝
    {
        m_ptr = new int(0);
        if (obj.m_ptr != nullptr) {
            *m_ptr = *obj.m_ptr;
        }
    }
    Test(Test &&obj): m_ptr(obj.m_ptr) { obj.m_ptr = nullptr; }
private:
    int *m_ptr;
};

Test func1() { return Test(); }
void func2(Test obj) {}

int main()
{
    Test obj1;
    func2(obj1);  // 复制
    Test obj2 = func1();  // 移动
    Test obj3(obj1);  // 复制
    return 0;
}

复制构造函数:

移动构造函数:

freelsn commented 1 year ago

类的构造与析构

class Student {
public:
    Student();
    explicit Student(uint32_t id);
    Student(uint32_t id, uint32_t age);
    Student(char id) = delete;
    void setId(uint32_t id) { m_id = id; }
    uint32_t getId() { return m_id; }
private:
    uint32_t m_id = 0;
    uint32_t m_age;
}

Student::Student(uint32_t id, uint32_t age)
    : m_id(id), m_age(age) {}

Student::Student(): Student(0, 18) {}  // 委托

Student::Student(uint32_t id): Student(id, 18) {}

void foo(Student stud) {}

int main()
{
    Student stud1;
    Student stud3(1);
    Student stud4(1, 19);
    uint32_t id = 4;
    foo(id);  // wrong
    return 0;
}