1. 自动存储周期 (automatic storage duration)

1. 自动存储周期 (automatic storage duration)#

说明#

对于自动存储周期的对象, 它在运行到它的定义时被构造, 在离开它所在的代码块 ({} 包括起来的代码) 时被销毁.

1int main() {
2  Noisy c1{Info{.ctor = "0", .dtor = "1"}};
3}
4// 最终输出
5// 0: c1 构造
6// 1: c1 析构

如果有多个自动存储周期对象要销毁, 它们将按构造的相反顺序销毁.

1int main() {
2  Noisy c1{Info{.ctor = "0", .dtor = "1"}};
3  Noisy c2{Info{.ctor = "2", .dtor = "3"}};
4}
5// 最终输出
6// 0: c1 构造
7// 2: c2 构造
8// 3: c2 析构
9// 1: c1 析构

可以引入代码块, 来缩小对象的生命期.

 1int main() {
 2  {
 3    Noisy c1{Info{.ctor = "0", .dtor = "1"}};
 4  }
 5  Noisy c2{Info{.ctor = "2", .dtor = "3"}};
 6}
 7// 最终输出
 8// 0: c1 构造
 9// 1: c1 析构
10// 2: c2 构造
11// 3: c2 析构

C 风格数组的元素按下标顺序构造, 按逆序销毁.

 1int main() {
 2  Noisy c1[] = {Noisy{Info{.ctor = "0", .dtor = "1"}},
 3                Noisy{Info{.ctor = "2", .dtor = "3"}},
 4                Noisy{Info{.ctor = "4", .dtor = "5"}}};
 5}
 6// 0: 第 0 个元素构造
 7// 2: 第 1 个元素构造
 8// 4: 第 2 个元素构造
 9// 5: 第 2 个元素析构
10// 3: 第 1 个元素析构
11// 1: 第 0 个元素析构

题目#

题 1#

 1int main() {
 2  Noisy c1{
 3      Info{.ctor = "c", .copy_ctor = "m", .copy_assign = "l", .dtor = "e"}};
 4
 5  Noisy c2{
 6      Info{.ctor = "o", .copy_ctor = "a", .copy_assign = "p", .dtor = "t"}};
 7
 8  Noisy c3 = c1;
 9
10  c3 = c2;
11  c3 = c1;
12}

题 2#

 1int main() {
 2  {
 3    {
 4      Noisy c1{Info{.ctor = "i", .dtor = "r"}};
 5      {
 6        Noisy c2{Info{.ctor = "s", .dtor = "_"}};
 7      }
 8      Noisy c3{Info{.ctor = "p", .dtor = "a"}};
 9    }
10    Noisy c4{Info{.ctor = "t", .dtor = "i"}};
11  }
12  Noisy c5{Info{.ctor = "t", .dtor = "d"}};
13  Noisy c6{Info{.ctor = "i", .dtor = "e"}};
14  Noisy c7{Info{.ctor = "o", .dtor = "n"}};
15}

题 3#

 1int main() {
 2  Derived_noisy c1{
 3      Info{.ctor = "l", .copy_ctor = "g", .copy_assign = "i", .dtor = "r"},
 4      Derived_info{
 5          .ctor = "e", .copy_ctor = "m", .copy_assign = "h", .dtor = "o"}};
 6
 7  Noisy c2{Info{.ctor = "n", .dtor = "r"}};
 8
 9  {
10    Noisy c3{c1};  // Noisy c3 = c1;
11    {
12      Noisy c4{Info{.ctor = "t", .dtor = "e"}};
13      {
14        Noisy c5{Info{.ctor = "h", .dtor = "_"}};
15      }
16    }
17  }
18}