30/09/2018, 16:03

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.

Nguyễn Minh Dũng viết 18:11 ngày 30/09/2018

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

Phát Nguyễn viết 18:09 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018

Ở đâ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)

Continuing the discussion from Tổng Hợp C,C++: Hỗ trợ giải tất cả các bài tập C & C++: Tạm thời post thế này đã, có gì sửa sau. @oanh Có gì thắc mắc cứ hỏi ở đây, tối a có thời gian sẽ lên giải thích. Giờ bận tí. #include <iostream> template<class T> class Number { private: T m_data; public: Number(void) : m_data( T() ) {} Number(const T value) : m_data ( value ) {} ~Number(void) {} Number<T>& operator =(const Number<T> & value) { m_data = value…

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

Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây : Thông tin về khóa học xem tại đây : -Sự khác biệt giữa 2 khóa học cũ và mới : +Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả. +Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại..... Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học …
Phát Nguyễn viết 18:04 ngày 30/09/2018

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;
}
Nguyễn Minh Dũng viết 18:08 ngày 30/09/2018

“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.

Phát Nguyễn viết 18:08 ngày 30/09/2018

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 ạ

Nguyễn Minh Dũng viết 18:19 ngày 30/09/2018

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.

Phát Nguyễn viết 18:19 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:05 ngày 30/09/2018

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

ddhuy137 viết 18:09 ngày 30/09/2018

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

sophuc operator +=(sophuc& a , sophuc& b)

Nguyễn Minh Dũng viết 18:19 ngày 30/09/2018

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

Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây : Thông tin về khóa học xem tại đây : -Sự khác biệt giữa 2 khóa học cũ và mới : +Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả. +Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại..... Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học …

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
ddhuy137 viết 18:04 ngày 30/09/2018

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

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 ++.

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

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ố đó.

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ề.

Nguyễn Minh Dũng viết 18:04 ngày 30/09/2018

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

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.

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ề.

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

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.
        }
}; 
stackoverflow.com
Martin York

How to overload the operator++ in two different ways for postfix a++ and prefix ++a?

c++, operator-overloading
answered by Martin York on 03:32PM - 02 Oct 10
Bài liên quan
0