Giải thích phương thức rút gọn phân số

Dòng ghi PhanSo RutGon(); này em không hiểu lắm vì nó không phải constructor nhưng lại gọi tên giống class nên em hoang mang quá ạ. Em mới học hướng đối tượng mong mn giúp. Code ở dưới ạ

#include <iostream>
using namespace std;
// Con trỏ this
// Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành phần
class PhanSo{
    int TuSo, MauSo;
public:
    PhanSo RutGon();
    void Nhap();
    void Xuat();
};

// Cách dùng thứ 1 của Con trỏ this : trỏ(tham chiếu) đến các thành phần của class hiện tại
void PhanSo::Nhap(){
    cout<<"\n Nhap tu so : ";
    //cin>>TuSo;
    cin>>this->TuSo;
    cout<<"\n Nhap mau so : ";
    //cin>>MauSo;
    cin>>this->MauSo;
}

void PhanSo::Xuat(){
    cout<<this->TuSo<<"/"<<this->MauSo;
}

// Không dùng This nữa mà tạo đối tượng PS

PhanSo PhanSo::RutGon(){
    int a,b;
    PhanSo ps;
    ps.TuSo=this->TuSo;
    ps.MauSo=this->MauSo;
//Hàm tìm UCLN thông thường
    a = abs(ps.TuSo);
    b = abs(ps.MauSo);
    while(a!=b){
        if(a>b){
            a=a-b;
        }
        else{
            b=b-a;
        }
    }
    ps.TuSo=TuSo/a;
    ps.MauSo=MauSo/a;
    // Giá trị của this->TuSo và this->MauSo không hề thay đổi
    return ps; // Trả về giá trị của cái Class hiện tại
}


int main(){
    PhanSo ps,ps2;
    ps.Nhap();
    ps2=ps.RutGon(); // ps.TuSo và ps.MauSo không hề thay đổi, chỉ trả về 1 ps đã thay đổi
    //ps hoàn toàn không thay đổi
    ps2.Xuat();
    return 0;
}

Chắc trước giờ học hàm nào cũng void nên giờ không hiểu kiểu trả về là cái gì.
Thảo nào thấy nhiều bạn nói đến hàm là: “hàm void”.

6 Likes

Class?
Mỗi class là một kiểu dữ liệu.
Phương thức trả về kiểu PhanSo cũng không có gì quá đặc biệt so với phương thức trả về kiểu int cả.

4 Likes

Thường rút gọn thì không có trả về đâu :smiley: vì dạng chuẩn (canonical) là phải rút gọn và mẫu dương.

4 Likes

Cảm ơn bạn. Thế cho mình hỏi nếu trả về kiểu PhanSo thì chuyện gì sx xảy ra với class ạ. Nó sẽ làm thay đổi TuuSo và MauSo của class hiện tại à. Theo phần code của đoạn này thế cho phần code định nghĩa phương thức hàm trên:

PhanSo PhanSo::RutGon(){
   int a,b;
 
//Hàm tìm UCLN thông thường
    a = abs(this->TuSo);
    b = abs(thí->MauSo);
    while(a!=b){
        if(a>b){
            a=a-b;
        }
        else{
            b=b-a;
        }
    }
   this->TuSo /= a;
   this -> MauSo /=b;
    return *this;
}
1 Like

Cảm ơn bạn. Mình mới bắt đầu tự học nhưng trong giáo trình không đề cập kĩ phần kiểu trả về của hàm chỉ toàn int với void th

1 Like

Về mặt khái niệm: class là bất biến. PhanSo là duy nhất. Method và function về cơ bản không thể làm thay đổi class, chỉ có thể làm thay đổi dữ liệu của object (đối tượng). psps2 trong đoạn code trên là các object. *this là một object đặc biệt, chỉ xuất hiện trong định nghĩa method, đại diện cho object đang gọi method đó.

this->TuSo /= a;
this -> MauSo /=b;

Đoạn trên làm cho object *this bị thay đổi.

Còn thông thường, với các method dạng trả về dữ liệu khác void thì người ta không làm thay đổi object mà trả về một object mới (một object PhanSo khác, như cách làm ban đầu), trừ khi đó là một method phức tạp hoặc phục vụ các mục đích khác.

Nếu method của bạn là return *this hoặc trả về kiểu void thì việc khai báo một object mới bằng kết quả trả về sẽ không có ý nghĩa gì trong trường hợp này. Code lúc này chỉ cần:

PhanSo ps;
ps.Nhap();
ps.RutGon();
ps.Xuat();
return 0;
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?