C++数组深入(从上一篇ado助手获得灵感而写)

简介: C++数组深入(从上一篇ado助手获得灵感而写)

动态数组类


如果我们的类中需要使用动态申请的内存空间,并且该空间是依附于对象的,我们一般在该类的构造函

#include<iostream>
#include<cassert>
using namespace std;
class Point{
public:
  Point():x(0),y(0){
    cout<<"Default Constructor called."<<endl; 
  }
  Point(int x,int y):x(x),y(y){
    cout<<"Constructor called."<<endl;
  }
  ~Point(){cout<<"Destructor called."<<endl;}
  int getX() const{return x;}
  int getY() const{return y;}
  void move(int newX,int newY){
      x=newX;
      y=newY;
  }
private:
  int x,y;
};
//动态数组类
class ArrayOfPoints{
public:
  ArrayOfPoints(int size):size(size){
    points=new Point[size];
  }
  ~ArrayOfPoints(){
    cout<<"Deleting..."<<endl;
    delete[]points;
  }
  //获得下标为index的数组元素
  Point &element(int index){
    assert(index>=0 && index<size);//如果数组下标不会越界,程序中止
    return points[index];//*(points+index) 
  }
private:
  Point *points;
  int size; 
}; 
int main(){
  int count;
  cout<<"Please enter the count of points:";
  cin>>count;
  ArrayOfPoints points(count);
  points.element(0).move(5,10);//通过访问数组元素的成员
  points.element(1).move(15,20);//通过类访问数组元素的成员 
  return 0; 
}


数中去申请空间(new),在该类的析构函数中释放空间(delete).


动态申请多维数组(难点)


int *p=new int [6];

可以申请一个二维数组吗?

int *p=new int [2][3];

int *p=new int[2];

//int *p=new int [2][3];

在于他们返回的指针类型是不同的

int(*p)[3]=new int[2][3];

p=new int[size][3];

只有 第一维的容量可以使用变量,其他维度必须使用常量.


#include<iostream>
using namespace std;
int main(){
  //int *p=new int[2];
  //int *p=new int[2][3];
  int (*p)[3];
  int size=5;
  p=new int[size][3];
  //*(*(p+i)+j)
  //p[i][j]
  delete[]p;
}
#include<iostream>
using namespace std;
int main(){
  float(*cp)[9][8]=new float[8][9][8];
  for(int i=0;i<8;i++)
  for(int j=0;j<8;j++)
    for(int k=0;k<8;k++)
    //以指针形式数组元素
    *(*(*(cp+i)+j)+k)=static cast<float>(i*100+j*10+k);
  for(int i=0;i<8;i++){
  for(int j=0;j<9;j++){
    for(int k=0;k<8;k++)
    //将指针cp作为数组名使用,通过数组名和下标访问数组元素
    cout<<cp[i][j][k]<<" ";
    cout<<endl; 
  }
  cout<<endl;
  } 
  delete[] cp;
  return 0;
}


vector简介


C++标准库中封装好的一个动态数组类

大致的用法:


#include<iostream>
#include<vector>
using namespace std;
int main(){
  int b[]={3,4,5};
  vector<int>a(b,b+3);
  cout<<a.size()<<endl;
  a.push_back(6);
  cout<<a[0]<<endl;
  cout<<a.size()<<endl;
}
#include<iostream>
#include<vector>
using namespace std;
//计算数组arr中元素的平均值
double average(const vector<double>&arr){
  double sum=0;
  for(unsigned i=0;i<arr.size();i++)
    sum+=arr[i];
    return sum/arr.size(); 
}
int main(){
  unsigned n;
  cout<<"n=";
  cin>>n;
  vector<double> arr(n);//创建数组对象
  cout<<"Please input"<<n<<"real numbers:"<<endl;
  for(unsigned i=0;i<n;i++)
    cin>>arr[i];//运算符重载
    cout<<"Average="<<average(arr)<<endl; 
  return 0;
} 


深复制与浅复制(重点)


当类的成员中含有指针数据成员的时候,通过复制构造来创建新的对象可能会遇到问题.为什么?使用默认的复制构造函数,完成的是无修改的复制,会导致不同对象的指针成员指向同一块内存空间(往往和实际需求不符),这种复制,我们称其为浅复制.

如何解决这个问题?

使用深复制,自定义复制构造函数,控制复制构造的过程.


#include<iostream>
#include<cassert>
using namespace std;
class Point{
public:
  Point():x(0),y(0){
  cout<<"Point"<<endl;
  }
  Point(int x,int y):x(x),y(y){
  cout<<"Point"<<endl;
  }
  ~Point(){cout<<"~Point"<<endl;}
  int getX()const{return x;}
  int getY()const{return y;}
  void move(int newX,int newY){
  x=newX;
  y=newY;
  }
private:
  int x,y;
};
//动态数组类
class ArrayOfPoints{
public:
  ArrayOfPoints(int size):size(size){
  cout<<"ArrayOfPoints"<<endl;
  points=new Points[size];
  }
  ArrayOfPoints(ArrayOfPoints &aps){
  cout<<"ArrayOfPoints Copy"<<endl;
  size=aps.size;
  points=new Point[size];
  for(int i=0;i<size;i++){
    points[i]=aps.points[i];
  }
  }
  ~ArrayOfPoints(){
  cout<<"Deleting..."<<endl;
  delete[]points;
  cout<<"~ArrayOfPoints"<<endl;
  }
  //获得下标为index的数组元素
  Point &element(int index){
  assert(index>=0 && index<isze);
  return points[index];//*(points+index)
  }
private:
  Point *points;//指向动态数组首地址
  int size; 
};
int main(){
  int count=2;
  //cout<<"Please enter the count of points:";
  //cin>>count;
  ArrayOfPoints points1(count);//创建对象数组
  points1.element(0).move(5,10);//通过访问数组元素的成员
  points1.element(1).move(15,20);//通过类访问数组元素的成员
  ArrayOfPoints points2(points2);
  return 0; 
}


