c++编写动态数组类 TArray,构造函数里指针数组初始化问题

1.cpp
#include<iostream>
using namespace std;
#include "1.h"
int main()
{
TArray a(10); // a是一个double 类型的长度为10动态数组
TArray b; // b是一个double 类型的尚未确定其长度的动态数组
b.SetLen(7); // 使b成为一个长度为7的动态数组
double d[10] = { 1,2,3,4,5,6,7,8,9,10 };
a.Input(d,10); // 把c中的10个元素复制到a中
a.Print(); // 打印a中的元素
TArray c(a); // 创建了一个与a一样的c数组
b = a; // 把a的内容复制给b
a.SetElem(0,6); // 把第0个元素的值重新赋值为6
b.Exchange(4,2); // 交换b中第4个和第2个元素的内容
b.Print(); // 打印b中的元素
a.Print(); // 打印a中的元素
c.Print(); // 打印c中的元素
return 0;
}

h
#include<iostream>
using namespace std;
class TArray
{
private:
double *a;
int n;
public:
TArray();
TArray(int number);
TArray(TArray &p);
void SetLen(int m);
void Input(double *b,int m);
void Print();
void SetElem(int m,double r);
void Exchange(int m,int r);
TArray operator=(TArray);
~TArray();
};

TArray::TArray()
{
a=new double[n];
}

TArray::TArray(TArray &p)
{
a=p.a;
n=p.n;
}

TArray::TArray(int number)
{
n=number;
}

void TArray::SetLen(int m)
{
n=m;
}

void TArray::Input(double *b,int m)
{
for(int i=0;i<m;i++)
{
a[i]=b[i];
}
}

void TArray::Print()
{
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
}

void TArray::SetElem(int m,double r)
{
a[m]=r;
}

void TArray::Exchange(int m,int r)
{
double temp;
temp=a[m];
a[m]=a[r];
a[r]=temp;
}

TArray TArray::operator=(TArray c)
{
TArray temp;
temp.a=c.a;
temp.n=c.n;
return temp;
}

TArray::~TArray()
{
delete []a;
}
大概是构造函数对指针数组的初始化有问题,大神能不能帮忙改改?我看见指针数组就头疼,能不能具体讲讲指针数组的问题?谢了。。。邮箱[email protected]

main.cpp
#include "1.h"
int main()
{
TArray a(10); // a是一个double 类型的长度为10动态数组
TArray b; // b是一个double 类型的尚未确定其长度的动态数组
b.SetLen(7); // 使b成为一个长度为7的动态数组
double d[10] = { 1,2,3,4,5,6,7,8,9,10 };
a.Input(d,10); // 把c中的10个元素复制到a中
a.Print(); // 打印a中的元素
TArray c(a); // 创建了一个与a一样的c数组
b = a; // 把a的内容复制给b
a.SetElem(0,6); // 把第0个元素的值重新赋值为6
b.Exchange(4,2); // 交换b中第4个和第2个元素的内容
b.Print(); // 打印b中的元素
a.Print(); // 打印a中的元素
c.Print(); // 打印c中的元素
return 0;
}
1.h
#include<iostream>
using namespace std;
class TArray
{
private:
double *a;
int n;
public:
TArray();
TArray(int number);
TArray(TArray &p);
void SetLen(int m);
void Input(double *b,int m);
void Print();
void SetElem(int m,double r);
void Exchange(int m,int r);
TArray operator=(TArray);
~TArray();
};

TArray::TArray()
{
a=NULL; //默认构造a=NULL,n=0;你的那个n没初始化,a申请内存肯定出错
n=0;
}

TArray::TArray(TArray &p)
{
n=p.n;
a=new double[n];
for(int i=0;i<n;i++)
a[i]=p.a[i];
}

TArray::TArray(int number)
{
n=number;
a=new double[n]; //得申请内存
}

void TArray::SetLen(int m)
{
n=m;
a=NULL; //得声明a=NULL
}

void TArray::Input(double *b,int m)
{
n=m;
for(int i=0;i<m;i++)
{
a[i]=b[i];
}
}

void TArray::Print()
{
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl; //加个endl让输出界面明朗
}

void TArray::SetElem(int m,double r)
{
a[m]=r;
}

void TArray::Exchange(int m,int r)
{
double temp;
temp=a[m];
a[m]=a[r];
a[r]=temp;
}

TArray TArray::operator=(TArray c)
{
a=new double[n]; //给你改了一下这个函数,你那个有问题
for(int  i=0;i<n;i++)
a[i]=c.a[i];
return *this;
}

TArray::~TArray()
{
delete []a;
}

满意请采纳哦!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-25
在C + +的构造函数初始化只有在成员初始化列表中被称为“初始化”,“转让”
你不明白它的意思,静态成员,即使上面的代码编译器,并有相同的连接错误,

编译器会告诉你,“ZH,MM是没有定义”错误类型初始化

外的类的定义类ATM {

静态字符ZH [5] [10] ;/ *内置5个用户信息,ZH代表帐户,MM表示密码* /

静态字符MM [5] [6]; }; br的的/>字符ATM :: ZH [5] [10] = {'2','0','1','1','0','5','1' ,'7','1','0',/> '2','0','1','1','0','5','1','7',' 1','1',/> '2','0','1','1','0','5','1','7','1','2' ,'2','0','1','1','0','5','1','7','1','3',

' 2','0','1','1','0','5','1','7','1','4'};

字符ATM :: MM [5] [6] = {'9','2','0','8','0','0',

'9','2','0' ,'8','0','1',/> '9','2','0','8','0','2',

'9',' 2','0','8','0','3',/> '9','1','1','0','0','6'}; / a>
所以是没有问题的
第2个回答  2013-10-25
#include<iostream>
using namespace std;
class TArray
{
private:
    double *a;
    int n;
public:
    TArray();
    TArray(int number);
    TArray(TArray &p);
    void SetLen(int m);
    void Input(double *b,int m);
    void Print();
    void SetElem(int m,double r);
    void Exchange(int m,int r);
    TArray &operator=(const TArray &);
    ~TArray();
};

TArray::TArray()
{
    a=new double[1];
    n = 1;
}

TArray::TArray(TArray &p)
{
    n=p.n;
    a=new double[n];
    for(int i=0;i<n;i++) {
        a[i] = p.a[i];
    }
}

TArray::TArray(int number)
{
    a=new double[number];
}

void TArray::SetLen(int m)
{
    delete[] a;
    n=m;
    a=new double[n];
}

void TArray::Input(double *b,int m)
{
    delete[] a;
    n = m;
    a=new double[n];
    for(int i=0;i<m;i++)
    {
        a[i]=b[i];
    }
}

void TArray::Print()
{
    for(int i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }
}

void TArray::SetElem(int m,double r)
{
    if(m<n)
    a[m]=r;
}

void TArray::Exchange(int m,int r)
{
    if(m>=n || r>=n) return;
    double temp;
    temp=a[m];
    a[m]=a[r];
    a[r]=temp;
}

TArray &TArray::operator=(const TArray &c)
{
    if(this != &c) {
        delete[] a;
        n = c.n;
        a=new double[n];
        for(int i=0;i<n;i++) {
            a[i] = c.a[i];
        }
    }
    return *this;
}

TArray::~TArray()
{
    delete []a;
}

 有问题私信或者qq慢慢问吧

第3个回答  2013-10-25
干嘛要重复造轮子 std::vector<double> 不就可以了
模板类array(C++11)也行吧
第4个回答  2013-10-25
这个。。。