SRM Vision 暑期培训

by Leozheng @ SRMVision

§5  对象的生命周期

#include <iostream>
using namespace std;
class Foo {
public:
    Foo() = default; // 默认构造函数, C++ 11
    Foo(int n); // 重载了构造函数, 添加了参数 n
private:
    int v = 0;
};
Foo::Foo(int n) {
    v = n; // 设定初始值
    cout << n << endl; // 也可以执行其他内容
}
// C++ 11 以后, 简单的初始化还可以这样写
Foo::Foo(int n) : v(n) {
    cout << n << endl; // 执行其他内容
}

int main() {
    Foo foo_1; // 执行默认构造函数
    Foo foo_2(1); // 执行被重载的构造函数
}
#include <iostream>
using namespace std;
class Foo {
public:
    // 不提供默认构造函数
    Foo(int n) : v(n) {}
    // 回顾一下 const 的用法
    int value() const { return v; }
private:
    int v = 0;
};
void bar(Foo foo) {
    cout << foo.value() << endl;
}
int main() {
    bar(1); // ?
}
#include <iostream>
using namespace std;
class Foo{
public:
    // 默认析构函数同样可以使用 default 表示
    // ~Foo() = default;
    ~Foo() {
    cout << "对象销毁" << endl;
    }
};
void bar(){
    Foo foo;
    // 退出函数前销毁 foo, 输出提示
}

int main(){
    bar();
}
#include <iostream>
using namespace std;
class Foo {
public:
    // 以下两个拷贝构造函数只能保留一个
    // 浅拷贝
    Foo(const Foo &foo) {
        // 复制内容, 手动定义函数时需要手动执行
        v = foo.v; arr = foo.arr;
        cout << "浅拷贝" << endl; // 执行其他内容
    }
    // 深拷贝
    Foo(const Foo &foo) {
        v = foo.v;
        // 注意此处的区别
        for (int i = 0; i < 5; ++i)
            arr[i] = foo.arr[i]
        cout << "深拷贝" << endl;
    }
private:
    int v;
    int arr[5];
};
#include <iostream>
Foo a(1); // 全局对象
void bar() {
    Foo b(2); // 局部对象
    static Foo c(3); // 静态对象
}
int main() {
    Foo *d = new Foo d(4); // 动态创建对象
    bar();
    delete d; // 请注意回收内存
    return 0;
}

第五讲 - 作业:

请继续修改并优化您的时钟程序,要求:

1. 设计构造函数与拷贝构造函数。

2. 在之前的功能基础上,设计一个函数实现计算时间差的功能。

感 谢

@ SRMVision