实验四 类与数组、指针

一.实验任务1-4

总结:通过完成实验任务1-4,我对深复制和浅复制有了更加深刻的印象,加深对指针、引用作为形参用法的理解,理解了参数传递的过程。

二.实验任务5

1.源代码:

(1)vectorInt.hpp

#pragma once
#include<iostream>
#include<cassert>
using namespace std;
class vectorInt{
public:
vectorInt(int n0):size(n0),value(0){//构造函数1
p=new int [size];
cout<<"constructor1 called."<<endl;
for(int i=0;i<size;i++)
p[i]=value;
};

vectorInt(int n0,int x0):size(n0),value(x0){//构造函数2

    int i;
    p=new int[size];
            cout<<"constructor2 called."<<endl;
    for(i=0;i<size;i++)
    p[i]=value;

};

vectorInt(const vectorInt &a)
{       
    int i;
     size=a.size;
     value=a.value;
     p=new int[size];
      cout<<"copy constructor called."<<endl;
     for(i=0;i<size;i++)
    p[i]=a.p[i];
}

int &at(int index);

int get_size(){
    return size;
}

friend void output(vectorInt &v1);
~vectorInt(){
    delete[]p;
    cout<<"destructor called."<<endl;
}

private:
int size,value;
int *p;
};

void output(vectorInt &v1){
for(int i=0;i<v1.size;i++)
cout<<v1.p[i]<<", ";
cout<<endl;
}

int &vectorInt::at(int index)
{
    assert(index>=0&&index<size);
    return p[index];
}

(2)task5.cpp

#include <iostream>
#include "vectorInt.hpp"

void test() {
    using namespace std;

    int n;
    cin >> n;
    
    vectorInt x1(n);
    for(auto i = 0; i < n; ++i)
        x1.at(i) = i*i;

    output(x1);

    vectorInt x2(n, 42);
    vectorInt x3(x2);

    output(x2);
    output(x3);

    x2.at(0) = 77;

    output(x2);
    output(x3);
}

int main() {
    test();
}

2.运行测试:

 

三、实验任务六

1.源代码:

(1)Matrix.hpp

#pragma once
#include<iostream>

using std::cout;
using std::endl;

class Matrix{
public:
Matrix(int n);
Matrix(int n,int m);
Matrix(const Matrix &x);
~Matrix();

void set(const double *pvalue);
void set(int i,int j,int value);
double &at(int i,int j);
double at(int i,int j)const;
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(int i=0;i<lines;i++){
    for(int j=0;j<cols;j++){
        p[i*cols+j]=x.p[i*cols+j];
    }
}
}

Matrix::~Matrix(){
    delete[]p;
}

void Matrix::set(const double *pvalue){
for(int i=0;i<lines;i++){
   for(int j=0;j<cols;j++){
     p[i*cols+j]=*pvalue;
     pvalue++;
   }
}
}

void Matrix::set(int i,int j,int value){
    p[i*cols+j]=value;
}

double Matrix::at(int i,int j)const{
  return p[i*cols+j];
}

double& Matrix::at(int i,int j){
    return p[i*cols+j];
}

int Matrix::get_lines()const{
    return lines;
}

int Matrix::get_cols()const{
    return cols;
}

void Matrix::print()const{
for(int i=0;i<lines;i++){
  for(int j=0;j<cols;j++){
    cout<<p[i*cols+j]<<",";
  }
  cout<<"\b \n";
}}

(2)task6.cpp

#include <iostream>
#include "Matrix.hpp"

void test() {
    using namespace std;

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

    Matrix m1(3, 2);    
    m1.set(x);          
    m1.print();         
    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();
}

int main() {
    test();
}

 

2.运行测试:

更换数据后:

 

posted @ 2022-11-06 21:37  小帅不爱摆烂  阅读(18)  评论(0编辑  收藏  举报