#include<iostream>
#include<cassert>
using namespace std;
class Point{
public:
  Point():x(0),y(0){
  cout<<"Default Constructor called."<<endl;
  }
  POint(int x,int y):x(x),y(y){
  cout<<"Constructor called."<<endl;
  }
  ~Point(){cout<<"Destructor called."<<endl;}
  int getX()const{return x;}
  int getY()const{return y;}
  void move(int newX,newY){
  x=newX;
  y=newY;
  }
private:
  int x,y;
};
//动态数组类
class ArrayOfPoints{
public:
  ArrayOfPoints(int size):size(size){
  points=new Point[size];
  }
  ~ArrayOfPoints(){
  cout<<"Deleting..."<<endl;
  delete[]points;
  }
  //获得下标为index的数组元素
  Point &element(int index){
  assert(index>=0 && index<size);//若果数组下标不会越界,程序中止
  return points[index]; 
  }
private:
Point *points;//指向动态数组首地址
int size;//数组大小 
};
int main(){
  int count;
  cout>>"Please enter the count of points:";
  cin>>count;
  ArrayOfPoints pointsArray1(count);//创建对象数组
  pointsArray1.element(0).move(5,10);
  pointsArray1.element(1).move(15,20);
  ArrayOfPoints pointsArray2=pointsArray1;//创建对象数组副本
  cout<<"Copy of pointsArray1:"<<endl;
  cout<<"Points_0 of array2:"<<pointsArray2.element(0).getX()<<","<<pointsArray2.element(0).getY()<<endl;
  cout<<"Points_1 of array2:"<<pointsArray2.element(0).getX()<<","<<pointsArray2.element(1).getY()<<endl;
  pointsArray1.element(0).move(25,30);
  pointsArray1.element(1).move(35,40);
  cout<<"After the moving of pointsArray1:"<<endl;
  cout<<"Points_0 of array2:"<<pointsArray2.element(0).getX()<<","<<pointsArray2.element(0).getY()<<endl;
  cout<<"Points_1 of array2:"<<pointsArray2.element(0).getX()<<","<<pointsArray2.element(1).getY()<<endl
  return 0;
}


动态数组类:简单版


#include<iostream>
#include<cassert>
using namespace std;
class Point{
public:
  Point():x(0),y(0){
  cout<<"Default Constructor called."<<endl;
  }
  Point(int x,int y):x(x),y(y){
  cout<<"Constructor called."<<endl;
  }
  ~Point(){cout<<"Destructor called."<<endl;}
  int getX()const{return x;}
  int getY()const{return y;}
  voidmove(int newX,int newY){
    x=newX;
    y=newY;
  }
private:
  int x,y;
}; 
//动态数组类
class ArrayOfPoints{
public:
  ArrayOfPoints(int size):size(size){
  poinnts=new Point[size];
  }
  ~ArrayOfPoints(){
  cout<<"Deleting..."<<endl;
  delete[]points;
  }
  //获得下标为index的数组元素
  Point &element(int index){
  assert(index>=0 && index<size);//如果数组下标不会越界,程序中止
  return points[index]; 
  } 
private:
  Point *points;//指向动态数组首地址
  int size;//数组大小 
};
int main(){
  int count;
  cout<<"Please enter the count of points:";
  cin>>count;
  ArrayOfPoints points(count);//创建对象数组
  points.element(0).move(5,10);//通过访问数组元素的元素
  points.element(1).move(15,20);//通过类访问数组元素的元素
  return 0; 
}

相关文章
|
6天前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
55 1
|
6天前
|
存储 缓存 安全
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
55 1
|
6天前
|
存储 算法 搜索推荐
在C++编程语言中数组的作用类型
在C++编程语言中数组的作用类型
17 0
在C++编程语言中数组的作用类型
|
6天前
|
C++
.C++中结构体数组docx
.C++中结构体数组docx
15 0
|
1天前
|
存储 C++
C++程序数组与指针:深入理解与实践
C++程序数组与指针:深入理解与实践
9 1
|
1天前
|
存储 算法 C++
C++程序一维数组:深入理解与实践
C++程序一维数组:深入理解与实践
9 1
|
1天前
|
存储 C++
C++程序中的对象数组
C++程序中的对象数组
6 0
|
1天前
|
存储 C++ 索引
C++程序字符数组:深入理解与实践
C++程序字符数组:深入理解与实践
10 2
|
6天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组
|
6天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
34 1