一个关于C++重载的问题

#include <iostream>
using std::cout;
using std::endl;

class assistant//辅助类
{
public:
int * ptr;
int n;//保存矩阵的列
int i;//保存从Array2返回的行数
int & operator [](int j){return *(ptr + n * i + j);}
};

class Array2
{
private:
int size1;
int size2;
int *ptr;
public:
Array2(int m = 10, int n = 10) :size1(m), size2(n)
{
ptr = new int[m * n];
}
~Array2() { delete [] ptr;}
assistant operator [](int i)//重载下标运算符
{
assistant assis;
assis.ptr=ptr;
assis.n=size2;
assis.i=i;
return assis;
}
注意这里! Array2 & operator = (Array2 & s)
{
if(ptr) delete [] ptr;
ptr = new int[size1 * size2];
for(int i = 0; i < size1; i ++)
{
for(int j = 0; j < size2; j ++)
{
*(ptr + i * size2 + j) = *(s.ptr + i * size2 + j);
}
}
return *this;
}
};

int main()
{
Array2 a(3,4);
int i,j;
for(i = 0;i < 3; i ++ )
{
for(j = 0; j < 4; j ++ )
{
a[i][j] = i * 4 + j;
}
}
for(i = 0;i < 3; i ++ )
{
for(j = 0; j < 4; j ++ )
{
cout << a[i][j] << ",";
}
cout << endl;
}
cout << "next" << endl;
Array2 b;
b = a;
for(i = 0;i < 3; i ++ )
{
for(j = 0; j < 4; j ++ )
{
cout << b[i][j] << ",";
}
cout << endl;
}
return 0;
}
我为了使b和a成为相等的类重载的二维数组而对=进行了重载,结果b输出的值并不是和a一样
a输出0,1,2,3,4,5,6,7,8,9,10,11
b输出0,1,2,3,10,11,-...,-...,0,0,8,1,有两个很大的负数 后面也不一样
我觉得是空间上0到11并不是按顺序排列的
但是怎么对=重载可以实现在这个功能我就不知道了
谁能教教我 谢了!
答得好又追加啊 最好能解释下原因

#include <iostream>
using std::cout;
using std::endl;

class assistant//辅助类
{
public:
int * aPtr;//
int n;//保存矩阵的列
int i;//保存从Array2返回的行数
int & operator [](int j)
{
return *(aPtr + n * i + j);
}
};
class Array2
{
private:
int size1;
int size2;
int *ptr;
public:
Array2(int m = 3, int n = 4) :size1(m), size2(n)/*这里改为3×4,
是因为这里你把他定为10×10了,它输出的是10×10方阵的前面3行和前面4列
因为你只输入了方阵的第一行的10位和第二行的两位,其余的都没有初始化,会变成随机数
希望对您有用*/
{
ptr = new int[m * n];
}
~Array2()
{
delete [] ptr;
}
assistant operator [](int i)//重载下标运算符
{
assistant assis;
assis.aPtr=ptr;
assis.n=size2;
assis.i=i;
return assis;
}
Array2 & operator = (Array2 & s)
{
if(ptr) delete [] ptr;
ptr = new int[size1 * size2];
for(int i = 0; i < size1; i ++)
{
for(int j = 0; j < size2; j ++)
{
*(ptr + i * size2 + j) = *(s.ptr + i * size2 + j);
}
}
return *this;
}
};

int main()
{
Array2 a(3,4);
int i,j;
for(i = 0;i < 3; i ++ )
{
for(j = 0; j < 4; j ++ )
{
a[i][j] = i * 4 + j;
}
}
for(i = 0;i < 3; i ++ )
{
for(j = 0; j < 4; j ++ )
{
cout << a[i][j] << "\t";
}
cout << endl;
}

cout << "\nnext\n" << endl;

Array2 b;
b = a;
for(i = 0;i < 3; i ++ )
{
for(j = 0; j < 4; j ++ )
{
cout << b[i][j] << "\t";
}
cout << endl;
}
system( "pause" );
return 0;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

求助,关于一道C++函数重载的问题
1、运算符重载不改变操作符原先的优先级、结合性和操作数数目,++是单目操作符,所以1不会成立的。你有这样的问题大概是因为双目操作符比如*,可以有x.operator*(y)这种写法吧? 但是这个不改变*是二目操作符的事实。C++规定:双目操作符重载作为成员函数时只能有一个形参,调用方为左操作数,形参...

C++重载的问题
B 友元运算符,所以不是成员函数 通过.访问的全都不是

关于C++重载的问题
首先作为‘+’操作符,应该是 value1 = value+i;的形式 重载函数中的第一个参数是指加号前的参数,第二个参数指加号后的参数,因此,除非有特殊要求,两个参数都不应有默认值。并将重载的操作符声明为类的友元函数。作为类中的成员函数 在函数参数中不应该定义两个参数,因为‘+’之前的参数默认...

关于C++的重载的问题
你的返回类型已经被你定为Person了吧?按照你原来的代码的话只能return一个Person类型的内容 如果需要返回字符串的话就需要将返回值修改为相应的类型。参考代码:将类中对operator ==的声明改为:char * Person::operator ==(Person c);重载实现:char * Person::operator ==(Person c){ if(m_id...

C++ <<重载问题!
\/\/把void换成ostream& };ostream& operator <<(ostream &x,Point pt) \/\/重载"<<"运算符的函数头 \/\/把void换成ostream& { x<<"("<<pt.px<<","<<pt.py<<")"<<endl; \/\/这里有错 return x;} void main(){ Point p1(1,2);cout<<p1;} 现在可以了 ...

关于C++重载的一个问题求解~~
如,C++本身支持下面的转换 char a = '0';int i = (int)a;或者写成int i = int(a);现在有了如上定义,也有类似的形式了 complex a;double i = double(a);这样可以将类complex的对象转换为double,因为上面的重载提供了这样的转换方法。

简单C++重载问题
因为你重写C0的虚函数数不规范,导致系统认为你写的是另一个函数,具体如下:在 C0 中为 void Set1(int i);在 C1 中为 int Set1(float i);系统判定虚函数有三个要求:1.与基类函数同名;2.有相同的参数个数及对应类型;3.有相有返回值或满足类型兼容规则的指针,引用的返回值;你写的函数只有...

请教关于C++中重载的问题1
指针P声明为公有的才能访问,就按友好函数访问的权限解释,因为你在重载函数中用到了Strcmp库函数,而它并不是类String的友好函数,因此是不能访问到指针P的 include <iostream> include<string> using namespace std;class String { public:String(){p=NULL;} String(char *str);friend bool ...

c++重载问题
问题是在你的第八行:A & operator =(A & a)解决:A & operator =(const A & a)分析如下:函数fun在return 类A时,编译器需要在主调函数里创建一个临时类常量,以便能够将它赋值给主调函数里的a1.由于在主调函数里代码是a1=fun(),等号右边是个常量(分析如前),但在等号操作符重载里你...

关于c++中重载的问题
函数重载是指对现有的函数进行重载,重载函数与被重载的函数的函数名相同,但参数类型、参数个数和返回类型中有一个或者多个不同,以示区别 运算符重载是指对C++中部分运算符赋予其它功能

相似回答
大家正在搜