• 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
Bài viết: 11
Ngày tham gia: T.Hai 21/11/2011 4:52 pm
Has thanked: 6 time

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

Gửi bàigửi bởi binh44tito » T.Tư 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:

Mã: Chọn hết

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;
}




Mã: Chọn hết

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



Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

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

Gửi bàigửi bởi dazzlingvit » T.Năm 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
Bài viết: 11
Ngày tham gia: T.Hai 21/11/2011 4:52 pm
Has thanked: 6 time

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

Gửi bàigửi bởi binh44tito » T.Tư 16/05/2012 2:52 pm

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

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

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

Gửi bàigửi bởi dazzlingvit » T.Tư 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 :)


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

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách