Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 24 kết quả

Đề tài: Bản chất của toán tử >> << và khả năng đa năng hóa >> << C++ (toán tử xuất nhập)

  1. #1
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Mặc định Bản chất của toán tử >> << và khả năng đa năng hóa >> << C++ (toán tử xuất nhập)

    Chap ?? : Đa năng hóa toán tử << và >>

    I. Tìm hiểu về ý nghĩa của << và >> trong việc xuất nhập trong C++
    Tìm hiểu về 2 toán tử << >>
    + Trong C : nó là toán tử 2 ngôi, khi tham số là 2 số nguyên thì được biết với cái tên dịch bit

    + Trong C++ :
    Ngày hôm nay học về toán tử << và toán tử >> . Lúc đầu cảm thấy rất khó hiểu, về sau quyết định về nhà tìm hiểu bằng được họ hàng và gốc rễ thằng toán tử này mới được. Và sau 3h ngồi đọc mấy cái file .h ở trong thư mục BC. Đã phát hiện ra rất nhiều điều lý thú sau đây :
    1. Xèng khẳng định đây là 1 toán tử bình thường có 2 toán hạng tham gia. Nó ko phải là 1 thứ đặc biết gắn liền với cin như các bạn nghĩ. Có nghĩa là ko phải cứ >> là phải đi liền với cin và << phải đi cùng với cout.
    >> và << là 1 toán tử bình thường như + - * / mà trong đó cin, cout là 1 trong 2 thành phần tham gia vào phép toán mà thôi.
    Ví dụ : a+b :đây là phép toán bao gồm 2 thành phần là a và b
    cin>>a :đây là phép toán bao gồm 2 thành phần là cin và a
    chứng minh :
    Xèng viết đoạn code sau và nó chạy hoàn toàn đúng :
    PHP Code:
    #include <iostream.h>
    #include <conio.h>

    class phanso
        
    {
            private:
                
    int t// tu
                
    int m// mau
            
    public:
                
    friend void operator>>(phanso &,istream &);
                
    friend void operator<<(phanso,ostream&);
        };
    void operator>>(phanso &x,istream &is)
        {
            
    is>>x.t>>x.m;
        }
    void operator<<(phanso x,ostream &os)
        {
            
    os<<x.t<<"/"<<x.m;
        }
    void main(void)
        {
            
    clrscr();
            
    phanso a;
            
    a>>cin;
            
    a<<cout;

            
    getch();
        } 
    Tại sao xèng lại cố tình để kiểu dữ liệu trả về là void tôi sẽ trình bày ở đoạn dưới.
    Tại sao xèng lại cố tình thay đổi vị trí của 2 thành phần tham gia, tại sao xèng lại a>>cin??
    Vì xèng muốn khẳng định với các bạn rằng đây là 2 toán tử hoàn toàn bình thường như + - * / mà thôi. Nội tại nó ko có quy tắc gì đặc biệt cả.
    Cái đặc biệt nằm trong thằng cin, cout. Thằng cin, cout nó có kiểu dữ liệu là istream và ostream.
    Xèng đã đổi vị trí 2 thành phần và dùng a>>cin và a<<cout để chứng tỏ rằng, toán từ này hoàn toàn bình thường, ko phải bị gò bó trong 1 quy tắc.




    2. Giải thích thành phần 2 tham số :
    Ta có : istream & operator >> (istream& is, phanso &x)
    Ta thấy rõ ràng ở đây có 2 tham số.
    1 là is có kiểu dữ liệu là istream& tương ứng với cin.
    cin được định nghĩa trong iostream như sau :
    PHP Code:
    istream_withassign _Cdecl cin
    Vì vậy khi ta cin>>a chính là ta truyền thằng cin vào và trở thành toán hạng đầu tiên, a là toán hạng tiếp theo
    PHP Code:
    #include <iostream.h>
    #include <conio.h>

    class phanso
        
    {
            private:
                
    int t// tu
                
    int m// mau
            
    public:
                
    friend void operator>>(istream &,phanso &);
        };
    void operator>>( istream &isphanso &x)
        {
            
    is>>x.t>>x.m;
            
    //cin>>x.t>>x.m
        
    }

    void main(void)
        {
            
    clrscr();
            
    phanso a;
        
                          
    cin>>a;
            
    getch();
        } 
    Dùng cin hay is ?
    Cái ta sẽ truyền vào chính là cin.
    Nếu is ở đây chỉ là 1 tham biến hình thức, khi ta gọi cin>>a thì cin được truyền vào. Và cái is>>x.t>>x.m; lúc nãy cũng đơn giản chính là cin>>x.t>>x.m
    Ok?
    3. Giải thích tại sao phải trả về kiểu dữ liệu istream & và việc return
    Như đã thấy ở trên. Xèng có thể dùng kiểu dữ liệu void. Nó vẫn hoàn toàn đúng. Ko có gì sai cả. vậy tại sao người ta ( thầy phạm văn ất, thầy quách tuấn ngọc) lại để kiểu dữ liệu trả về là istream &.
    Điều đầu tiên ở bài 1 ,2 trên của xèng chỉ có thể dùng cin với 1 đối tượng chứ ko thể cin liên tiếp nhiều đối tượng. ko thể cin>>a>>b được. ha ha ha.

    Nếu đổi về như này istream & operator>>( istream &is, phanso &x)) và return is thì lại có thể cin>>a>>b liên tiếp được
    Giải thích nha
    PHP Code:
    #include <iostream.h>
    #include <conio.h>

    class phanso
        
    {
            private:
                
    int t// tu
                
    int m// mau
            
    public:
                
    friend istream operator>>(istream &,phanso &);
        };
    istream operator>>( istream &isphanso &x)
        {
            
    is>>x.t>>x.m;
            
    //cin>>x.t>>x.m
                          
    return is;
        }

    void main(void)
        {
            
    clrscr();
            
    phanso a,b,c;
        
                          
    cin>>a>>b>>c;
            
    getch();
        } 
    cin>>a>>b>>c;
    + đầu tiên : 1 biểu thức toàn toán tử >> , toán tử này được ưu tiên thực hiện từ trái qua phải.
    + Vậy cin>>a được thực hiện trước. >> đã được đa năng hóa, thực hiện với 2 thành phần, thành phần 1 là cin và a
    + Sau đó return is cái gì được return ???? chính là cin. Vậy cin được trả về.
    Biểu thức lúc này trở thành : (a đã được nhập)
    cin>>b>>c
    + biểu thức vẫn toàn toán tử >> , toán tử này được ưu tiên thực hiện từ trái qua phải. vậy cin>>b tiếp tục được thực hiện và trả về cin. Sau khi nhập xong b thì trả về cin và biểu thức lại trở thành cin>>c;
    Hj hj hj hj
    Ok?


    More linh tinh thêm: ngoài ra chúng ta hoàn toàn có thể dùng cerr và clog để in ra màn hình
    PHP Code:
    #include <iostream>
    using namespace std;

    void main()
    {
        
    cerr<<"abc";
        
    clog<<"egd";

    đây cũng là 2 đối tượng khác


    II. Bản chất của nó
    + nó là toán tử 2 ngôi
    + giá trị trả về : khi đa năng hóa toán tử này chúng ta thường trả về tham chiếu đến cin và cout
    + thứ tự ưu tiên của nó từ trái sang phải
    ==> phép đa năng hóa không bắt buộc phải trả về
    ==> phép đa năng hóa bắt buộc phải có 1 tham số nếu là phương thức của lớp
    ==> phép đa năng hóa bắt buộc phải có 2 tham số nếu là global function


    III. Code đa năng hóa mẫu
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. #include <conio.h>
    4.  
    5.  
    6. class phanso
    7. {
    8. private:
    9.     int tu; // tuso
    10.     int mau; // mauso
    11. public:
    12.     friend istream& operator>>(istream &,phanso &);
    13.     friend ostream& operator<<(ostream&,const phanso &);
    14. };
    15. istream& operator>>(istream &is,phanso &x)
    16. {
    17.     return is>>x.tu>>x.mau;
    18. }
    19. ostream& operator<<(ostream &os,const phanso &x)
    20. {
    21.     return os<<x.tu<<"/"<<x.mau;
    22. }
    23. void main(void)
    24. {
    25.     phanso a;
    26.     cin>>a;
    27.     cout<<a;
    28.  
    29.     getch();
    30. }
    IV. Chú ý và ngoại lệ
    chú ý quan trọng vô cùng khi làm việc với toán tử đó là thứ tự ưu tiên và chiều ưu tiên của toán tử

    IV. Mở rộng

    endl, hex, oct được định nghĩa như nào ?


    hôm nay có người hỏi tôi câu hỏi rất hay như này
    endl nó được định nghĩa như này ?

    PHP Code:
    ostreamendl ostreamos )
    {
           
    os.push('\n');
           return 
    os;

    vậy thì câu lệnh
    cout<<endl;
    ko hiểu thằng endl được truyền tham số vào như nào



    câu hỏi khá hay và khá ảo, bạn ơi vấn đề là thằng toán tử << có 1 hàm overload như này
    tôi demo lại cho dễ hiểu nha

    PHP Code:
    friend ostreamoperator<<(ostream &osostream& (*p)(ostream&) )
    {
           return 
    p(os);





    More :
    Trích dẫn Nguyên bản được gửi bởi plus Xem bài viết
    1. Kết quả trả về là istream& có ý nghĩa gì vậy bạn, trả ề istream không được à ???
    2. Đối tượng " istream &is " sao phải là tham biến ??. để tham trị có sao không ?
    3.
    Code:
    ostream& operator <<(ostream &os, CNgay x)
    {
        os <<"Ngay "<<x.ngay<<" Thang "<<x.thang<<" Nam "<<x.nam<<" \n";
            return os;
    }
    theo slide thì CNgay &x , nhưng ở trên mình chỉ khai báo CNgay x thì vẫn xuất được kết quả thậm chí còn xuất được trên một dòng nữa !!!???
    chà chà,
    xem ra bạn cũng khá tìm tòi đây
    1. trả về istream& để trả về tham chiếu đến 1 global object cin chứ ko phải copy lại 1 cin

    2. ko ai người ta lại để tham số trong việc xuất nhập với dòng cin, cout , là 1 object của 1 user define class cả, đó là 1 điều tuyệt nhiên rất ít dùng, vì sao thì phải tìm hiểu thêm về
    + lợi ích của việc dùng tham chiếu
    + shadow copy là gì, xảy ra khi nào, hạn chế điều phối ra sao

    3.code chuẩn người ta làm thế này bạn à
    ostream& operator <<(ostream &os,const CNgay &x)



    V. Câu hỏi hay
    Ngày trước khi mới học C++, cô giáo dạy tôi có hỏi tôi 1 câu (cô mới ra trường)là "Quang ơi, sau khi đa năng hóa toán tử xuất nhập ở cả lớp cha và lớp con thì làm sao trong biểu thức đa năng của lớp cha gọi biểu thức đa năng của lớp con".... Tôi hiểu câu hỏi này tựa như là tìm cách dùng từ khóa super của java trong C++ ý.
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4.  
    5. class nguoi
    6. {
    7. private:
    8.     int chieucao;
    9.     int cannang;
    10. public:
    11.     friend istream& operator>>(istream &is,nguoi &a);
    12. };
    13. istream& operator>>(istream &is,nguoi &a)
    14. {
    15.     cout<<"Nhap chieu cao va can nang :";
    16.     return cin>>a.chieucao>>a.cannang;
    17. }
    18.  
    19. class giaovien:public nguoi
    20. {
    21. private:
    22.     int luongthang;
    23. public:
    24.     friend istream& operator>>(istream &is,giaovien &a);
    25. };
    26. istream& operator>>(istream &is,giaovien &a)
    27. {
    28.     //làm sao để gọi toán tử >> của lớp con để ko phải làm lại những việc đã khai báo ở lớp cha
    29.     cout<<"Nhap vao luong thang : ";
    30.     return cin>>a.luongthang;
    31. }
    32.  
    33. void main()
    34. {
    35.  
    36. }


    Và đây là giải pháp tôi đề ra
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. #include <conio.h>
    4.  
    5.  
    6. class nguoi
    7. {
    8. private:
    9.     int chieucao;
    10.     int cannang;
    11. public:
    12.     friend istream& operator>>(istream &is,nguoi &a);
    13. };
    14. istream& operator>>(istream &is,nguoi &a)
    15. {
    16.     cout<<"Nhap chieu cao va can nang :";
    17.     return cin>>a.chieucao>>a.cannang;
    18. }
    19.  
    20. class giaovien:public nguoi
    21. {
    22. private:
    23.     int luongthang;
    24. public:
    25.     friend istream& operator>>(istream &is,giaovien &a);
    26. };
    27. istream& operator>>(istream &is,giaovien &a)
    28. {
    29.     cin>>(nguoi&)a; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    30.     cout<<"Nhap vao luong thang : ";
    31.     return cin>>a.luongthang;
    32. }
    33.  
    34. void main()
    35. {
    36.     giaovien x;
    37.     cin>>x;
    38.     getch();
    39. }
    Đã được chỉnh sửa lần cuối bởi langman : 21-04-2011 lúc 06:10 PM.
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  2. #2
    Ngày gia nhập
    07 2009
    Nơi ở
    KTX Đại học Quốc gia - TP HCM
    Bài viết
    252

    cái này hay quá, thanks bạn nhìu. học C++ rùi nhưng hok hề để ý mấy cái này, cứ tưởng nó chỉ là một quy ước lệnh thui chớ
    You are not what you believe. But if you believe, you'll be

  3. #3
    Ngày gia nhập
    11 2008
    Nơi ở
    www.freelancer.com
    Bài viết
    75

    Quá hay ..
    Thank nhiều lắm ...
    Hiring someone to help someone else!

  4. #4
    Ngày gia nhập
    12 2009
    Nơi ở
    bế quan tu lại
    Bài viết
    846

    thanks bạn rất nhiều

  5. #5
    Ngày gia nhập
    03 2008
    Bài viết
    1

    Red face Cảm ơn

    Quá ngon !!
    Nhờ bài viết của bạn mà mình ngộ ra nhiều điều, cảm ơn nhìu nhìu

  6. #6
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mặc định Bản chất của toán tử >> << và khả năng đa năng hóa >> << C++ (toán tử xuất nhập)

    Cái này biết từ lâu, nhưng chưa thử bao giờ, dù sao cũng thank xeng cái

  7. #7
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    Tìm hiểu về 2 toán tử << >>
    Sao giống toán tử Dịch bít thế nhỉ? Tí nữa thì nhầm cái này, hì hì. Cảm ơn chú vì bài viết.

  8. #8
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    nó là toán tử 2 ngôi
    khi tham số là 2 số nguyên thì được biết với cái tên dịch bit
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  9. #9
    Ngày gia nhập
    10 2010
    Bài viết
    1

    cái này hay quá!nhưng các bạn cho tớ hỏi.để nhập 1 lần nhiều biến thì phải làm sao?
    cú pháp của thầy tớ như thế này nè:
    cout<<"nhap"<<'char';
    cin>>'n';
    cin>>'k';
    tớ ko hiểu được!các bạn giúp mình nhé

  10. #10
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi quang_dk Xem bài viết
    cái này hay quá!nhưng các bạn cho tớ hỏi.để nhập 1 lần nhiều biến thì phải làm sao?
    cú pháp của thầy tớ như thế này nè:
    cout<<"nhap"<<'char';
    cin>>'n';
    cin>>'k';
    tớ ko hiểu được!các bạn giúp mình nhé
    làm ơn qua box hỏi đáp đặt câu hỏi
    cảm ơn
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

Các đề tài tương tự

  1. C++ Tutorial Bản chất của toán tử và đa năng hóa toán tử (nâng cao về C và C++)
    Gửi bởi langman trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 11-01-2019, 05:08 PM
  2. Trả lời: 2
    Bài viết cuối: 21-05-2013, 10:25 PM
  3. C++ Tutorial Bản chất của toán tử ++ -- và khả năng đa năng hóa ++ --
    Gửi bởi langman trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 25-09-2012, 01:11 PM
  4. C++ Tutorial Bản chất của toán tử coma và khả năng đa năng hóa coma C++ (toán tử dấu phẩy)
    Gửi bởi langman trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 23-03-2011, 05:36 AM
  5. Bài tập C++ Cách xây dựng Lớp Matrix và đa năng hóa toán tử xuất nhập
    Gửi bởi badboy91x trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 25-11-2010, 04:14 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn