| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 690 人关注过本帖
标题:关于运算符重载的c++程序(已修改)
只看楼主 加入收藏
fanzhiyu1989
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-11-28
收藏
 问题点数:0 回复次数:3 
关于运算符重载的c++程序(已修改)
感谢几位楼主对我上一贴的回复,我回去琢磨了一下
对构造函数进行了修改(使用默认参数),可编译的时候总是显示INTERNAL COMPILER ERROR
希望各位再帮忙指点一下
#include<iostream>
using namespace std;
class Matrix
 {
  private:
    const int rows,cols;  //矩阵的行数和列数
    int * mem;  //动态申请矩阵空间    
  public:
    //类中的常数据成员需用构造函数的初始化表来初始化
     Matrix(int r=0,int c=0,int *m=0):rows(r),cols(c)  
    {int i;
     mem=new int[rows*cols];
     if(m)
     for(i=0;i<rows*cols;i++)
     mem[i]=m[i];
    }                                                  
    //拷贝构造函数
    Matrix(Matrix &m):rows(m.rows),cols(m.cols)
     {int i;
      mem=new int[m.rows*m.cols];
      for(i=0;i<m.rows*m.cols;i++)
      mem[i]=m.mem[i];
     }
    int operator()(int i,int j);
    void operator=(Matrix &m);
    friend Matrix operator+(Matrix &m1,Matrix &m2);
    friend Matrix operator-(Matrix &m1,Matrix &m2);
    void print();
    ~Matrix() {delete mem;}
  };

 
int Matrix::operator()(int i,int j)
 {int k;
  k=(i-1)*cols+j;
     return(mem[k-1]);
 }

void Matrix::operator=(Matrix &m)
{int i;
 mem=new int[m.rows*m.cols];
 for(i=0;i<m.rows*m.cols;i++)
   mem[i]=m.mem[i];
}

 Matrix operator+(Matrix &m1, Matrix &m2)
 {Matrix m3(m1.rows,m1.cols);
  
  int i;
  for(i=0;i<m1.rows*m1.cols;i++)
  m3.mem[i]=m1.mem[i]+m2.mem[i];
  return m3;
 }
 
 Matrix operator-(Matrix &m1, Matrix &m2)
 {Matrix m3(m1.rows,m1.cols);
  int i;
  for(i=0;i<m1.rows*m2.cols;i++)
  m3.mem[i]=m1.mem[i]-m2.mem[i];
  return m3;
 }

 void Matrix::print()
 {int k;
  for(k=0;k<rows*cols;k++)
     { cout<<mem[k]<<" ";
       if((k+1)%cols==0)   
           cout<<endl;                    //换行
     }
 }

 
int main()
{ int a[9]={2,0,0,0,2,0,0,0,2};
  int b[9]={1,0,0,0,1,0,0,0,1};
    Matrix mat1(3,3,a),mat2(3,3,b);
 cout<<"矩阵1:"<<endl;
 mat1.print();
 cout<<"矩阵2:"<<endl;
 mat2.print();
 cout<<"矩阵1第1行第1列元素是: "<<mat1(1,1)<<endl;   //取矩阵mat1的第1行第1列元素
 cout<<"矩阵2第1行第2列元素是: "<<mat1(1,2)<<endl;   //取矩阵mat2的第1行第2列元素
Matrix mat3(3,3);
mat3=mat1+mat2;
Matrix mat4(3,3);
mat4=mat1-mat2;
 cout<<"矩阵1与矩阵2之和是:"<<endl;
mat3.print();
 cout<<"矩阵1与矩阵2之差是:"<<endl;
mat4.print();
 return 0;
}
搜索更多相关主题的帖子: 运算符 重载 
2008-11-30 12:13
fanzhiyu1989
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-11-28
收藏
得分:0 
还有一个地方不太明白,当有const数据成员时,构造函数在类内部的声明采用如下写法是否正确
class Matrix
{ ....
  public:
  Matrix(int r=0,int c=0,int *m=0);
};
Matrix::Matrix(int r=0,int c=0,int *m=0):rows(r),cols(c)  
    {int i;
     mem=new int[rows*cols];
     if(m)
     for(i=0;i<rows*cols;i++)
     mem[i]=m[i];
    }
2008-11-30 12:36
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
const int rows,cols;
这样定义常量,而常量在运行期是不能赋值的,那个编译期错误应该就是这个问题,所以建议这两个量不要定义成常量,如果想不让外部修改,声明成私有成员,并只在构造器中赋值,就可以达到隐藏的目的.
另外,mem=new int[rows*cols];是个危险的做法,因为你不能保证row*cols大于0,你需要在new之前要检查一下它的大小.因为如果恶意或是无意传入非法值(如负数或是0),得有能力处理这个意外.
2008-11-30 20:57
tangwen88
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-11-5
收藏
得分:0 
学习中
2008-12-01 18:53
快速回复:关于运算符重载的c++程序(已修改)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019184 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved