Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 12
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    định nghĩa toán tử = cho ma trận ?

    khi em đọc trong giáo trình C++ của thầy Phạm Văn Ất thì có đoạn như thế này ạ:
    "nếu giá trị trả về của hàm toán tử gán là kiểu void thì không thể thực hiện phép gán a=b=c.".

    nhưng mà khi em đi thực hành có bài xây dựng lớp ma trận như sau :
    Mã:
    class vector{
    private:
    int n; 
    float *v; 
    public:
    void operator =(vector &a); // Phép gán
    };
    vậy thì bây giờ muốn gán một đối tượng ma trận a ,cho một đối tượng ma trận b thì phải làm thế nào ạ ? rõ ràng theo như thầy Ất viết thì không thể viết là b=a được.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    vector& vector:perator=(vetor &a)
    được nhưng mà vẫn ko được.

    vector a = ...;
    vector b = ...;
    vector c = ...;
    const vector d = ...;

    a = b = c; //được
    a = d; //ko được
    a = b = d; //ko được

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    b=a; tương đương với b.operator=(a);
    Còn c=b=a thì rõ ràng ko đc rồi, vì đọc từ phải sang trái nên nếu b=a trả về void thì c được gán kiểu void, lỗi biên dịch.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn có thể nói rõ hơn cho mình tại sao với const vector d lại không được không

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    vì định nghĩa kiểu này
    vector& vector:perator=(vetor &a)

    truyền reference a tức là phép gán = này đòi a thay đổi được. Trong khi b = a thì phép gán = ko hề thay đổi thuộc tính của a. Nếu a là hằng thì ko thể sử dụng trong phép gán trên được vì nó đòi a phải thay đổi được (mà hằng số thì ko đổi)

    vector& vector:perator=(vetor a) //ok, nhưng chậm.
    vector& vector:perator=(const vetor& a) //ok, nhanh.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Tại sao khi mình khai báo
    Mã:
    const vector c;
    nó lại bắt lỗi là

    uninitialized const `c'
    Với lại cho mình hỏi thêm: theo như bạn nói thì mình truyền tham trị vẫn được, nhưng chậm hơn. Vậy thì

    Mã:
    vector& vector::operator=(vector a){       (*this).x=a.x;       (*this).y=a.y;       return (*this);}
    vector a = ...;
    vector b = ...;
    vector c = ...;
    const vector d = ...;
    a=b=c=d có được không?

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Có khai báo const int N; mà ko phải là const int N = 10; có '= ...' phía sau bao giờ chưa @.@ Hằng số mà ko có giá trị thì là hằng số gì?


    đương nhiên là được. Nhưng chậm hơn const& vì phải copy biến truyền vào qua 1 biến tạm a (xài tới copy ctor).

    Khi nào xài tham trị: khi giá trị truyền vào cần thay đổi, nhưng biến truyền vào ko thay đổi.
    Khi nào xài const&: khi giá trị truyền vào ko thay đổi, và biến truyền vào cũng ko thay đổi.

    phép gán thì chỉ yêu cầu biến truyền vào bên vế phải ko thay đổi nên có thể xài cả tham trị lẫn const&. Nếu kĩ hơn thì const& vẫn đúng hơn (và có bonus là lẹ hơn)

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Vâng. Câu đầu em nhầm ợ. Dốt quá

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Để tốc độ cao hơn nữa thì nên làm thêm hàm này:

    Mã:
    vector& operator= (vector && m) ;

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •