• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tiền tố và Hậu tố và Shift (>><<) trong nạp chồng toán tử

Nơi trao đổi, hỏi đáp về hướng đối tượng (OOP - Object-Oriented Programming), không giới hạn về ngôn ngữ lập trình
binh44tito
Thành viên chính thức
Thành viên chính thức
Posts: 11
Joined: Mon 21/11/2011 4:52 pm
Has thanked: 6 times

Tiền tố và Hậu tố và Shift (>><<) trong nạp chồng toán tử

Postby binh44tito » Wed 25/04/2012 4:33 pm

mình đang làm bài tập về nạp chồng toán tử ++ ( tiền tố hậu tố ) và dấu << của cout << để xuất ra màn hình kiểu dữ liệu của mình. code đã chạy tốt nhưng vẫn còn vài thắc mắc rất mong được giải đáp sau:

Code: Select all

Fraction Fraction::operator++(int t)//++f postfix
{
   Fraction tmp(num, denom);
   num = num + denom;
   denom = denom*1;
   return tmp;
}

Fraction& Fraction::operator++()//f++ pretfix
{
   num = num + denom;
   denom = denom*1;
   return *this;
}




Code: Select all

ostream &operator<<(ostream &os, const Fraction &x)
{
   os << " " << x.num << "/" << x.denom;
   return os;
}

istream &operator >> (istream &in, Fraction &x)
{
   //Get the numerator from user.
   cout<< "Num: ";
   in>>x.num;
   
   //Get the denominator from user.
   cout<< "Denom: ";
   in>>x.denom;
   
   return in;
}



tại sao phải truyền và tạo hàm theo kiểu pass by reference với &?
Nguyên tắc trả về của cout << là trả về num và denom của đối tượng x đã cập nhật nhưng khi chạy thì lại xuất ra giá trị cũ? code cout của mình xuất x.num và x.denom nhưng console lại xuất ra tmp là sao mình ko hiểu?

Rất mong được cao nhân chỉ giáo. Xin cảm ơn rất nhiều



User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

Re: Tiền tố và Hậu tố và Shift (>><<) trong nạp chồng toán t

Postby dazzlingvit » Thu 03/05/2012 7:23 pm

Sở dĩ viết ostream &operator<<(ostream &os, const Fraction &x) và istream &operator >> (istream &in, Fraction &x) là để có thể thực hiện được việc:
  1. cout << "AAA" << i << frac << "BBB";
  2.  

Thứ tự thực hiện như sau:
- cout << "AAA" <=> operator<<(cout, "AAA"), trả về cout (ostream&)
- cout (được trả về ở bước trên) << i <=> operator<<(cout, i)...
- cout << frac <=> operator<<(cout, frac)...
...
Trả về tham chiếu để tất cả các ostream đều là 1. Tất nhiên bạn hoàn toàn có thể nạp chồng theo kiểu của bạn (tức là không trả về ostream&), nhưng nó chỉ không giống "bình thường", cách dùng trông cũng không giống thôi :)
Dazzling V.I.T
Hãy gọi tôi là vịt :)

binh44tito
Thành viên chính thức
Thành viên chính thức
Posts: 11
Joined: Mon 21/11/2011 4:52 pm
Has thanked: 6 times

Re: Tiền tố và Hậu tố và Shift (>><<) trong nạp chồng toán t

Postby binh44tito » Wed 16/05/2012 2:52 pm

dạng như là nối chuỗi đó phải ko anh?

User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

Re: Tiền tố và Hậu tố và Shift (>><<) trong nạp chồng toán t

Postby dazzlingvit » Wed 16/05/2012 8:01 pm

:)
- cout << ... << ... xuất ra lần lượt từng cái một, chứ không phải là nối chuỗi. Bản thân << là toán tử dịch bit, cout là một đối tượng kiểu ostream. Đây không phải nối chuỗi hay xuất chuỗi, nó đơn giản chỉ là toán tử dịch bit của đối tượng cout thôi :)
- Làm việc với chuỗi trong C/C++ có thể sử dụng các hàm xử lý chuỗi như strcpy (chép chuỗi), strcat (nối chuỗi), strcmp (so sánh), strlen (lấy độ dài)... sử dụng tiêu đề string.h hoặc cstring (với C++). Ngoài ra có thể dùng lớp std::string trong (sử dụng tiêu đề string), dùng lớp này trông có vẻ trực quan hơn, nhưng xa rời bản chất của xâu hơn :D
Dazzling V.I.T
Hãy gọi tôi là vịt :)


Return to “Lập trình hướng đối tượng (OOP)”

Who is online

Users browsing this forum: No registered users and 1 guest