实验三 类和对象Ⅱ

#ifndef Vector_int_HPP
#define Vectoe_int_HPP
#include<iostream>
#include<cassert>
using namespace std;
class Vector_int{
    public:
        Vector_int(int n);
        Vector_int(int n,int value);
        Vector_int(const Vector_int &s);
        ~Vector_int();
        int &at(int i);
    private:
        int size;
        int index;
        int *p;
};
Vector_int::Vector_int(int n):size(n){
    cout<<"Create vector int"<<endl;
    p=new int[n];
}
Vector_int::Vector_int(int n,int value):size(n){
    cout<<"Create vector int"<<endl;
    p=new int[n];
    for(auto i=0;i<size;i++)
    p[i]=value;
}
Vector_int::Vector_int(const Vector_int &s):size(s.size){
    cout<<"Create vector int"<<endl;
    p=new int[size];
    for(auto i=0;i<size;i++)
    p[i]=s.p[i];
}
Vector_int::~Vector_int(){
    cout<<"deleting..."<<endl;
    delete[] p;
}
int &Vector_int::at(int i){
    assert(i >= 0 && i < size);
    return p[i];
}
#endif
#include"Vector_int.hpp"
#include<iostream>
using namespace std;
int main()
{
    int n,i;
    cin>>n;
    Vector_int x(n); // 创建一个动态大小的int型数组对象x,向系统申请n个int型数据项空间
    Vector_int s(n, 6); // 创建一个动态大小的int型数组对象x,向系统申请n个int型数据项空间, 初始值均为6
    Vector_int y(x); // 用已经存在的对象x构造新的对象y
    y.at(0)=999; // 通过at()方法访问对象y中索引为0的数据项
    for(i=0;i<n;i++)
    cout<<s.at(i)<<" ";
    cout<<endl;
    cout<<y.at(0)<<endl;
    x.at(0)=1;
    cout<<x.at(0)<<" "<<y.at(0)<<endl;//x[0]!=y[0]表明是深复制                     
    return 0;
} 

 

#ifndef MATRIX_H
#define MATRIX_H

#include <iostream>
#include <cassert>
using namespace std;
class Matrix
{
public:
    Matrix(int n);                     // 构造函数,构造一个n*n的矩阵
    Matrix(int n, int m);              // 构造函数,构造一个n*m的矩阵
    Matrix(const Matrix &X);           // 复制构造函数,使用已有的矩阵X构造
    ~Matrix();                         //析构函数
    void set(const double *pvalue);     // 用pvalue指向的连续内存块数据为矩阵赋值
    void set(int i, int j, int value); //设置矩阵第i行第j列元素值为value
    double &at(int i, int j);          //返回矩阵第i行第j列元素的引用
    double at(int i, int j) const;     // 返回矩阵第i行第j列元素的值
    int get_lines() const;             //返回矩阵行数
    int get_cols() const;              //返回矩列数
    void print() const;                // 按行打印输出矩阵
private:
    int lines; // 矩阵行数
    int cols;  // 矩阵列数
    double *p; // 指向存放矩阵数据的内存块的首地址
};
Matrix::Matrix(int n):lines(n),cols(n){
    p=new double[n*n];
}
Matrix::Matrix(int n,int m):lines(n),cols(m){
    p=new double[n*m];
}
Matrix::Matrix(const Matrix &X):lines(X.lines),cols(X.cols){
    p=new double[lines*cols];
    for(auto i=0;i<lines;i++)
    for(auto j=0;j<cols;j++)
    p[cols*i+j]=X.p[cols*i+j];
}
Matrix::~Matrix(){
    delete []p; 
}
void Matrix::set(const double *pvalue)
{
    for(auto i=0;i<lines*cols;i++)
    p[i]=pvalue[i];
}
void Matrix::set(int i,int j,int value)
{
    p[lines*i+j]=value;
}
double& Matrix::at(int i,int j){
    double &q=p[cols*i+j];
    assert(i>=0&&j>=0&&i<lines&&j<cols);
    return q;
}
double Matrix::at(int i,int j)const{
    assert(i>=0&&j>=0&&i<lines&&j<cols);
    return p[cols*i+j];
}
int Matrix::get_lines() const{
   return lines;
}
int Matrix::get_cols() const{
   return cols;
}
void Matrix::print() const{
   for(auto i=0;i<lines;i++)
   {
       for(auto j=0;j<cols;j++)
       cout<<p[cols*i+j]<<" ";
       cout<<endl;
   }
   cout<<endl;
}

// 类Matrix的实现:待补足
// ×××

#endif
#include <iostream>
#include "matrix.hpp"

int main()
{
    using namespace std;

    double x[] = {1, 2, 3, 4, 5, 6};

    Matrix m1(3, 2);    // 创建一个3×2的矩阵
    m1.set(x);          // 用一维数组x的值按行为矩阵m1赋值
    m1.print();         // 打印矩阵m1的值
    cout << "the first line is: " << endl;
    cout << m1.at(0, 0) << " " << m1.at(0, 1) << endl;
    cout << endl;

    Matrix m2(2, 3);
    m2.set(x);
    m2.print();
    cout << "the first line is: " << endl;
    cout << m2.at(0, 0) << " " << m2.at(0, 1) << " " << m2.at(0, 2) << endl;
    cout << endl;

    Matrix m3(m2);
    m3.set(0, 0, 999);
    m3.print();
}

 将一维数组x换为{1,2,3,4,5,6,7,8,9},二维数组改为3*3后

 实验结论:

  在本次实验中主要学习了new和delete的用法。new用于动态分配内存。因为new会返回一个指向分配内存首地址的指针,所以new的使用经常和指针联系在一起。new也可以创造数组类型的对象。但在二维及以上要求创建时除第一维外均不能是变量。所以使用一维数组来表示多维数组也是一种思路。

  new所分配的内存必须要由delete释放,不然会造成内存泄露。

posted @ 2021-11-06 15:58  辛夸高岭桂  阅读(15)  评论(2)    收藏  举报