Quá tải operator

Viết các hàm quá tải operator thực hiện các phép cộng, trừ, nhân, chia 2 số phức, 2 ma trận
Gợi ý cho e code của phép cộng, các phép tính còn lại để e tự quẩy :3.

Em muốn làm cho Class hay chỉ là viết hàm thôi?

2 Likes

Cho class ạ
A gợi ý giúp em ạ

1 Like

Ở đây anh làm ví dụ về operator+

#include <iostream>

class SoDacBiet
{
public:
    SoDacBiet(int giatri) : _giatri(giatri) // khởi tạo giá trị cho _giatri = giatri
    {}
    ~SoDacBiet()
    {}
    int operator+(const SoDacBiet& soKhac) // ở đây trả về int, trong trường hợp khác phải trả về kiểu phù hợp
    {
        return _giatri + soKhac._giatri;
    }
    friend std::ostream& operator<<(std::ostream& out, const SoDacBiet& soDacBiet) // ví dụ về <<
    {
        out << soDacBiet._giatri;
        return out;
    }
    friend std::istream& operator>>(std::istream& in, SoDacBiet& soDacBiet) // ví dụ về >>
    {
        return in >> soDacBiet._giatri;
    }
private:
    int _giatri;
};

int main()
{
    SoDacBiet soDaoHoa(3);
    SoDacBiet soKho(4);
    std::cout << soDaoHoa + soKho << std::endl;
    std::cout << "Nhap vao gia tri moi cho soKho ";
    std::cin >> soKho;
    std::cout << "Gia tri moi cua so kho: " << soKho << std::endl;
    return 0;
}

Em có thể xem thêm ví dụ về class template (phức tạp hơn)

Hoặc xem bài giảng này, tiếng khó nghe 1 chút, có điều kiện anh sẽ làm lại video này

2 Likes

Hê hê, cảm ơn a về cái đoạn code mẫu ví dụ kia nhá, e làm đc operator + 2 số phức rồi.

#include<iostream>
#include<cmath>
using namespace std;
class sophuc{
	
	public:
		int real, img;
		sophuc(){ real=0 ; img=0; }
		sophuc(int r, int i){ real=r ; img =i; }
		operator int() {return real+img;}
};
sophuc operator +(sophuc& a , sophuc& b){
	sophuc tmp(a.real+b.real , a.img+b.img);
	return tmp;
}
sophuc operator +=(sophuc& a , sophuc& b){
	sophuc tmp(a.real+b.real , a.img+b.img);
	a=tmp;
	return a;
}
ostream &operator <<( ostream& strm, sophuc& a){
	if(a.img==0) cout<<a.real;
	else if(a.img<0){
		cout<<"So phuc: "<<a.real<<a.img<<"i"<<endl;
	}
	else{
		cout<<"So phuc: "<<a.real<<"+"<<a.img<<"i"<<endl;
	}
}
int main(){
	sophuc a(1,2), b(2,3),c;
	c=a + b;
	cout<<c;
	return 0;
}
3 Likes

“Người thảo luận để tìm ra cách giải hay cho một bài toán khó sẽ trở thành lập trình viên giỏi. Người hay hỏi bài tập thì không” Wow, @phatnguyen em đã thực hiện được câu này rồi hehe. Có gì thắc mắc tiếp tục hỏi nha, em hỏi nhiều anh giỏi hơn.

3 Likes

Hì, e làm tiếp các cái còn lại đây ạ
Cảm ơn a nhiều, rất nhiệt tình ạ

1 Like

Khi nào làm xong hết cả bài thì share lên cho mọi người xem thử nhé. Anh cũng muốn xem thử cái số Phức nó làm như thế nào.

2 Likes

Phép chia số phức e vẫn chưa ép kiểu được, kết quả vẫn ko đúng, còn lại là xong ạ. E đang làm các phép toán với ma trận

1 Like

Good luck :smile: Anh thấy em học nghiêm túc đấy, chúc em thành công nhé.

1 Like

Hi, chỗ này cho mình hỏi, sao ta ko trả về là sophuc& mà lại trả về là sophuc. :smile:

Chỗ này trả về sophuc&sophuc có công dụng khác nhau.

  • Khi trả về sophuc tức là mình trả về giá trị của một biến sophuc.
  • Khi trả về sophuc& tức là mình trả về biến (hay nói cách khác là reference) sophuc

Công dụng của giá trị thì nó chỉ là giá trị thôi. Công dụng của reference là gì nếu ọi người chưa nắm thì xem

Nói ngắn gọn, nếu trả về là reference thì mình có thể tiếp tục xử lý trên cái biến trả về, tương đương với xử lý lên chính biến đó.

Nhưng trong trường hợp operator+= thì có lẽ mình không cần phải trả về reference vif mình không có nhu cầu tính tiếp trên số đó.

Nhưng với operator++ thì có lẽ là mình cần. Vì thông thường ta có thể tính tiếp trên biến đó, sau phép ++.

Ví dụ nhé, trong ví dụ này, mình cần trả về luôn cái reference của x để tiếp tục tính cho phép gán =

    int x = 0;
    x= --x -2;

Về phần ví dụ này có thể chưa chuẩn, để Đạt hỏi thêm một anh nữa để confirm lại.

Bổ sung thêm về phần operator>>operator<< ở code mẫu ở trên. Đạt đã trả về reference của std::istreamstd::ostream để ta tiếp tục làm việc trên operator này.

Ví dụ này sẽ dễ hiểu hơn. Ở đây ta có thể liên tục sử dụng operator<< vì ta trả về reference của nó.

    std::cout << "hello" << " ," << "word" << std::endl
3 Likes

Em có ý kiến ở phần:

Theo e thì mình tùy trường hợp phép toán “++” của mình là prefix hay postfix. Nếu là prefix (vd: ++a) thì minh return là reference tới new value của mình, còn nếu là postfix (vd: a++) thì mình sẽ return copy value của mình

Mình return reference là để optimize hơn, đỡ tốn cost trong việc copy constructor & destructor của biến tạm lúc return về.

2 Likes

Chính xác, lúc anh viết anh cũng có nghĩ tới cái này, nhưng anh lười quá không viết rõ ra.

Cũng là một ý kiến chính xác nữa, cái này anh quên :smile:

Anh cũng bổ sung thêm cái này nữa. Trong ví dụ dưới đây cái prefix mình nên trả về &

class Number 
{
    public:
        Number& operator++ ()     // prefix ++
        {
           // Do work on this.   (increment your object here)
           return *this;
        }

        // You want to make the ++ operator work like the standard operators
        // The simple way to do this is to implement postfix in terms of prefix.
        //
        Number  operator++ (int)  // postfix ++
        {
           Number result(*this);   // make a copy for result
           ++(*this);              // Now use the prefix version to do the work
           return result;          // return the copy (the old) value.
        }
}; 
5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?