cpp实验三 类与对象II

一、实验任务四

模拟实验任务2,不使用标准库模板类vector,自己动手设计并实现一个动态的整型数组类Vector_int, 使其支持以下要求: 支持在创建int型数组对象时,指定其大小 支持在创建int型数组对象时,指定其大小,并将数组对象中每个数据项初始化到特定的值value 支持用已经存在的int型数组对象x,来构造新的int型数组对象y(要求实现深复制) 提供方法at()能够支持诸如 x.at(i) 这样通过索引访问动态int型数组对象中第i个数据项 析构函数,释放占用的内存资源 在构造和析构函数里,增加打印输出信息。运行程序时,帮助观察资源是否正确释放。 即在测试代码中,支持形如下面的代码操作: 要求: ① 设计并实现动态整型数组类Vector_int,保存在文件vector_int.hpp中 ② 编写测试代码文件task4.cpp,测试其构造函数接口、复制构造函数、at()方法等,是否都正常使用, 是否实现了深复制。 分析过后代码如下: Vector_int.hpp如下:
 1 #include<iostream> 
 2 #include<cassert>
 3 using namespace std;
 4 
 5 class Vector_int
 6 {
 7 private:
 8     int n,x;//n为数组长度,x为默认初始值 
 9     int *p;//数组 
10 public:
11     Vector_int(int n0):n(n0),x(0)
12     {
13         p=new int[n];
14         for(int i=0;i<n0;i++)
15         p[i]=x; 
16     };//构造函数
17     Vector_int(int n0,int x0):n(n0),x(x0)
18     {
19         p=new int[n];
20         for(int i=0;i<n0;i++)
21         p[i]=x;
22     };//构造函数
23     Vector_int(const Vector_int &y)//复制构造函数 
24     {
25         n=y.n;
26         x=y.x;
27         p=new int[n];
28         for(int i=0;i<n;i++)
29         p[i]=y.p[i];
30     } 
31     
32     void print() const;//输出 
33     ~Vector_int()//析构函数
34     {
35     delete[] p;
36     cout<<"destructor called"<<endl;
37     } 
38     
39     int &at(int index);//输出下标为index的数据 
40     
41     
42 };
43 
44 void Vector_int::print() const{
45     for(int i=0;i<n;i++){
46         cout<<p[i]<<"  ";
47     }
48     cout<<endl;
49     
50 }
51 
52 int &Vector_int::at(int index)
53 {
54     assert(index >= 0 && index < n);
55     return p[index];
56  } 

task4.cpp如下:

 1 #include<iostream>
 2 #include"Vector_int.hpp"
 3 using namespace std;
 4 int main()
 5 {
 6     int n;
 7     cout<<"请输入数组长度:\n";
 8     cin>>n;
 9     Vector_int x0(n); 
10     cout<<"x0=";
11     x0.print();
12     int n1,x;
13     cout<<"请输入数组长度和初始值:\n"; 
14     cin>>n1>>x;
15     Vector_int x1(n1, x);
16     cout<<"x1=";
17     x1.print();
18     Vector_int y(x1);
19     cout<<"y=";
20     y.print();
21     y.at(0) = 999;
22     cout<<"y=";
23     y.print();
24     return 0;
25 }

运行结果如下:

cpp实验三 类与对象II

 

 

二、实验任务五

