Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: 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++)

  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à đa năng hóa toán tử (nâng cao về C và C++)

    Chap 1 : Dẫn nhập


    Lâu rồi lại muốn viết 1 bài tut ý nghĩa, nên hôm nay quyết định làm 1 tut đi từ đầu đến cuối về toán tử, một vấn đề quan trọng nhưng lại ít được để ý tới
    Mục tiêu :
    + Đối với người mới học C : nắm được bản chất của toán tử trong lập trình các ngôn ngữ lập trình nói chung , C nói riêng
    + Đối với người mới học C++ : hiểu và nắm vững được các kĩ năng đa năng hóa toán tử

    Yêu cầu :
    + Có kiến thức cơ bản về lập trình C
    + Để học về đa năng hóa cần có kiến thức cơ bản về class trong C++

    II. Toán tử và các điều cần chú ý
    Đối với dân lập trình chúng ta thì toán tử như là nước chấm ngày nào cũng xài vậy, mà cũng ko mấy ai hiểu hết chúng! Mặc dù đã có 4 năm nghiên cứu và học tập C/C++ nhưng thật sự cho đến khi bắt đầu viết bài viết này thì tôi vẫn chưa trả lời ngôn ngữ C++ có bao nhiêu toán tử ?


    1. Toán tử là 1 trong những thành phần tất yếu của ngôn ngữ lập trình, tất cả chúng ta đều biết. À, nó đơn giản như là a+b, 2-3, 2*4, rồi thì nhiều bạn còn biết như là ?: / .....etc....

    2. Phân biệt toán tử đối với toán tử ta phải nhớ : cùng 1 cách viết có thể có 2 toán tử khác nhau.
    Ví dụ như này, * toán tử này ai cũng biết rồi đúng ko, nhưng tôi nói nè, bạn chưa biết nó đâu! Thật đó, nếu viết như thế tôi cũng chả biết bởi vì có 2 toán tử được viết như thế trong C, 1 cái * là 2 ngôi- phép nhân, 1 cái * là 1 ngôi toán tử truy xuất


    3. Phân loại toán tử về cơ bản toán tử được chia ra làm 3 loại với những đặc thù khác nhau
    • Unary operator - Toán tử 1 ngôi
    • Binary operator - Toán tử 2 ngôi
    • Tenary operator - Toán tử 3 ngôi


    4. Một số đặc thù khi sử dụng toán tử
    + Toán tử 1 ngôi luôn luôn đứng trước toán hạng
    + Có một số toán tử 2 ngôi ko yêu cầu phải truyền thêm tham số thứ 2
    + Chỉ có duy nhất 1 toán tử 3 ngôi trong C/C++, nên ta có thể hiểu luôn tenary operator cũng chính là toán tử đó (cho đến giờ là như thế)


    5. Sai lầm khi sử dụng toán tử (quan trọng)
    + Sai lầm khi dùng toán tử /
    Về cơ bản thì các bạn mới rất hay lầm về toán tử / (division)
    ví dụ như là
    C++ Code:
    1. float a;
    2. int b=2;
    3. a=3/4;<<<<<<< rồi chả hiểu sao a toàn bằng 0
    4. a=1/b;<<<<<<< rồi chả hiểu sao a kiểu này vẫn là 0

    C++ Code:
    1. int a=2,b=4;
    2. ..... ..... a/b <<< kết quả cũng ko được như ý muốn

    Khi sử dụng toán tử / cần chú ý :
    • Khi cả 2 toán tử thuộc dạng nguyên thì nó là phép chia lấy phần nguyên, ví dụ 9/6 được 1, 13/6 được 2
    • Khi 1 trong 2 toán tử thuộc dạng số thực thì nó sẽ là phép chia thập phân bình thường, ví dụ 1/3 được 0.33333333333

    ===========> giải pháp đó là chuyển kiểu:
    ------------- chính thức : (float)a/b trong C và C++ thêm 1 cách đó là float(a)/b
    ------------- mẹo :1.*a/b và b/2. và 1./b

    + Sai lầm khi dùng toán tử ép kiểu trong C++
    Sai lầm này thì ko ít người gặp, kể cả tôi đã từng chứng kiến nhiều giáo viên bị lầm cơ.
    Vâng, khẳng định đầu tiên của tôi đó là, ép kiểu là toán tử , toán tử ép kiểu trong C có dạng (type)
    trong C++ thêm 1 cách đó là type() (chỉ có trong C++, trong C ko hề có)
    và 1 số ngừoi gặp sai lầm thế này

    C++ Code:
    1. float a;
    2. int b=2;
    3. a=float(3/4);<<<<<<< rồi chả hiểu sao a toàn bằng 0
    4. a=double(1/b);<<<<<<< rồi chả hiểu sao a kiểu này vẫn là 0

    C++ Code:
    1. int a=2,b=4;
    2. ..... ..... double(a/b) <<< kết quả cũng ko được như ý muốn

    Tại sao lại sai ? Đơn giản bởi vì nó thực hiện trong ngoặc trước rồi mới ép kiểu ===> kết của vẫn như ở mục một
    Vậy giải pháp ? ----> xem mục 1

    + Sai lầm khi dùng toán tử so sánh
    Sau đây tôi xin đề xuất 2 trường hợp sai lầm trong so sánh
    Trường hợp 1:
    C++ Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. void main()
    4. {
    5.     float a=2.3432;
    6.     if (a==2.3432) printf("bang nhau");        // kết quả là in ra không bằng nhau
    7.     else printf("Khong bang nhau");            // tại sao vậy ?
    8.     getch();
    9. }
    tại vì bạn à, khi ta viết 2.3432 thì đây là 1 hằng số, và kiểu dữ liệu của hằng số này là double!!! Và việc so sánh float và double có trouble đấy bạn à.
    Giải pháp 1: if (a==2.3432f) printf................
    Giải pháp 2: double a=2.3432; ................
    (chú ý các cách double(a)==... hoặc (double)a== đều ko hiệu quả đâu)

    Trường hợp 2:
    C++ Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.     int a=3,b=3,c=3;
    7.     if (a==b==c) printf("bang nhau");  //in ra không bằng nhau
    8.     else printf("Khong bang nhau");    //
    9.     getch();
    10. }
    Tại sao

    Giải pháp : if (a==b&&b==c)..... hoặc if (a==b&&a==c) .........

    Trường hợp 3(tham khảo):
    C++ Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.     int i;
    7.     char str[]="I am from C Viet";
    8.     for(i=-1; i<sizeof(str)-1; i++) //  ko in ra chữ cái nào cả, tại sao ?
    9.         printf("%c", str[i+1]);    //
    10.    
    11.     getch();
    12. }
    Tại sao và giải pháp : tham khảo http://forums.congdongcviet.com/showthread.php?t=50050

    + Sai lầm khi dùng toán tử =
    Một sai lầm rất hay mắc phải đó là ta dùng biểu thức gán trong mệnh đề logic
    ví dụ : if (a=2) .... <<<<<<<< code này ko bao giờ được chấp nhận tại bất kì công ty nào, nên bạn cần chú ý lỗi này

    Đóng góp ý kiện từ kimchung929:
    Code:
     // thay vi viết:
    if(a==2)
    //chuyển thành
    if(2==a)
    //chả may viết cái
    if(a=2)//biên dịch vẫn chạy bình thường nhưng kết quả không như ý muốn
             //mà có thể là thực hiện khối lệnh đúng mãi(trừ a=0) 
    //nếu mà
    if(2=a)// báo lỗi khi biên dịch ngay biến không thể gắn cho hằng được.







    III. Đa năng hóa toán tử


    Câu hỏi
    Có người hỏi như này
    Trích dẫn Nguyên bản được gửi bởi ngoclam00 Xem bài viết
    Học lập trình Hướng đối tượng ,thầy mình cho câu hỏi như sau
    vì sao Các phép toán này không thể tái định nghĩa:
    . .* :: ?: sizeof

    Mình nghĩ mãi mà không ra , tra cũng không có. Bạn nào biết có thể giải thích giùm mình với.
    Cám ơn các bạn nhiều
    Một số toán tử nếu ko thể đa năng hóa được tại sao ?

    thứ nhất : nó đã được xử lý với all kiểu dữ liệu! vậy việc overload sẽ che lấp đi cái nào?
    ++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. class A
    5. {
    6.    
    7. };
    8.  
    9. int operator +(A a,int n) // đa năng hóa ok bới vì tại đây thì phép tính của A và 1 số nguyên chưa xác định
    10. {
    11.     return n;
    12. }
    13.  
    14. double operator +(A a,int n) // ko thể đa năng hóa vì phép tính đã được xác định rồi
    15. {
    16.     return n;
    17. }
    18. void main()
    19. {
    20.    
    21. }


    ta thấy sizeof(bất kì kiểu dữ liệu gì đều được), vậy làm sao có thể đa năng hóa nữa đây


    thứ 2. việc đa năng hóa (nếu có) có thể sẽ mang lại nguy hiểm
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. class A
    5. {
    6.     /*
    7.     //gia su code sau dung,
    8.     int operator sizeof() { return 1;}
    9.    
    10.     */
    11.  
    12.    
    13. };
    14.  
    15. void main()
    16. {
    17.     A a=new A();
    18.     // gia su code tren dung, sizeof tra ve 1
    19.     //, vay thi viec cap phat nay se xin bao nhieu bo nho
    20.    
    21. }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi langman : 21-03-2013 lúc 11:58 AM.
    ^_,^

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

    Bùi Tấn Quang

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

    Chap 2 : Đ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-03-2013 lúc 11:34 AM.
    ^_,^

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

    Bùi Tấn Quang

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

    Chap 3 : Đa năng hóa toán tử ++

    I. Một chút
    _ ++ là toán tử của C, và đương nhiên nó cũng là của C++

    _ Tại sao lại là C++ : nếu bạn nhìn từ C++ bạn sẽ thấy 1 điều "trước hết là C đã, sau đó có thêm những cái mới được cộng vào"

    _ Đa năng hóa toán tử này cũng hơi loằng ngoằng xíu

    _ Toán tử này có độ ưu tiên cao hơn các toán tử thông thường khác

    II. Bản chất của nó
    Thật ra có 2 toán tử ++ khác nhau trong C, đó là tiền tố (prefix) và hậu tố (postfix)
    sự khác nhau giữa tiền tố và hậu tố là gì ? Tiền tố thì là toán tử 1 ngôi, hậu tố là toán tử 2 ngôi
    ++n : tiền tố thì tăng n lên và trả về n
    n++ : hậu tố thì tăng n lên và trả về n-1

    Làm sao tôi có thể phân biệt được đâu là tiền tố, đâu là hậu tố, thằng nào 1 ngôi, thằng nào 2 ngôi, loằng ngoằng quá đi
    vâng, điều này hoàn toàn đơn giản nếu bạn nhớ quy tắc tôi đã đưa ra tại bài viết tổng hợp
    Code:
    Toán tử 1 ngôi luôn luôn đứng trước toán hạng


    _ 2 toán tử này có độ ưu tiên rất cao

    Tiền tố, 1 ngô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 không có 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ó 1 tham số nếu là global function

    Hậu tố, 2 ngô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ố dạng int nếu là phương thức của lớp, tuy nhiên tham số này ko cần có tên
    ==> phép đa năng hóa bắt buộc phải có 2 tham số nếu là global function , tham số thứ 2 bắt buộc phải ở dạng int, ko cần có tên
    ==> các tham số int nói trên mặc định khi gọi sẽ được truyền là 0, ở VC++6 thì ko thể truyền giá trị vào tham số này, nhưng hình như trên 2010 thì có thể

    III. Code đa năng hóa mẫu
    C++ Code:
    1. class phanso
    2. {
    3. private:
    4.     int tu;
    5.     int mau;
    6. public:
    7.     phanso():tu(1),mau(3){}
    8.  
    9.    
    10.     ///* tien to phuong thuc
    11.     phanso operator++()
    12.     {
    13.         tu+=mau;
    14.         return *this;
    15.     }
    16.    
    17.  
    18.     /* tien to ham ban
    19.     friend void operator++(phanso &a)
    20.     {
    21.         a.tu+=a.mau;
    22.        
    23.     } */
    24.  
    25.  
    26.     /* hau to
    27.     void operator++(int)
    28.     {
    29.         phanso x(*this);
    30.         tu+=mau;
    31.         return x;
    32.     } */
    33.  
    34.  
    35.    
    36.     phanso operator++(int a)
    37.     {
    38.         phanso x(*this);
    39.         tu+=a*mau;
    40.         return x;
    41.     }
    42.  
    43.  
    44.     /*hau to friend
    45.     friend phanso operator++(phanso &a,int b)
    46.     {
    47.         phanso x(a);
    48.         a.tu+=a.mau;
    49.         return x;
    50.     }
    51.     */
    52. };
    53.  
    54. void main()
    55. {
    56.     phanso x;
    57.     x++;
    58.     x++;
    59.     ++x;
    60.  
    61.  
    62. }



    Đa năng hóa toán tử -- hoàn toàn tương tự
    ^_,^

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

    Bùi Tấn Quang

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

    Chap 4 : Đa năng hóa toán tử , (comma )

    I. Chứng minh nó là toán tử
    Trước khi đọc bài này chắc là ko ít người cảm thấy sốc khi nghe điều này. Có người sẽ nghĩ tôi chém gió, nhưng xin bạn hãy bình tĩnh vì sau khi xem 1 vài source sau bạn sẽ nghĩ lại đấy
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. #include <conio.h>
    4.  
    5.  
    6. void main()
    7. {
    8.     int a=(3,5);
    9.     double b=(4,6.9);
    10.     cout<<a<<" "<<b; //a=5 và b=6.9
    11.  
    12.     for(int i=0;i<10,NULL;i++) //chả in ra cái gì cả
    13.         cout<<"langman";     // trong cái vòng lặp for này
    14.  
    15.     getch();  
    16. }
    II. Bản chất của nó
    + nó là 1 toán tử có độ ưu tiên thấp gần nhất nên trong ví dụ ở mục I tôi phải dùng () để gom nhóm nó lại (cũng nhờ vậy mà trong các biểu thức a+2,b+3 ko sinh ra lỗi vì nó ưu tiên thấp nhất mà,nên được thự hiện sau cùng)
    + nó là toán tử 2 ngôi
    + giá trị trả về của toán tử này chính là đối tượng thứ 2
    + thứ tự ưu tiên của nó từ trái sang phải
    ==> phép đa năng hóa 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.  
    4. class A
    5. {
    6. public:
    7.         int operator,(A b);
    8.         int operator,(double n);
    9. };
    10.  
    11. int operator,(A a,int c)
    12. {
    13.     return c;
    14. }
    15.  
    16. void main()
    17. {
    18. }


    IV. Chú ý và ngoại lệ
    khi nằm trong cặp () của tiêu đề hàm,nguyên mẫu hàm, lời gọi hàm thì , hoàn toàn khác rồi , ko phải toán tử coma nữa nha
    ^_,^

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

    Bùi Tấn Quang

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

    Toán từ int ..... tối nay viết
    ^_,^

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

    Bùi Tấn Quang

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định 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++)

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    Toán từ int ..... tối nay viết
    Cái tên gây tò mò quá anh ạ. Chưa nghe bao giờ. @@~ Có phải là "operator int()...." Không? Nếu là nó thì phải là toán tử ép kiểu chứ ạ, cụ thể là ép kiểu về int.

    Cái toán tử dấu phẩy, tuy biết lâu rồi, nhưng chưa biết dùng nó vào việc gì cả. Chỉ thấy xuất hiện trong một số ví dụ của thư viện boost. Nếu áp dụng nó vào project của mình thì hơi khoai đấy ạ. Vì nó phá hỏng cấu trúc ngôn ngữ tự nhiên, ít ai nghĩ rằng "," lại là một toán tử.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  7. #7
    Ngày gia nhập
    02 2012
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    ...
    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. }
    theo mình nên sử dụng is và os trong khi định nghĩa chồng toán tử << và toán tử >>
    như sau:
    Code:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    class nguoi {
      private: 
        int chieucao;
        int cannang;
      public: 
        friend istream& operator >> (istream &is, nguoi &a);
        friend ostream& operator << (ostream &os, const nguoi &a);
    };
    istream& operator >> (istream &is, nguoi &a) {
      cout << "Nhap chieu cao va can nang: ";
      return is >> a.chieucao >> a.cannang;
    }
    ostream& operator << (ostream &os, const nguoi &a) {
      return os << "Nhap chieu cao: " << a.chieucao << endl 
                << "Can nang: " << a.cannang << endl;
    }
    
    class giaovien: public nguoi {
      private:
        int luongthang;
      public:
        friend istream& operator >> (istream &is, giaovien &a);
        friend ostream& operator << (ostream &os, const giaovien &a);
    };
    istream &operator >> (istream &is, giaovien &a) {
      is >> (nguoi&) a;
      cout << "Nhap vao luong thang: ";
      return is >> a.luongthang;
    }
    ostream& operator << (ostream &os, const giaovien &a) {
      return os << (nguoi&) a << "Luong thang: " << a.luongthang << endl;
    }
    int main() {
      giaovien x;
      cin >> x;
      cout << x;
      getch();
    }

  8. #8
    Ngày gia nhập
    07 2014
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    Toán từ int ..... tối nay viết
    hẹn tối nay viết mà sao không thấy đâu

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

    chẳng hiểu gì vì em mới học C 3 tuần

  10. #10
    Ngày gia nhập
    07 2012
    Bài viết
    13

    Xin lỗi vì đã đào mộ, nhưng thực sự thì, đề tài này anh langman viết HAY KINH KHỦNG KHIẾP !!!
    Hóng cao nhân vào nối tiếp anh langman để viết về cái "Toán từ int ..... tối nay viết" kia, nếu k có ai thì tiếc quá :(
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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

  1. 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)
    Gửi bởi langman trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 23
    Bài viết cuối: 05-03-2016, 11:46 PM
  2. 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
  3. Con trỏ trên C++ đa năng hóa toán tử
    Gửi bởi nguoix_1010 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 19-07-2012, 10:08 AM
  4. Lập trình C++ Tại sao đa năng hóa toán tử << 2 lần mà chỉ chạy lần đầu tiên
    Gửi bởi hungmaster trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 01-05-2011, 10:48 AM
  5. 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

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