220011wan

导航

实验一作业


1 #include <iostream>
 2 using namespace std;
 3 // 定义Point类
 4 class Point 
 5 {
 6 public:
 7     Point(int x0 = 0, int y0 = 0);
 8     Point(const Point &p);
 9     ~Point() = default;
10     int get_x() const
11     {
12         return x;
13     }
14     int get_y() const
15     {
16         return y;
17     }
18     void show() const;
19 private:
20     int x, y;
21 };
22 Point::Point(int x0, int y0) :x{ x0 }, y{ y0 }//初始化列表
23 {
24     cout << "constructor called." << endl;
25 }
26 Point::Point(const Point &p)
27 {
28     x = p.x;
29     y = p.y;
30     cout << "copy constructor called." << endl;
31 }
32 void Point::show() const 
33 {
34     cout << "(" << x << ", "<< y << ")" << endl;
35 }
36 
37 int main() 
38 {
39     Point p1(10, 18); // 构造函数被调用
40     p1.show();
41     Point p2 = p1; // 复制构造函数被调用
42     p2.show();
43     Point p3{ p2 }; // 复制构造函数被调用
44     p3.show();
45     cout << p3.get_x() << endl;
46 }

 1 #include <iostream>
 2 #include <iomanip>
 3 using namespace std;
 4 // 定义时钟类Clock
 5 class Clock 
 6 {
 7 public:
 8     Clock(int h = 0, int m = 0, int s = 0);
 9     Clock(const Clock &p);
10     ~Clock() = default;
11     void set_time(int h, int m = 0, int s = 0);
12         void show_time() const;
13 private:
14     int hour, minute, second;
15 };
16 // 类Clock实现
17 Clock::Clock(int h, int m, int s) : hour{ h }, minute{ m }, second{ s } 
18 {
19     cout << "constructor called" << endl;
20 }
21 Clock::Clock(const Clock &p) : hour{ p.hour }, minute{ p.minute },second{ p.second } 
22 {
23     cout << "copy constructor called" << endl;
24 }
25 void Clock::set_time(int h, int m, int s) 
26 {
27     hour = h;
28     minute = m;
29     second = s;
30 }
31 void Clock::show_time() const 
32 {
33     cout << setfill('0') << setw(2) << hour << ":"<< setw(2) << minute << ":"<< setw(2) << second << endl;
34 }
35 // 普通函数定义
36 Clock reset() 
37 {
38     return Clock(0, 0, 0); // 构造函数被调用
39 }
40 int main()
41 {
42     Clock c1(20, 22, 30); // 构造函数被调用
43     c1.show_time();
44     c1 = reset(); // 理论上:复制构造函数被调用
45     c1.show_time();
46     Clock c2(c1); // 复制构造函数被调用
47     c2.set_time(12);
48     c2.show_time();
49     return 0;
50 }
 1 #include <iostream>
 2 using namespace std;
 3 // 定义一个简单抽象类
 4 class X
 5 {
 6 public:
 7     X(); // 默认构造函数
 8     ~X(); // 析构函数
 9     X(int m); // 构造函数
10     X(const X &obj); // 复制构造函数
11     X(X &&obj) noexcept; // 移动构造函数
12     void show() const; // 显示数据
13 private:
14     int data;
15 };
16 X::X() : data{ 20 }
17 {
18     cout << "default constructor called.\n";
19 }
20 X::~X()
21 {
22     cout << "destructor called.\n";
23 }
24 X::X(int m) : data{ m }
25 {
26     cout << "constructor called.\n";
27 }
28 X::X(const X &obj) : data{ obj.data }
29 {
30     cout << "copy constructor called.\n";
31 }
32 X::X(X &&obj) noexcept : data{ obj.data }
33 {
34     cout << "move constructor called.\n";
35 }
36 void X::show() const
37 {
38     cout << data << std::endl;
39 }
40 int main()
41 {
42     X x1; //默认构造函数被编译器自动调用
43     x1.show();
44     X x2{ 2022 };
45     x2.show(); // 构造函数被编译器自动调用
46     X x3{ x1 }; // 复制构造函数被编译器自动调用
47     x3.show();
48     X x4{ std::move(x2) }; // 移动构造函数被编译器调用
49     x4.show();
50     return 0;
51 }

 

构造函数(按照代码执行顺序):

  (1)执行X x1代码时,默认构造函数X()被调用

  (2)执行X x2{2022}代码时,构造函数X(int m)被调用,将2022赋值给x2.data

  (3)执行X x3{x1}代码时,复制构造函数被调用,将x1.data赋值给x3.data

  (4)执行X x4{std::move(x2)}代码时,移动构造函数被调用,将x2.data赋值给x4.data 

析构函数:

  对象生命周期结束时,析构函数被调用

  析构函数被调用的顺序与构造函数相反,x4首先调用析构函数,其次x3,然后x2,最后x1

 1 #include <iostream>
 2 #include <iomanip>
 3 // 矩形类Rectangle的定义和实现
 4 class Rectangle
 5 {
 6 public:
 7     Rectangle();//默认构造函数
 8     Rectangle(double l, double w);//有参构造函数
 9     Rectangle(const Rectangle &p);//复制构造函数
10     double len();
11     double wide();
12     double area();
13     double circumference();
14     void resize(int times);
15     void resize(int l_times, int w_times);
16     ~Rectangle()
17     {
18 
19     }//析构函数
20 private:
21     double length;
22     double width;
23 };
24 Rectangle::Rectangle(double l, double w)
25 {
26     length = l;
27     width = w;
28 }
29 Rectangle::Rectangle() :length(2.0), width(1.0)
30 {
31 
32 }
33 Rectangle::Rectangle(const Rectangle &p)
34 {
35     length = p.length;
36     width = p.width;
37 }
38 double Rectangle::len()
39 {
40     return length;
41 }
42 double Rectangle::wide()
43 {
44     return width;
45 }
46 double Rectangle::area()
47 {
48     return (length * width);
49 }
50 double Rectangle::circumference()
51 {
52     return 2*(length + width);
53 }
54 void Rectangle::resize(int times)
55 {
56     length = length * times;
57     width = width * times;
58 }
59 void Rectangle::resize(int l_times, int w_times)
60 {
61     length = length * l_times;
62     width = width * w_times;
63 }
64 // 普通函数, 用于输出矩形信息
65 void output(Rectangle &rect) 
66 {
67     using namespace std;
68     cout<< "矩形信息:"<<endl;
69     cout<< fixed << setprecision(2); // 控制输出格式:以浮点数形式输出、小数部分保留两位
70     // 补足代码:分行输出矩形长、宽、面积、周长
71     cout<< rect.len() << endl;
72     cout << rect.wide() << endl;
73     cout << rect.area() << endl;
74     cout << rect.circumference() << endl;
75     cout << endl;
76 }
77 // 主函数,测试Rectangle类
78 int main() 
79 {
80     Rectangle rect1; // 默认构造函数被调用
81     output(rect1);
82     Rectangle rect2(10, 5); // 带有两个参数的构造函数被调用
83     output(rect2);
84     Rectangle rect3(rect1); // 复制构造函数被调用
85     rect3.resize(2); // 矩形rect3的长和宽同时缩放2倍
86     output(rect3);
87     rect3.resize(5, 2); // 矩形rect3的长缩放5倍, 宽缩放2倍
88     output(rect3);
89     return 0;
90 }

 

 

 

posted on 2022-09-28 20:52  或者明天  阅读(15)  评论(0编辑  收藏  举报