实现一个动态矩阵类Matrix,类Matrix的声明见文件Matrix.hpp。 ① 实现类Matrix的定义 ② 使用task5.cpp测试矩阵类Matrix。 经过分析后,Matrix.hpp如下:
 1 #ifndef MATRIX_H
 2 #define MATRIX_H
 3 
 4 #include <iostream>
 5 #include <cassert>
 6 using namespace std;
 7 class Matrix
 8 {
 9 public:
10     Matrix(int n);                     // 构造函数,构造一个n*n的矩阵
11     Matrix(int n, int m);              // 构造函数,构造一个n*m的矩阵
12     Matrix(const Matrix &X);           // 复制构造函数,使用已有的矩阵X构造
13     ~Matrix() //析构函数
14     {
15         delete[] p;
16         cout<<"destructor called\n";
17     }
18     void set(const double *pvalue);     // 用pvalue指向的连续内存块数据为矩阵赋值
19     void set(int i, int j, int value); //设置矩阵第i行第j列元素值为value
20     double &at(int i, int j);          //返回矩阵第i行第j列元素的引用
21     double at(int i, int j) const;     // 返回矩阵第i行第j列元素的值
22     int get_lines() const;             //返回矩阵行数
23     int get_cols() const;              //返回矩列数
24     void print() const;                // 按行打印输出矩阵
25 private:
26     int lines; // 矩阵行数
27     int cols;  // 矩阵列数
28     double *p; // 指向存放矩阵数据的内存块的首地址
29 };
30 
31 Matrix::Matrix(int n):lines(n),cols(n)
32 {
33     p=new double[n*n];
34 }
35 
36 Matrix::Matrix(int n,int m):lines(n),cols(m)
37 {
38     p=new double[n*m];
39 }
40 
41 Matrix::Matrix(const Matrix &X ):lines(X.lines),cols(X.cols)
42 {
43     p=new double[lines*cols];
44     for(int i=0;i<lines*cols;i++)
45         p[i]=X.p[i];
46 }
47 
48 void Matrix::set(const double *pvalue)
49 {
50     for(int i=0; i<lines*cols; i++)
51         p[i]=*(pvalue+i);
52 }
53 
54 void Matrix::set(int i,int j,int value)
55 {
56     assert((i >= 0 && i < lines) && (j >= 0 && j < cols));
57     p[i*cols+j]=value;    
58 }
59 
60 double Matrix::at(int i, int j) const {
61     assert((i >= 0 && i < lines) && (j >= 0 && j < cols));
62     return p[i*cols+j];
63 }
64 double & Matrix::at(int i, int j) {
65     return p[i*cols+j];
66 }
67 
68 int Matrix::get_lines() const {
69     return lines;
70 }
71 int Matrix::get_cols() const {
72     return cols;
73 }
74 
75 void Matrix::print() const {
76     for(int i=0; i<lines; i++) {
77         for(int j=0; j<cols; j++) {
78             cout<<p[i*cols+j]<<" ";
79         }
80 
81         cout<<endl;
82     }
83 }
84 
85 
86 
87 
88 
89 #endif

task5.cpp如下:

 1 #include <iostream>
 2 #include "Matrix.hpp"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7 
 8     double x[] = {1, 2, 3, 4, 5, 6};
 9 
10     Matrix m1(3, 2);    // 创建一个3×2的矩阵
11     m1.set(x);          // 用一维数组x的值按行为矩阵m1赋值
12     m1.print();         // 打印矩阵m1的值
13     cout << "the first line is: " << endl;
14     cout << m1.at(0, 0) << " " << m1.at(0, 1) << endl;
15     cout << endl;
16 
17     Matrix m2(2, 3);
18     m2.set(x);
19     m2.print();
20     cout << "the first line is: " << endl;
21     cout << m2.at(0, 0) << " " << m2.at(0, 1) << " " << m2.at(0, 2) << endl;
22     cout << endl;
23 
24     Matrix m3(m2);
25     m3.set(0, 0, 999);
26     m3.print();
27 }

运行结果如图:

cpp实验三 类与对象II

 

 

三、实验结论

1.引用是没有自己的地址的,指针有自己的地址

2.引用作为形参时,例如&x,作为实参时要用x;

   指针作为实参时,例如*x,作为实参要用&x.

3.*pa=a时,&pa是自己的地址,pa是a的地址

   &ra=a时,&ra是a的地址,ra是a的值

4.在类中如果需要一组数组,可以用指针来帮助解决这种问题,例如定义*p,p=new double[]

5.assert是标准c++头文件cassert中定义的一个宏,用来判断一个条件表达式的值是否为true。

如果是false,会终止。  
上一篇:猜大小cpp


下一篇:【Diary】CSP-S2 2021 游记