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

Đề tài: Có nên quá tải toán từ = và copy contructor ko ?

  1. #1
    Ngày gia nhập
    02 2009
    Bài viết
    4

    Mặc định Có nên quá tải toán từ = và copy contructor ko ?

    Đây là code J lấy ví dụ về matrix (hay nếu bạn gặp có dùng đến cấp phát động thì cũng như thế này ^^).
    Đầu tiên là vấn đề về quá tải toán tử = . Lúc đầu J cho là cũng ko quan trọng gì nhưng nếu ta lấy ví dụ sau:
    PHP Code:
    #include <iostream>
    using namespace std;

    class 
    Matrix{
        public:
        
    Matrix(int 2,int 2);
        ~
    Matrix();
        
    // Nhap va xuat ma tran
        
    friend ostreamoperator << ( ostreamos,const Matrix&);
        
    friend istreamoperator >> ( istreamisMatrix&);
        
    // Tinh toan tren ma tran
        
    Matrix operator + (const Matrix&);
        private:
            
    int cols,rows;
            
    int* array;
    };

    Matrix::Matrix(int numRow,int numCol){
        
    rows numRow;
        
    cols numCol;
        array = new 
    int[rows*cols];
    }

    Matrix::~Matrix(){
        
    delete[] array;
    }

    ostreamoperator<<(ostreamos ,const Matrixm){
        
    int i,j;
        for(
    i=0;i<m.rows;i++){
         for(
    j=0;j<m.cols;j++)
             
    os << m.array[i*m.cols j] << " " ;
             
    os <<endl;
        };
        
    os << endl;
        return 
    os;
    }

    istreamoperator>>(istreamis Matrixm){
        
    int i,j;
        
    cout<<"Nhap gia tri cho ma tran co " << m.rows << "x" << m.cols << endl;
        
        for(
    i=0;i<m.rows;i++)
            for(
    j=0;j<m.cols;j++){
                
    cout <<"[" <<<<"," <<<<"]:";
                
    is>> m.array[i*m.cols j];
            }
        return 
    is;    
    }

    Matrix Matrix::operator+(const Matrixm){
        
    int i;
        for(
    i=0;i<rows*cols;i++)
        array[
    i]+=m.array[i];
        return *
    this;
            
    }


    int main(int argcchar *argv[])
    {
        
    Matrix m,n,p;
        
    cin >>m;
        
    cin >>n;
        
    cout <<"M" <<endl <<m;
        
    cout <<"N" <<endl <<n;
        
    p=m+n;
        
    cout <<"M+N" << endl;
        
    cout <<p;
        return 
    0;

    Và thử với các giá trị J nhập vào , kết quả đây
    Nhap gia tri cho ma tran co 2x2
    [0,0]:1
    [0,1]:2
    [1,0]:3
    [1,1]:4
    Nhap gia tri cho ma tran co 2x2
    [0,0]:5
    [0,1]:6
    [1,0]:7
    [1,1]:8
    M
    1 2
    3 4

    N
    5 6
    7 8

    M+N
    0 8
    10 12

    Press any key to continue . . .
    Các bạn thấy đó , tại vị trí in đậm là đã cho kết quả sai.

    Còn khi J thêm quá tải toán tử = vào .
    PHP Code:
    #include <iostream>
    using namespace std;

    class 
    Matrix{
        public:
        
    Matrix(int 2,int 2);
        ~
    Matrix();
        
    // Nhap va xuat ma tran
        
    friend ostreamoperator << ( ostreamos,const Matrix&);
        
    friend istreamoperator >> ( istreamisMatrix&);
        
    // Tinh toan tren ma tran
        
    Matrix operator + (const Matrix&);
        
    // Toan tu gan
        
    const Matrixoperator = (const Matrix&);    
        private:
            
    int cols,rows;
            
    int* array;
    };

    Matrix::Matrix(int numRow,int numCol){
        
    rows numRow;
        
    cols numCol;
        array = new 
    int[rows*cols];
    }

    Matrix::~Matrix(){
        
    delete[] array;
    }


    const 
    MatrixMatrix::operator=(const Matrixm){
        
    delete[] array;
        
    rows=m.rows;
        
    cols=m.cols;
        array = new 
    int[rows*cols];
        for(
    int i=0;i<rows*cols;i++)
        array[
    i]=m.array[i];
    }

    ostreamoperator<<(ostreamos ,const Matrixm){
        
    int i,j;
        for(
    i=0;i<m.rows;i++){
         for(
    j=0;j<m.cols;j++)
             
    os << m.array[i*m.cols j] << " " ;
             
    os <<endl;
        };
        
    os << endl;
        return 
    os;
    }

    istreamoperator>>(istreamis Matrixm){
        
    int i,j;
        
    cout<<"Nhap gia tri cho ma tran co " << m.rows << "x" << m.cols << endl;
        
        for(
    i=0;i<m.rows;i++)
            for(
    j=0;j<m.cols;j++){
                
    cout <<"[" <<<<"," <<<<"]:";
                
    is>> m.array[i*m.cols j];
            }
        return 
    is;    
    }

    Matrix Matrix::operator+(const Matrixm){
        
    int i;
        for(
    i=0;i<rows*cols;i++)
        array[
    i]+=m.array[i];
        return *
    this;
            
    }


    int main(int argcchar *argv[])
    {
        
    Matrix m,n,p;
        
    cin >>m;
        
    cin >>n;
        
    cout <<"M" <<endl <<m;
        
    cout <<"N" <<endl <<n;
        
    p=m+n;
        
    cout <<"M+N" << endl;
        
    cout <<p;
        return 
    0;

    Kết quả là hoàn toàn đúng ^^
    Nhap gia tri cho ma tran co 2x2
    [0,0]:1
    [0,1]:2
    [1,0]:3
    [1,1]:4
    Nhap gia tri cho ma tran co 2x2
    [0,0]:5
    [0,1]:6
    [1,0]:7
    [1,1]:8
    M
    1 2
    3 4

    N
    5 6
    7 8

    M+N
    6 8
    10 12

    Press any key to continue . . .

  2. #2
    Ngày gia nhập
    02 2009
    Bài viết
    4

    Qua ví dụ trên , ta rút ra một điều là khi nào có dùng con trỏ thì đi kèm với quá tải toán tử = .
    Còn việc copy contructor có cần thiết ko , theo J là ko cần thiết . J lấy 2 ví dụ bên dưới , mọi người xem nhé.
    - Không dùng copy contructor
    PHP Code:
    #include <iostream>
    using namespace std;

    class 
    Matrix{
        public:
        
    Matrix(int 2,int 2);
        
    Matrix(const Matrix&);
        ~
    Matrix();
        
    // Nhap va xuat ma tran
        
    friend ostreamoperator << ( ostreamos,const Matrix&);
        
    friend istreamoperator >> ( istreamisMatrix&);
        
    // Tinh toan tren ma tran
        
    Matrix operator + (const Matrix&);
        
    // Toan tu gan
        
    const Matrixoperator = (const Matrix&);    
        private:
            
    int cols,rows;
            
    int* array;
    };

    Matrix::Matrix(int numRow,int numCol){
        
    rows numRow;
        
    cols numCol;
        array = new 
    int[rows*cols];
    }

    Matrix::~Matrix(){
        
    delete[] array;
    }


    const 
    MatrixMatrix::operator=(const Matrixm){
        
    delete[] array;
        
    rows=m.rows;
        
    cols=m.cols;
        array = new 
    int[rows*cols];
        for(
    int i=0;i<rows*cols;i++)
        array[
    i]=m.array[i];
    }
    ostreamoperator<<(ostreamos ,const Matrixm){
        
    int i,j;
        for(
    i=0;i<m.rows;i++){
         for(
    j=0;j<m.cols;j++)
             
    os << m.array[i*m.cols j] << " " ;
             
    os <<endl;
        };
        
    os << endl;
        return 
    os;
    }

    istreamoperator>>(istreamis Matrixm){
        
    int i,j;
        
    cout<<"Nhap gia tri cho ma tran co " << m.rows << "x" << m.cols << endl;
        
        for(
    i=0;i<m.rows;i++)
            for(
    j=0;j<m.cols;j++){
                
    cout <<"[" <<<<"," <<<<"]:";
                
    is>> m.array[i*m.cols j];
            }
        return 
    is;    
    }

    Matrix Matrix::operator+(const Matrixm){
        
    int i;
        for(
    i=0;i<rows*cols;i++)
        array[
    i]+=m.array[i];
        return *
    this;
            
    }

    int main(int argcchar *argv[])
    {
        
    Matrix m,n;
        
    cin >>m;
        
    cin >>n;
        
    cout <<"M" <<endl <<m;
        
    cout <<"N" <<endl <<n;
        
    Matrix p(n);
        
    cout <<"P=N" <<endl <<p;
        
    p=m;
        
    cout <<"P=M" <<endl <<p;
        return 
    0;

    Kết quả là
    Nhap gia tri cho ma tran co 2x2
    [0,0]:1
    [0,1]:2
    [1,0]:3
    [1,1]:4
    Nhap gia tri cho ma tran co 2x2
    [0,0]:5
    [0,1]:5
    [1,0]:5
    [1,1]:5
    M
    1 2
    3 4

    N
    5 5
    5 5

    P=N
    5 5
    5 5

    P=M
    1 2
    3 4

    Press any key to continue . . .
    +Và khi dùng copy contructor
    PHP Code:
    #include <iostream>
    using namespace std;

    class 
    Matrix{
        public:
        
    Matrix(int 2,int 2);
        
    Matrix(const Matrix&);
        ~
    Matrix();
        
    // Nhap va xuat ma tran
        
    friend ostreamoperator << ( ostreamos,const Matrix&);
        
    friend istreamoperator >> ( istreamisMatrix&);
        
    // Tinh toan tren ma tran
        
    Matrix operator + (const Matrix&);
        
    // Toan tu gan
        
    const Matrixoperator = (const Matrix&);    
        private:
            
    int cols,rows;
            
    int* array;
    };

    Matrix::Matrix(int numRow,int numCol){
        
    rows numRow;
        
    cols numCol;
        array = new 
    int[rows*cols];
    }

    Matrix::~Matrix(){
        
    delete[] array;
    }


    const 
    MatrixMatrix::operator=(const Matrixm){
        
    delete[] array;
        
    rows=m.rows;
        
    cols=m.cols;
        array = new 
    int[rows*cols];
        for(
    int i=0;i<rows*cols;i++)
        array[
    i]=m.array[i];
    }

    Matrix::Matrix(const Matrixm){
        
    delete[] array;
        
    rows=m.rows;
        
    cols=m.cols;
        array = new 
    int[rows*cols];
        for(
    int i=0;i<rows*cols;i++)
        array[
    i]=m.array[i];
    }

    ostreamoperator<<(ostreamos ,const Matrixm){
        
    int i,j;
        for(
    i=0;i<m.rows;i++){
         for(
    j=0;j<m.cols;j++)
             
    os << m.array[i*m.cols j] << " " ;
             
    os <<endl;
        };
        
    os << endl;
        return 
    os;
    }

    istreamoperator>>(istreamis Matrixm){
        
    int i,j;
        
    cout<<"Nhap gia tri cho ma tran co " << m.rows << "x" << m.cols << endl;
        
        for(
    i=0;i<m.rows;i++)
            for(
    j=0;j<m.cols;j++){
                
    cout <<"[" <<<<"," <<<<"]:";
                
    is>> m.array[i*m.cols j];
            }
        return 
    is;    
    }

    Matrix Matrix::operator+(const Matrixm){
        
    int i;
        for(
    i=0;i<rows*cols;i++)
        array[
    i]+=m.array[i];
        return *
    this;
            
    }

    int main(int argcchar *argv[])
    {
        
    Matrix m,n;
        
    cin >>m;
        
    cin >>n;
        
    cout <<"M" <<endl <<m;
        
    cout <<"N" <<endl <<n;
        
    Matrix p(n);
        
    cout <<"P=N" <<endl <<p;
        
    p=m;
        
    cout <<"P=M" <<endl <<p;
        return 
    0;

    Nhap gia tri cho ma tran co 2x2
    [0,0]:1
    [0,1]:2
    [1,0]:3
    [1,1]:4
    Nhap gia tri cho ma tran co 2x2
    [0,0]:5
    [0,1]:5
    [1,0]:5
    [1,1]:5
    M
    1 2
    3 4

    N
    5 5
    5 5

    P=N
    5 5
    5 5

    P=M
    1 2
    3 4

    Press any key to continue . . .
    Vậy là cả 2 trường hợp đều cho kết quả như nhau ^^
    Anh em có gì chỉ giáo

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

    Operator = và Copy constructor là cần thiết, nhất là đối với class nào có pointer trong đó.
    Chỉ thấy output nó giống nhau mà nghĩ là ko cần thiết, ko có lỗi thì thật là ngây thơ )

    Code:
    Matrix::Matrix(const Matrix& m){
        delete[] array;
        rows=m.rows;
        cols=m.cols;
        array = new int[rows*cols];
        for(int i=0;i<rows*cols;i++)
        array[i]=m.array[i];
    }
    Với lại hình như cái copy constructor này bị lỗi, đâu thể nào delete[] array
    Đã được chỉnh sửa lần cuối bởi Lugia : 27-02-2009 lúc 10:54 PM.

  4. #4
    Ngày gia nhập
    02 2009
    Bài viết
    4

    Thì j đồng ý khi nào có pointer thì dùng quá tải toán tử = rồi , còn copy contructor có cần thiết ko ^^ Mới lập topic hỏi anh em thử mà .
    Còn vì sao delete[] array ở trên là vì cho chắc thôi ^^

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

    ko có copy constructor thì ko thể kiểm soát các lệnh dạng như thế này:
    C++ Code:
    1. MyObject a;
    2. MyObject b(a);
    3.  
    4. void doSomething(MyObject a);//truyền tham trị
    Cái code ma trận ko có copy constructor của Jelly 100% có bug
    code ra gió bão

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    Mặc định Có nên quá tải toán từ = và copy contructor ko ?

    Cần và nên kiểm tra việc đối tượng tự gán hoặc tự sao chép chính nó trong khi tái định nghĩa toán tử = hoặc xây dựng copy constructor .
    C++ Code:
    1. const Matrix& Matrix::operator=(const Matrix& m){
    2.     if (this != &m)
    3.     {
    4.         delete[] array;
    5.         rows=m.rows;
    6.         cols=m.cols;
    7.         array = new int[rows*cols];
    8.         for(int i=0;i<rows*cols;i++)
    9.             array[i]=m.array[i];
    10.     }
    11.     return *this;
    12. }
    What you see is never what you get...

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

    ko có copy constructor thì ko thể kiểm soát các lệnh dạng như thế này:
    Trong C++ anh ít thấy ai dùng pass object by copy, ý nghĩa quan trọng của copy constructor còn 1 điểm nữa cơ !

    C++ Code:
    1. delete[] array;
    Chỉ khi nào con trỏ được cấp phát với new thì mới được dùng delete nếu không thì là logic error ! Dù có run với compiler này cũng sẽ chết với compiler khác !

Các đề tài tương tự

  1. ADO.NET Hàm Copy file trong c#,copy thiếu dữ liệu
    Gửi bởi gatrongpro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 08-12-2013, 09:40 PM
  2. [Hỏi] Copy thiếu khi copy nhiều file
    Gửi bởi toi_loi_acon trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 10-07-2012, 11:02 AM
  3. Firefox Lỗi: Phải nhấn Ctrl+C hoặc Copy 2 lần mới copy được văn bản.
    Gửi bởi Kevin Hoang trong diễn đàn Thắc mắc chung
    Trả lời: 3
    Bài viết cuối: 17-01-2011, 11:17 PM
  4. Thắc mắc về cách gọi hàm Contructor
    Gửi bởi newbie.blind trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 23-09-2010, 10:18 PM
  5. Lỗi phép gán trên C++ | hàm copy contructor và operator = sao lại sai?
    Gửi bởi xiu_coi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 06-06-2009, 03:06 PM

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