Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Hàm khởi tạo sao chép va gán bằng

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    15

    Mặc định Hàm khởi tạo sao chép va gán bằng

    Code:
    matran &matran::operator=(const matran &b)
    {
    	i=b.i;
    	j=b.j;
    	int e,f;
    	for(e=0;e<i;e++)
    		for(f=0;f<j;f++)
    		{	a[e][f]=b.a[e][f];
    			cout<<a[e][f];
    		}
    	return (*this);
    }
    matran::matran(const matran &b)
    {
    	i=b.i;
    	j=b.j;
    	int e,f;
    	for(e=0;e<i;e++)
    		for(f=0;f<j;f++)
    			a[e][f]=b.a[e][f];
    }
    matran::~matran()
    {
         for(int e=0;e<i;e++)
    		delete []a[e];
    	delete []a; 
    
    }
    tui đang làm bài về +,-,* hai ma trận dùng cấp phát động nên phải dùng hàm khởi tạo sao chép. Hàm tui viết chạy báo lỗi nhưng chủ yếu nhờ các bạn giải thích cách hoạt động của 2 hàm này.

  2. #2
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Bạn post cả code lên đi mới dễ xem chứ
    Cánh Chym ứ mỏi

  3. #3
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Hàm khởi tạo sao chép nó sẽ thực thi khi gặp câu lệnh khai báo có truyên vào đối số của đối tượng.
    ví dụ bạn khai:

    C++ Code:
    1. matran a(b);
    thì phương thức khởi tạo sao chép nó sẽ được thực hiện.

    còn operator = thì phương thức này được gọi khi bạn viết:

    C++ Code:
    1. a = b;


    về mặt bản chất và ý nghĩa, cách dùng thì nó hoàn toàn khác nhau nhưng về mặt mục đích trong một số trường hợp thì nó là giống nhau.

    ví như bạn cần lưu lại một biến tạm khi làm gì đó.

    C++ Code:
    1. matran tạm;
    2. tạm = a;
    3. hoặc:
    4. matran tam(a);

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C++ Code:
    1. matran::matran(const matran &b)
    2. {
    3.     i=b.i;
    4.     j=b.j;
    5.     int e,f;
    6.     for(e=0;e<i;e++)
    7.         for(f=0;f<j;f++)
    8.             a[e][f]=b.a[e][f];
    9. }
    Ai khởi tạo cho thằng copy constructor ?
    C++ Code:
    1. matran &matran::operator=(const matran &b)
    2. {
    3.     i=b.i;
    4.     j=b.j;
    5.     int e,f;
    6.     for(e=0;e<i;e++)
    7.         for(f=0;f<j;f++)
    8.         {   a[e][f]=b.a[e][f];
    9.             cout<<a[e][f];
    10.         }
    11.     return (*this);
    12. }
    Code này nói rằng size của matran truyền vào phải bằng matran gọi nó ? Vậy 1 matran khác size thì không gán được ? Self-assingment check đâu ?

  5. #5
    Ngày gia nhập
    09 2008
    Bài viết
    15

    mình up code mấy bạn sửa rùi chỉ chỗ sai hộ nhá. Cái phần cấp phát động khó hiểu quá.
    C Code:
    1. #include<iostream.h>
    2. #include<conio.h>
    3. #include<stdio.h>
    4. class matran
    5. {
    6.     private:
    7.         int i,j,**a;
    8.     public:
    9.         matran();
    10.         matran(int m,int n);
    11.         ~matran();
    12.         void nhap();
    13.         void xuat();
    14.         matran(const matran &b);
    15. //      matran& operator=(matran &b);
    16.         matran operator+(matran b);
    17.         matran operator-(matran b);
    18.         matran operator*(matran b);
    19. };
    20. matran::matran()
    21. {
    22.     i=0;
    23.     j=0;
    24.     a=new int*[i];
    25.     for(int e=0;e<i;e++)
    26.     {
    27.         a[e]=new int[j];
    28.         for(int f=0;f<j;f++)
    29.             a[e][f]=0;
    30.     }
    31. }
    32. matran::matran(int m,int n)
    33. {
    34.     i=m;
    35.     j=n;
    36.     a=new int *[i];
    37.     for(int e=0;e<i;e++)
    38.     {
    39.         a[e]=new int[j];
    40.         for(int f=0;f<j;f++)
    41.             a[e][f]=0;
    42.     }
    43. }
    44. matran::~matran()
    45. {
    46.      for(int e=0;e<i;e++)
    47.         delete []a[e];
    48.     delete []a;
    49.  
    50. }
    51. void matran::nhap()
    52. {
    53.     int e;
    54.     cout<<"\nnhap so dong:";    cin>>i;
    55.     cout<<"\nnhap so cot:";     cin>>j;
    56.     a=new int *[i];
    57.     for(e=0;e<i;e++)
    58.         a[e]=new int[j];
    59.     for(e=0;e<i;e++)
    60.         for(int f=0;f<j;f++)
    61.         {
    62.             cout<<"a["<<e<<"]"<<"["<<f<<"]=";
    63.             cin>>a[e][f];
    64.         }
    65. }
    66. void matran::xuat()
    67. {
    68.     for(int e=0;e<i;e++)
    69.     {
    70.         for(int f=0;f<j;f++)
    71.             cout<<"  "<<a[e][f]<<"  ";
    72.         cout<<"\n";
    73.     }
    74. }
    75. /*matran& matran::operator=(matran &b)
    76. {
    77.     i=b.i;
    78.     j=b.j;
    79.     int e,f;
    80.     for(e=0;e<i;e++)
    81.         for(f=0;f<j;f++)
    82.         {   a[e][f]=b.a[e][f];
    83.             cout<<a[e][f];
    84.         }
    85.     return (*this);
    86. }*/
    87. matran::matran(const matran &b)
    88. {
    89.     i=b.i;
    90.     j=b.j;
    91.     int e,f;
    92.     for(e=0;e<i;e++)
    93.         for(f=0;f<j;f++)
    94.             a[e][f]=b.a[e][f];
    95. }
    96. matran matran::operator+(matran b)
    97. {
    98.     int e=0,f;
    99.     if(i==b.i&&j==b.j)
    100.         for(e=0;e<i;e++)
    101.             for(f=0;f<j;f++)
    102.                 b.a[e][f]=a[e][f]+b.a[e][f];   
    103.     else
    104.         cout<<"sai";
    105.     return b;
    106. }
    107. void main()
    108. {
    109. //  clrscr();
    110.     matran t,b;
    111.     t.nhap();
    112.     t.xuat();
    113.     b.nhap();
    114.     b.xuat();
    115.     cout<<"cong hai mai tran\n";
    116.     t=t+b;
    117.     matran t1(t);
    118.     //matran c(t1);
    119.     t1.xuat();
    120.     getch();
    121. }

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    54

    Mặc định Hàm khởi tạo sao chép va gán bằng

    PHP Code:
    // viet 1 lop ma tran
    # include<iostream.h>
    class matran {

             private:
                  
    int dong,cot;
                  
    float **giatri;
             public:
                  
    matran();
                  ~
    matran();
                  
    matran (const matran &a);
                  
    matran operator+(matran &a);
                  
    matran operator*(matran &a);
                  
    void operator =(matran &a);
                  
    friend ostream operator <<(ostream os,matran &a);
    };
    // ---------------------------------------------------
    matran::matran() {
                 
    cout<<"Nhap so dong:";
                 
    cin>>dong;
                 
    cout<<"Nhap so cot:";
                 
    cin>>cot;
                 
    giatri=new float *[dong];
                 for(
    int i=0;i<dong;i++)
                    
    giatri[i]=new float [cot];
                 for( 
    i=0;i<dong;i++)
                    for(
    int j=0;j<cot;j++)

                        {  
    cout<<"Nhap A["<<i<<"]["<<j<<"]:";
                            
    cin>>giatri[i][j];
                        }

    }
    // ---------------------------------------------------
    matran:: matran (const matran &a) {
                
    dong=a.dong;
                
    cot=a.cot;
                
    giatri=new float *[dong];
                for(
    int i=0;i<dong;i++)
                    
    giatri[i]=new float [cot];

                for( 
    i=0;i<a.dong;i++)
                  for(
    int j=0;j<a.cot;j++)
                      
    giatri[i][j]=a.giatri[i][j];
    }
    // ---------------------------------------------------
    matran::~matran() {
                  for(
    int i=0;i<dong;i++)
                      
    delete giatri[i];
                  
    delete giatri;
    }
    // ----------------------------------------------------
    matran matran::operator+(matran &a) {
                
    matran b(a);
                if(
    a.dong!=this->dong||a.cot!=this->cot)
                {    
    cout<<"chuong trinh ko thuc hien duoc:";

                }
                for(
    int i=0;i<dong;i++)
                  for(
    int j=0;j<cot;j++)
                        
    b.giatri[i][j]=a.giatri[i][j]+this->giatri[i][j];
                return 
    b;
    }
    // ----------------------------------------------------
    matran matran::operator*(matran &a) {
                
    matran b(a);
                if((*
    this).cot!=a.dong)
                {  
    cout<<"chuong trinh ko thuc hien duoc:";

                }
                for(
    int i=0;i<this->dong;i++)
                  for(
    int j=0;j<a.cot;j++)

                {     
    b.giatri[i][j]=0;
                     for(
    int k=0;k<this->cot;k++)
                     
    b.giatri[i][j]+=this->giatri[i][k]*a.giatri[k][j];
                }

                 return 
    b;

    }
    void matran::operator =(matran &a) {
                
    this->dong=a.dong;
                
    this->cot=a.cot;
                for(
    int i=0;i<a.dong;i++)
                  for(
    int j=0;j<a.cot;j++)
                      
    this->giatri[i][j]=a.giatri[i][j];
    }
    // --------------------------------------------------------
     
    ostream operator <<(ostream os,matran &a){
                for(
    int i=0;i<a.dong;i++)
                  {  for(
    int j=0;j<a.cot;j++)
                          
    os<<a.giatri[i][j]<<"  ";
                          
    os<<endl;
                  }
                  return 
    os;
    }
    // -------------------------------------------------------
    int  main() {
              
    matran a,b;
              
    cout<<"Ma tran A:"<<endl<<a<<endl;
              
    cout<<"Ma tran B:"<<endl<<b<<endl;
              
    matran c=a+b;  cout<<"Ma tran tong A+B:"<<endl<<c<<endl;
              
    c=a*b;         cout<<"Ma tran tich A*B:"<<endl<<c<<endl;
              return 
    0;

    Bạn đọc bài mình nhé mà tham khảo chứ nhìn bài bạn khó sửa lắm
    Have a nice day
    Rất mong được mọi người giúp đỡ :

    Kiến thức mình biết chỉ là hạt cát trên sa mạc

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn