SlideShare a Scribd company logo
L P TRÌNH HƯ NG   I TƯ NG V I C++       Smith Nguyen Studio.
    Mét sè tiÖn Ých vµ më réng cña C++ so
                     víi C
M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
   Nh p/xu t d li u s d ng toán t cin và cout
   Vi t chú thích trên m t dòng, khai báo bi n m i nơi, c p phát và thu h i b nh
       ng s d ng toán new và delete,
   Gi i các bài t p có s d ng k thu t ch ng hàm, thâm s ng m nh.

A/ TÓM T T LÝ THUY T
   - C++ là m t s m i r ng c a C, do ó có th s d ng m t chương trình biên d ch
C++      d ch và th c hi n các chương trình vi t b ng C
   - C yêu c u các chú thích n m gi a /* và */. C++ cho phép t o m t chú thích b t u
b ng “//” cho n h t dòng
   - C++ cho phép khai báo tuỳ ý. Th m chí có th khai báo bi n trong ph n kh i t o
c a câu lênh l p for
   - C++ cho phép truy n tham s cho hàm b ng tham chi u. i u này tương t như
truy n tham bi n cho chương trình con trong ngôn ng l p trình PASCAL. Trong l i g i
hàm ta dùng tên bi n và bi n ó s ư c truy n cho hàm qua tham chi u. i u ó cho
phép thao tác tr c ti p trên bi n ư c truy n ch không ph i gián ti p qua bi n tr .
   - Toán t new và delete trong C++ ư c dùng            qu n lý b nh      ng thay vì các
hàm c p phát ng c a C
   - C++ cho phép ngư i vi t chương trình mô t các giá tr ng m nh cho các tham s
c a hàm, nh ó hàm có th ư c g i v i m t danh sách các tham s không .
   - Toán t “::” cho phép truy nh p bi n toàn c c khi ng th i s d ng bi n c c b và
toàn c c cùng tên.
   - Có th    nh nghĩa các hàm cùng tên v i các tham s khác nhau. Hai hàm cùng tên
s ư c phân bi t nh giá tr tr v và danh sách ki u các tham s .
B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...)
   Các l i thư ng g p
    Quên óng */ cho các chú thích
    Khai báo bi n sau khi bi n ư c s d ng
    S d ng l nh return        tr v giá tr nhưng khi nh nghĩa hàm l i mô t hàm ki u
    void ho c ngư c l i, quên câu l nh này trong trư ng h p hàm yêu c u giá tr tr v .
    Không có hàm nguyên m u cho các hàm
    B qua kh i t o cho các bi n tham chi u
    Thay i giá tr c a các h ng
    T o các hàm cùng tên, cùng tham s .
   M t s thói quen l p trình t t
    S d ng “//”     tránh l i không óng */ khi chú thích n m g n trong m t dòng.
    S d ng các kh năng vào ra m i c a C++          chương trình d     c hơn.
       t các khai báo biên lên u kh i l nh.
    Ch dùng t khoá inline v i các hàm “nh ”,”không ph c t p”.
    S d ng con tr         truy n tham s cho hàm khi c n thay i giá tr tham s , còn
    tham chi u dùng       truy n các tham s có kích thư c l n mà không có nhu c u
    thay i n i dung.
    Tránh s d ng bi n cùng tên cho nhi u m c ch khác nhau trong chương trình.



                                                                          Trang 1
L P TRÌNH HƯ NG       I TƯ NG V I C++            Smith Nguyen Studio.
C/ BÀI T P M U
Ví d 1: C++ ch p nh n hai ki u chú thích. Các l p trình viên b ng C ã quen v i
cách chú thích b ng /*…*/. Trình biên d ch s b qua m i th n m gi a /*…*/.

       Xét chương trình sau :

                                                      CT1_1.CPP
               /*
               Chương trình in các s t 0 n 9.                                         1.
               */
               #include <iostream.h>
               void main()
               {
                  int I;
                  for(I = 0; I < 10 ; ++ I)// 0 - 9
                    cout<<I<<"n"; // In ra 0 - 9
               }
                                                                                      2.


      M i th n m gi a /*…*/ t dòng 1 n dòng 3 u ư c chương trình b qua.
      Chương trình này còn minh h a cách chú thích th hai. ó là cách chú thích b t
        u b ng // dòng 8 và dòng 9.

      k t qu




      Nói chung, ki u chú thích /*…*/ ư c dùng cho các kh i chú thích l n g m nhi u
      dòng, còn ki u // ư c dùng cho các chú thích m t dòng.



Ví d 2: Chương trình nh p vào hai s . Tính t ng và hi u c a hai s v a nh p.


            CT1_2.CPP
               #include <iostream.h>
               void main()
               {
                 int X, Y;
                 cout<< "Nhap vao mot so X:";

                                                                      Trang 2
L P TRÌNH HƯ NG      I TƯ NG V I C++          Smith Nguyen Studio.
                 cin>>X;
                 cout<< "Nhap vao mot so Y:";
                 cin>>Y;
                 cout<<"Tong cua chung:"<<X+Y<<"n";
                cout<<"Hieu cua chung:"<<X-Y<<"n";
            }




Ví d 3:
     S d ng toán t xu t nh p              vi t th c ơn cho chương trình:
                                               CT1_2.CPP
                     #include <iostream.h>
                    void menu()
                    {
                       cout<<”          Menu n”;
                       cout<<”1. Cong viec 1n”;
                       cout<<”2. Cong viec 2n”;
                       cout<<”3. Cong viec 3n”;
                       cout<<”4. Ket thuc chuong trinh nn”;
                    }
                    void main()
                    {
                       int lc;
                           do
                               {
                                   // viet menu len man hinh
                               menu();
                               //lay lua chon
                               cout<<”Ban hay chon cong viec can thuc hien:1->4”;cin>>lc;
                               switch(lc)
                                    {
                                           case 1:cout<<”Thuc hien cong viec 1n”; break;
                                           case 2:cout<<”Thuc hien cong viec 2n”; break;
                                           case 3:cout<<”Thuc hien cong viec 3n”; break;
                                    }
                           //lap cho den khi nguoi su dung lua chon 4
                           } while(lc!=4);
           }




Ví d 4:
   Tìm l i sai c a o n chương trình sau:
     int n;
     cin>>n;
     for(int i=0;i<n;i++)
        { int a[100];
           cin>>a[i];
         }
     for(i=0;i<n;i++)
       cout<<a[i];
L ig i
     Chương trình b l i trong vòng for th hai do bi n m ng a không ư c nh nghĩa.
   M ng a ư c khai báo trong vòng for th nh t ch có t m ho t ng trong vòng for
    ó mài thôi. Do v y, chương trình không th bi t trong vòng l p for th hai. Chú ý

                                                                                      Trang 3
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.
    bi n nguyên i ư c khai báo trong dòng l nh for có v trí tương ương v i vi c khai
    báo i bên ngoài for. Vì v y, trong vòng for th hai ta s d ng bi n i nhưng chương
    trình không báo l i.
  Ví d 5:
        Tìm l i sai cho các khai báo prototype hàm dư i ây (các hài này ư c khai báo
trong cùng m t chương trình)
    int func1(int);          // (1)
    float func1(int);        // (2)
    int func1(float);        //(3)
    void func1(int=0,int); //(4)
    void func2(int,int=0); //(5)
    void func2(int);          //(6)
    void func2(float);        //(7)
L i g i:
    Trong nh nghĩa ch ng hàm, trình biên d ch phân bi t các hàm b i ki u d li u tr
ra c a hàm mà ch phân bi t b i danh sách tham s c a hàm. Do v y hàm 1 và hàm 2
b nh nghĩa ch ng lên nhau và trình biên d ch báo l i. Gi a hàm 2 và hàm 3 không có
l i b i chúng khác nhau b i ki u d li u c a tham s . Trong hàm 4 ta ã s d ng sai
cách truy n giá tr m c nh cho tham s . Không báo gi truy n giá tr m c nh cho
m t tham s trư c m t tham s không ư c truy n giá tr ng m nh.
    Trong cách nh nghĩa hai hàm 5 và 6 có s nh p nh ng. Khi ta g i hàm func2 v i
tham s là m t s nguyên thì trình biên d ch không bi t là s g i hàm 5 hay hàm 6 b i
vì c hai hàm này u ư c. Trong trư ng h p này trình biên d ch cũng thông báo l i.
Ví d 6:
      Tìm l i sai(l i cú pháp và b nh ) cho chương trình sau:
        int & refl()
          {
            int a=5;
           return a;
          }
        int & rè2(int a)
          {
            a++;
            return a;
          }
        int & ref3(int & a)
         {
            a++;
            return a;
         }
         int a=5;
         int &r1;
         int &r2=22;
         int &r3=a;
         int &r4=ref3(5);
         int &r5=ref3(a);
Tr l i:
    Trong các hàm có k t qu tr v là m t tham chi u, chúng ta luôn ph i chú ý r ng
bi n ư c tr l i có giá tr là tham chi u không b xoá kho i b nh chương trình khi k t
thúc th c hi n hàm. Do v y hai hàm ref1 và ref2 là sai b i vì nó tr v tham chi u t i
biên mà a l i là bi n c c b trong ref1 và là tham s trong ref2 ch ư c t o ra t m th i


                                                                       Trang 4
L P TRÌNH HƯ NG     I TƯ NG V I C++          Smith Nguyen Studio.
trên stack khi g i hàm và xoá kh i stack khi k t thúc hàm. Hàm ref3 không có l i vì a là
m t tham chi u t i m t bi n không n m trong hàm.
    Trong khái báo các tham chi u ph i ư c g n v i m t bi n nào ó trong b nh . Do
v y các khai báo r1, r2 là sai. L i g i ref3(5) cũng là sai b i vì tham s cho hàm ph i là
tham chi u n m t bi n, trong khi ó ta l i truy n vào h ng s .
Ví d 7:
    Cho bi t k t qu th c hi n chương trình sau:
       #include <iostream.h>
       int & foo(int &a,int b)
       {
          b+=a;
         if (b>5) a++;
         return a;
       }
       void main()
       {
         int i=2,j=4;
         int k=foo(i,j);
         k++;
         cout<<i<<” “<<j<<” “<<k<<endl;
         int &l=foo(i,j);
         l++ ;
         cout<<i<<” “<<j<<” “<<l<<endl;
       }
L i g i:
    Trong chương trình trên c n chú ý hai i m. Thi nh t là ta truy n vào cho hàm
tham chi u c a bi n i ch không ph i bi n i. Do v y, m i thay            i c a tham s này
trong hàm là thay i t i bi n i ư c tham chi u t i. Tương t như v y v i tham chi u
l. Tham chi u l ư c xác l p b ng tham chi u tr ra c a hàm chính là tham chi u t i
bi n i. Do v y m i thay i l chính là thay i i.
Ví d 8:
    Vi t m t hàm hoanvi dùng      hoán v hai s nguyên. Sau ó viêt chương trình nh p
và s p x p m t m ng s nguyên.
Tr l i:
                                              CT1_8.CPP
             #include <iostream.h>
              void hoanvi(int &a,int &b)
                {
                   int tam=a; a=b; b=tam;
                }
                void main()
                {
                   // Nhap du lieu
                   int n;
                   cout<<” Ban hay cho so phan tu cua mang n=”;cin>>n;
                   //Cap phat bo nho cho mang
                   int *a=new int(n);
                   cout<<”n Hay nhap gia tri cho cac phan tu cua mang n”;
                    for(int i=0;i<n;++i)
                       {
                            cout<<”a[“<<i<<”]=”;cin>>a[i];
                       }
                   // Sap xep
                   for(i=0;i<n-1;i++)
                       for(int j=i++;j<n;j++)

                                                                              Trang 5
L P TRÌNH HƯ NG      I TƯ NG V I C++           Smith Nguyen Studio.
                             if (a[i]>a[j]) hoanvi(a[i],a[j]);
                    // In ket qua
                    cout<<”n Cac phan tu cua mang sau khi da sap xep la n”;
                         for(i=0;i<n;i++)
                             cout<<a[i]<<” “;
                   delete a;
           }




Ví d 9: Chương trình t o m t m ng               ng, kh i         ng m ng này v i các giá tr ng u
nhiên và s p x p chúng.
                                                     CT1_9.CPP
               #include <iostream.h>
               #include <time.h>
               #include <stdlib.h>
               void main()
               {
                  int N;
                  cout<<"Nhap vao so phan tu cua mang:";
                  cin>>N;
                  int *P=new int[N];
                  if (P==NULL)
                  {
                     cout<<"Khong con bo nho de cap phatn";
                  }
                  srand((unsigned)time(NULL));
                  for(int I=0;I<N;++I)
                     P[I]=rand()%100; //T o các s ng u nhiên t 0    n 99
                  cout<<"Mang truoc khi sap xepn";
                  for(I=0;I<N;++I)
                     cout<<P[I]<<" ";
                  for(I=0;I<N-1;++I)
                     for(int J=I+1;J<N;++J)
                       if (P[I]>P[J])
                      {
                          int Temp=P[I];
                          P[I]=P[J];
                          P[J]=Temp;
                       }
                  cout<<"nMang sau khi sap xepn";
                  for(I=0;I<N;++I)
                     cout<<P[I]<<" ";
                  delete []P;
                }




      k t qu




                                                                                   Trang 6
L P TRÌNH HƯ NG     I TƯ NG V I C++           Smith Nguyen Studio.
      Ví d 10: Chương trình c ng hai ma tr n trong ó m i ma tr n ư c c p phát
        ng.

      Chúng ta có th xem m ng hai chi u như m ng m t chi u như hình 1.2 dư i ây




      Hình 1.2: M ng hai chi u có th xem như m ng m t chi u.

      G i X là m ng hai chi u có kích thư c m dòng và n c t.

      A là m ng m t chi u tương ng.

      N u X[i][j] chính là A[k] thì k = i*n + j

      Chúng ta có chương trình như sau :

                                                    CT1_10.CPP
             #include <iostream.h>
             #include <conio.h>
             //prototype
             void AddMatrix(int * A,int *B,int*C,int M,int N);
             int AllocMatrix(int **A,int M,int N);
             void FreeMatrix(int *A);
             void InputMatrix(int *A,int M,int N,char Symbol);
             void DisplayMatrix(int *A,int M,int N);
             int main()
              {
                 int M,N;
                 int *A = NULL,*B = NULL,*C = NULL;
                 clrscr();
                cout<<"Nhap so dong cua ma tran:";
                 cin>>M;
                 cout<<"Nhap so cot cua ma tran:";
                 cin>>N;
                 //C p phát vùng nh cho ma tr n A
                 if (!AllocMatrix(&A,M,N))
                 { //endl: Xu t ra kí t xu ng dòng (‘n’)
                     cout<<"Khong con du bo nho!"<<endl;
                     return 1;
                }
                 //C p phát vùng nh cho ma tr n B
                 if (!AllocMatrix(&B,M,N))
                 {

                                                                  Trang 7
L P TRÌNH HƯ NG    I TƯ NG V I C++           Smith Nguyen Studio.
                  cout<<"Khong con du bo nho!"<<endl;
                  FreeMatrix(A);//Gi i phóng vùng nh A
                  return 1;
              }
              //C p phát vùng nh cho ma tr n C
              if (!AllocMatrix(&C,M,N))
              {
                  cout<<"Khong con du bo nho!"<<endl;
                  FreeMatrix(A);//Gi i phóng vùng nh A
                  FreeMatrix(B);//Gi i phóng vùng nh B
                  return 1;
              }
              cout<<"Nhap ma tran thu 1"<<endl;
              InputMatrix(A,M,N,'A');
              cout<<"Nhap ma tran thu 2"<<endl;
              InputMatrix(B,M,N,'B');
              clrscr();
              cout<<"Ma tran thu 1"<<endl;
              DisplayMatrix(A,M,N);
              cout<<"Ma tran thu 2"<<endl;
              DisplayMatrix(B,M,N);
              AddMatrix(A,B,C,M,N);
              cout<<"Tong hai ma tran"<<endl;
              DisplayMatrix(C,M,N);
              FreeMatrix(A);//Gi i phóng vùng nh A
              FreeMatrix(B);//Gi i phóng vùng nh B
              FreeMatrix(C);//Gi i phóng vùng nh C
              return 0;
            }
            //C ng hai ma tr n
            void AddMatrix(int *A,int *B,int*C,int M,int N)
            {
               for(int I=0;I<M*N;++I)
               C[I] = A[I] + B[I];
            }
            //C p phát vùng nh cho ma tr n
            int AllocMatrix(int **A,int M,int N)
            {
               *A = new int [M*N];
               if (*A == NULL)
                   return 0;
               return 1;
            }
            //Gi i phóng vùng nh
            void FreeMatrix(int *A)
            {
               if (A!=NULL)
                   delete [] A;
            }
            //Nh p các giá tr c a ma tr n
            void InputMatrix(int *A,int M,int N,char Symbol)
            {
               for(int I=0;I<M;++I)
               for(int J=0;J<N;++J)
              {
                   cout<<Symbol<<"["<<I<<"]["<<J<<"]=";
                   cin>>A[I*N+J];
               }
            }
            //Hi n th ma tr n
            void DisplayMatrix(int *A,int M,int N)
            {

                                                               Trang 8
L P TRÌNH HƯ NG      I TƯ NG V I C++             Smith Nguyen Studio.
                for(int I=0;I<M;++I)
                {
                  for(int J=0;J<N;++J)
                 {
                    out.width(7);//Hien thi canh le phai voi chieu dai 7 ky tu
                    cout<<A[I*N+J];
                   }
                cout<<endl;
                }
            }




      k t                                                                                  qu




D/ BÀI T P T      GI I

Câu h i tr c nghi m

Câu 1: Cho bi t giá tr c a k sau khi th c hi n o n chương trình
  int i=5,k;
  {
     int i=6;
     ::i--;
     k=i;
  }
  k-=i;

V i các k t qu :
  a) k=0      b) k=1        c) k=2    d)k=3
Câu 2: Tìm l i g i hàm sai cho hàm sau:
  void func(int i=0,int j=0);
     a)func()
     b)dunc(1);
                                                                                 Trang 9
L P TRÌNH HƯ NG       I TƯ NG V I C++   Smith Nguyen Studio.
     c)func(1.5,2.5);
     d)func(1,2);
Câu 3: Cho bi t giá tr c a y sau khi th c hi n:
  int &foo(int &a)
     { a++;
         return a;
     }
  int i=5;
  int &r=foo(i);
  r++;

  a) i=5;
  b) i=6;
  c) i=7;
  d) không câu nào úng
Câu 4: Tìm giá tr c a x, y:
  void test(int &a, int b)
     { a+=b;
        b=a;
     }
  int x=1,y=2;
  test(x,y);

     a)   x=1,y=2;
     b)   x=1,y=3
     c)   x=3,y=2
     d)   x=3,y=3

     Bài t p t gi i

Bài 1.1: Anh (ch ) hãy vi t l i chương trình sau b ng cách s   d ng l i các dòng
nh p/xu t trong C++.

/*

Chương trình tìm m u chung nh nh t

*/

#include <stdio.h>

void main()

{

     int a,b,i,min;

     printf("Nhap vao hai so:");

     scanf("%d%d",&a,&b);

     min=a>b?b:a;
                                                                  Trang 10
L P TRÌNH HƯ NG      I TƯ NG V I C++      Smith Nguyen Studio.
    for(i = 2;i<min;++i)

     if (((a%i)==0)&&((b%i)==0)) break;

      if(i==min)

         {

              printf("Khong co mau chung nho nhat");

          }

    printf("Mau chung nho nhat la %dn",i);

}

Bài 1.2: Vi t chương trình nh p vào s nguyên dương h (2<h<23), sau ó in ra các tam
giác có chi u cao là h như các hình sau:




Bài 1.3: M t tam giác vuông có th có t t c các c nh là các s nguyên. T p c a ba s
nguyên c a các c nh c a m t tam giác vuông ư c g i là b ba Pitago. ó là t ng bình
phương c a hai c nh b ng bình phương c a c nh huy n, ch ng h n b ba Pitago (3,
4, 5). Vi t chương trình tìm t t c các b ba Pitago như th sao cho t t c các c nh
không quá 500.

Bài 1.4: Vi t chương trình in b ng c a các s t         1   n 256 dư i d ng nh phân, bát
phân và th p l c phân tương ng.

Bài 1.5: Vi t chương trình nh p vào m t s nguyên dương n. Ki m tra xem s nguyên
n có thu c dãy Fibonacci không?

Bài 1.6: Vi t chương trình nhân hai ma trân Amxn và Bnxp. M i ma tr n ư c c p phát
  ng và các giá tr c a chúng phát sinh ng u nhiên (V i m, n và p nh p t bàn phím).

                                                                         Trang 11
L P TRÌNH HƯ NG   I TƯ NG V I C++         Smith Nguyen Studio.
Bài 1.7: Vi t chương trình t o m t m ng m t chi u ng có kích thư c là n (n nh p t
bàn phím). Các giá tr c a m ng này ư c phát sinh ng u nhiên trên o n [a, b] v i a
và b u nh p t bàn phím. Hãy tìm s dương nh nh t và s âm l n nh t trong m ng;
n u không có s dương nh nh t ho c s âm l n nh t thì xu t thông báo "không có s
dương nh nh t" ho c "không có s âm l n nh t".

Bài 1.8: Anh (ch ) hãy vi t m t hàm tính bình phương c a m t s . Hàm s tr v giá tr
bình phương c a tham s và có ki u cùng ki u v i tham s .

Bài 1.9: Trong ngôn ng C, chúng ta có hàm chuy n i m t chu i sang s , tùy thu c
vào d ng c a chu i chúng ta có các hàm chuy n i sau :

              int atoi(const char *s);

            Chuy n      i m t chu i s thành s nguyên ki u int.

              long atol(const char *s);

            Chuy n      i m t chu i s thành s nguyên ki u long.

              double atof(const char *s);

            Chuy n      i m t chu i s thành s th c ki u double.

      Anh (ch ) hãy vi t m t hàm có tên là aton (ascii to number)       chuy n      i chu i
      sang các d ng s tương ng.

Bài 1.10: Anh ch hãy vi t các hàm sau:

             Hàm ComputeCircle()      tính di n tích s và chu vi c c a m t ư ng tròn
            bán kính r. Hàm này có prototype như sau:

                   void ComputeCircle(float & s, float &c, float r = 1.0);

             Hàm ComputeRectangle()       tính di n tích s và chu vi p c a m t hình
            ch nh t có chi u cao h và chi u r ng w. Hàm này có prototype như sau:

                   void ComputeRectangle(float & s, float &p, float h = 1.0, float w =
                   1.0);

             Hàm ComputeTriangle()      tính di n tích s và chu vi p c a m t tam giác
            có ba c nh a,b và c. Hàm này có prototype như sau:

                   void ComputeTriangle(float & s, float &p, float a = 1.0, float b = 1.0,
                   float c = 1.0);

              Hàm ComputeSphere()       tính th tích v và di n tích b m t s c a m t
            hình c u có bán kính r. Hàm này có prototype như sau:

                   void ComputeSphere(float & v, float &s, float r = 1.0);



                                                                             Trang 12
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
              Hàm ComputeCylinder()       tính th tích v và di n tích b m t s c a m t
            hình tr có bán kính r và chi u cao h. Hàm này có prototype như sau:

                   void ComputeCylinder(float & v, float &s, float r = 1.0 , float h =
                   1.0);

Bài 1.11: Vi t chương trình qu n lý i m h c sinh v i c u trúc danh sách n i ơn.
Trong chương trình s d ng toán t vào ra và toán t new      c p phát b nh      ng.
Bài 1.12: Vi t m t hàm th c hi n vi c s p x p m t m ng s nguyên theo chi u tăng
d n ho c gi m d n. Hàm này t       ng m c nh ki u s p x p theo chi u tăng d n.
Bài 1.13: Vi t m t hàm gi i phương trình b c hai. Hàm này tr l i thông báo r ng
phương trình có nghi m hay không có nghi m kép. N u có nghi m thì nghi m s ư c
lưu vào tham s x1, x2 và ư c truy n như là tham bi n.
Bài 1.14:Vi t m t hàm tìm v trí xu t hi n u tiên c a m t t khoá trong m t xâu. Hàm
này tr l i v trí tìm th y c a t khoá trong xâu(b t   u t 0) và thay i con tr xâu
  ư c truy n vào thành v trí c a ký t ngay sau ký t cu i cùng c a t khoá. T khoá
c n tìm ư c ưa vào như là m t tham s và có m t giá tr m c nh.




                                                                       Trang 13
L P TRÌNH HƯ NG    I TƯ NG V I C++       Smith Nguyen Studio.

      §èi t−îng vµ líp (Class and Object)

M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
   Phân tích ư c khái ni m óng gói d li u
   Khai báo và s d ng m t l p
   Khai báo và s d ng i tư ng.
   S d ng hàm thi t l p và hàm hu b
   Khai báo và s d ng hàm thi t l p sao chép
   Vai trò c a hàm thi t l p ng m nh

A/ NH C L I LÝ THUY T
    Trong C++, tên c u trúc là m t ki u d li u không c n kèm theo t khoá struct.
    L p cho phép ngư i l p trình mô t các i tư ng th c t v i các thu c tính và hành
vi. Trong C++ thư ng s d ng t khoá class             khai báo m t l p. Tên l p là m t ki u
d li u dùng khi khai báo các i tư ng thư c l p(các th hi n c th c a l p).
    Thu c tính c a     i tư ng trong m t l p ư c mô t dư i d ng các bi n th hi n.
Các hành vi là các hàm thành ph n bên trong l p.
    Có hai cách nh nghĩa các hàm thành ph n c a m t l p; khi nh nghĩa hàm thành
ph n bên ngoài khai báo l p ph i t trư c tên hàm thành ph n tên c a l p và toán t
“::”    phân bi t v i các hàm t do cùng tên. Ch nên nh nghĩa hàm thành ph n bên
trong khai báo l p khi nó không quá ph c t p        cho chương trình d     c.
    Có th khai báo và s d ng các con tr        i tư ng, tham chi u i tư ng.
    Hai t khoá public và private dùng         ch nh thu c tính truy nh p cho các thành
ph n( d li u/hàm) khai báo bên trong l p.
    Thành ph n bên trong l p ư c khai báo public có th truy nh p t m i hàm khai
báo m t i tư ng thu c l p ó.
    Thành ph n private trong m t       i tư ng ch có th truy nh p ư c b i các hàm
thành ph n c a i tư ng ho c các hàm thành ph n c a l p dùng               t o i tư ng(
  ây tính c trư ng h p i tư ng là tham s c a hàm thành ph n)
    Hai hàm thành ph n c bi t c a m t l p g i là hàm thi t l p và hàm hu b . Hàm
thi t l p ư c g i t       ng(ng m nh) m i khi m t i tư ng ư c t o ra và hàm hu
b ư cg it          ng khi i tư ng h t th i gian s d ng.
    Hàm thi t l p có thu c tính public, cùng tên v i tên l p nhưng không có giá tr tr
v .
    M t l p có ít nh t hai hàm thi t l p: hàm thi t l p sao chép ng m nh và hàm thi t
l p do ngư i l p trình thi t l p(n u không mô t tư ng minh thì ó là hàm thi t l p
ng m nh).
    Hàm hu b cũng có thu c tính public, không tham s , không giá tr tr v và có tên
b t u b i ~ theo sau là tên c a l p.
    Bên trong ph m v l p( nh nghĩa c a các hàm thành ph n), các thành ph n c a l p
  ư c g i theo tên. Trư ng h p có m t i tư ng toàn c c cùng tên, mu n xác nh i
tư ng y ph i s d ng toán t “::”.
    L p có th ch a các thành ph n d li u là các            i tư ng c a l p khác. Các      i
tư ng này ph i ư c kh i t o trư c i tư ng tương ng c a l p bao.
    M i i tư ng có m t con tr ch          n b n thân nó, ta g i ó là con tr this. Con tr
này có th     ư c s d ng tư ng minh ho c ng m nh                 tham xác nh các thành
ph n bên trong i tư ng. Thông thư ng ngư i ta s d ng this dư i d ng ng m nh.
    Hàm b n c a m t l p là hàm không thu c l p nhưng có quy n truy nh p t i các
thành ph n private c a l p.
                                                                           Trang 14
L P TRÌNH HƯ NG     I TƯ NG V I C++        Smith Nguyen Studio.
   Khai báo b n b có th khai báo b t kỳ ch nào trong khai báo l p.
B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...)
   Các l i thư ng g p
    Quên d u “;” cu i khai báo l p
    Kh i t o các thành ph n giá tr trong khai báo l p
      nh nghĩa ch ng m t hàm thành ph n b ng m t hàm không thu c l p
    Truy nh p n các thành ph n riêng c a l p t bên ngoài ph m vi l p
    Khai báo giá tr tr v cho hàm thi t l p và hàm hu b
    Khai báo hàm hu b có tham s , nh nghĩa ch ng hàm hu b
    G i tư ng minh hàm thi t l p và hàm hu b
    G i các thàm thành ph n bên trong hàm thi t l p
   M t s thói quen l p trình t t
    Nhóm t t c c các thành ph n có cùng thu c tính truy nh p m t nơi trương khái
    báo l p, nh v y m i t khoá mô t truy nh p ch ư c xác nh m t l n. Khai báo
    l p vì v y d       c hơn. Theo kinh nghi m,         các thành ph n private trư c tiên r i
       n các thành ph n protectech, cu i cùng là t khoá public.
      nh nghĩa t t c các hàm thành ph n bên ngoài khai báo l p. i u này nh m ph n
    bi t gi a hai ph n giao di n và ph n cài t l p.
    S d ng các ti n x lý #ifndef, #define, #endif             cho các t p tin tiêu    ch xu t
    hi n m t l n bên trong chương trinhg ngu n.
    Ph i nh nghĩa các hàm thi t l p                m b o r ng các i tư ng u ư c kh i
    t o n i dung m t cách úng n.
C/ BÀI T P M U
Ví d 1: nh nghĩa m t l p mô t và x lý các i m trên màn hình                   ho . V i tên l p
là point
L i gi i
   + Các thu c tính c a l p
      int x;// hoành      (c t)
      int y;// tung     ( hàng)
      int m;// màu
   + Các phương th c
      Nh p d li u m t i m
      Hi n th m t i m
        nm t i m
L p i m ư c xây d ng như sau:
   class point
      {
         private:
          int x,y,m;
         public:
          void nhapsl();
          void hien();
          void an()
             {
                 putpixcel(x,y,getbkcolor());
             }
          void point::nhap()
             {
                 cout<<”n Nh p hoành        (c t) và tung    (hàng) c   i m:”; cin>>x>>y;
                 cout<<” Nh p màu c a i m:”;cin>>m;
             }
          void point::hien()

                                                                             Trang 15
L P TRÌNH HƯ NG    I TƯ NG V I C++    Smith Nguyen Studio.
          {
              int mau_ht;
              mau_ht=getcolor();
              putpixcel(x,y,m);
              setcolor(mau_ht);
           }
   Nh n xét:
      + Trong c ba phương th c( dù vi t trong hay vi t ngoài nh nghĩa l p) u ư c
truy nh p n các thu c tính x,y và m c a l p.
      + Các phương th c vi t bên trong nh nghĩa l p (như phương th c an()) ư c
vi t như m t hàm bình thư ng.
      +Khi xây d ng các phương th c bên ngoài l p, c n dùng thêm tên l p và toán t
ph m vi :: t ngay trư c tên phương th c       quy nh rõ ây là phương th c c a l p
nào.

Ví d 2: Chúng ta xây d ng ki u c u trúc Time v i ba thành viên s nguyên: Hour,
Minute và second. Chương trình nh nghĩa m t c u trúc Time g i là DinnerTime.
Chương trình in th i gian dư i d ng gi quân i và d ng chu n.

                                           CT2_2.CPP
              #include <iostream.h>
              class Time
              {
                 public:
                               Time();                      //Constructor
                               void SetTime(int, int, int);    //Thiet lap Hour,
              Minute va Second
                               void PrintMilitary();         //In thoi gian duoi
              dang gio quan doi
                               void PrintStandard();         //In thoi gian duoi
              dang chuan
                       private:
                               int Hour;     // 0 - 23
                               int Minute;   // 0 - 59
                               int Second;   // 0 - 59
              };

              //Constructor khoi tao moi thanh vien du lieu voi gia tri zero
              //Bao dam tat ca cac doi tuong bat dau o trang thai thich hop
              Time::Time()
              {
                      Hour = Minute = Second = 0;
              }

              //Thiet lap mot gia tri Time moi su dung gio quan doi
              //Thuc hien viec kiem tra tinh hop le tren cac gia tri du lieu
              //Thiet lap ca gia tri khong hop le thanh zero
              void Time::SetTime(int H, int M, int S)
              {
                      Hour = (H >= 0 && H < 24) ? H : 0;
                      Minute = (M >= 0 && M < 60) ? M : 0;
                      Second = (S >= 0 && S < 60) ? S : 0;
              }

              //In thoi gian duoi dang gio quan doi
              void Time::PrintMilitary()
              {
                      cout << (Hour < 10 ? "0" : "") << Hour << ":"


                                                                      Trang 16
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.
                                << (Minute < 10 ? "0" : "") << Minute << ":"
                                << (Second < 10 ? "0" : "") << Second;
           }

           //In thoi gian duoi dang chuan
           void Time::PrintStandard()
           {
                   cout << ((Hour == 0 || Hour     == 12) ? 12 : Hour % 12)
                             << ":" << (Minute     < 10 ? "0" : "") << Minute
                             << ":" << (Second     < 10 ? "0" : "") << Second
                             << (Hour < 12 ? "     AM" : " PM");
           }


           int main()
           {
                   Time T;

                    cout << "The initial military time is ";
                    T.PrintMilitary();
                    cout << endl << "The initial standard time is ";
                    T.PrintStandard();

                    T.SetTime(13, 27, 6);
                    cout << endl << endl << "Military time after SetTime is ";
                    T.PrintMilitary();
                    cout << endl << "Standard time after SetTime is ";
                    T.PrintStandard();

                    T.SetTime(99, 99, 99);     //Thu thiet lap gia tri khong hop
           le
                   cout    <<   endl   <<   endl   <<   "After   attempting   invalid
           settings:"
                              << endl << "Military time: ";
                    T.PrintMilitary();
                    cout << endl << "Standard time: ";
                    T.PrintStandard();
                    cout << endl;
                    return 0;
           }




      k t qu




                                                                       Trang 17
L P TRÌNH HƯ NG   I TƯ NG V I C++            Smith Nguyen Studio.
Ví d 3
   Nh p m t ngày tháng năm t bàn phím sau ó in ra màn hình.
L i gi i
                                              CT2_3.CPP
           #include <iostream.h>
           #include <conio.h>
           #define FALSE 0
           #define TRUE !FALSE
            char* Thang[]={"","gieng","hai","ba","bon","nam","sau","bay","tam",
                                    "chin","muoi","muoi mot","chap"};
            int NgayThang[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
           class CDate
           {
             private:
                int mNgay,mThang,mNam;
                int laNamNhuan(int);
             public:
               void nhap();
               int hopLe();
               void in();
           };
           void CDate::nhap()
           {
               cout<<endl<<"Ngay: ";cin>>mNgay;
               cout<<endl<<"Thang: "; cin>>mThang;
               cout<<endl<<"Nam: ";cin>>mNam;
           }
           int CDate::hopLe()
           {
               if ((mThang<1)||(mThang>12))
                    return FALSE;
               else
               {
                    if ((mNgay>=1)&&(mNgay<=NgayThang[mThang]))
                         return TRUE;
                    else if ((mNgay==29)&&laNamNhuan(mNgay))
                         return TRUE;
                    else
                         return FALSE;
               }
           }
           int CDate::laNamNhuan(int nam)
           {
               if (((nam%400)==0)||(((nam%4)==0)&&((nam%100)!=0)))
                    return TRUE;
               else
                    return FALSE;
           }
           void CDate::in()
           {
               cout<<endl<<"Ban da nhap vao ngay "<<mNgay;
               cout<<" thang "<<Thang[mThang];
               cout<<" nam "<<mNam;
           }
           void main()
           {
               CDate ngay;
               ngay.nhap();
               if (ngay.hopLe())
                    ngay.in();
               else

                                                                                  Trang 18
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
                  cout<<"BAN NHAP NGAY KHONG HOP LE";
               getch();
           }




Ví d 4
   Ch ra các cách khai báo   i tư ng có th cho các l p   i tư ng dư i ây: class A
   {
   };
class B
   {
       B(int, int);
     public:
       B(int=0);
   };
class C
   {
       C(C&);
     public:
       C();
   };
class D
   {
      public:
       D(D&);
   };
L i gi i
V l pA
   Cách 1: S d ng hàm thi t l p ng m nh
      A a; ho c A a();
   Cách 2: S d ng hàm thi t l p sao chép m c nh. Gi s a là m t i tư ng c a
l p A ã ư c khai báo trư c. Ta có th khai báo i tư ng a1 như sau:
      A a1(a); ho c A a1=a;
   Nh n xét:
      Khi trong l p không có m t khai báo hàm thi t l p nào thì trình biên d ch t ng
t o ra m t hàm thi t l p m c nh cho l p ó. Do v y ta có th s d ng khai báo i
tư ng theo cách 1 cho l p A. Hai chách vi t khai báo
   A a1(a); và A a1=a; là hoàn toàn gi ng nhau, chúng u s d ng hàm thi t l p sao
chép     kh i t o i tư ng.
V l pB
Cách 1: S d ng hàm thi t l p B(int). Ví d :
   B b(5);
Cách 2: S d ng hàm thi t l p B(int) v i tham s ng m nh là 0.
   B b; tương ương v i B b(0);
Cách 3: S d ng hàm thi t l p sao chép tương t như l p A.
   B b1=b;
Nh n xét
   Chúng ta ch có th khai báo i tư ng theo các hàm thi t l p có thu c tính quy n
truy nh p là public


                                                                     Trang 19
L P TRÌNH HƯ NG    I TƯ NG V I C++           Smith Nguyen Studio.
   Trong hàm thi t l p cũng có th s          d ng tham s ng m              nh gi ng như các hàm
thành ph n khác.
V l p C:
  Ch có th khai báo i tư ng theo hàm thi t l p C() b i vì hàm thi t l p sao chép ã
 ư c ngư i s d ng nh nghĩa và       t quy n truy xu t là private. Do v y không th
dùng hàm thi t l p sao chép. Ví d :
  C c;
V l p D:
   Không th khai báo i tư ng cho l p D b i vì trong l p này ch có hàm thi t l p sao
chép. Hàm thi t l p chép mu n s d ng ư c thì ph i có m t i tư ng c a l p D. Do
v y mu n khai báo ư c m t i tư ng thu c l p D thì trong l p D c n có m t hàm
thi t l p khác     sa chép.
Ví d 5
   Có bao nhiêu l n hàm thi t l p sao chép ư c g i trong o n mã chương trình sau:
   Widget f(Widget u)
       {
         Widget v(u);
         Widget w=v;
         return w;
       }
   void main()
       {
         Widget x;
         Widget y=f(f(x));
       }
L i gi i:
   Hàm thi t l p sao chép ư c g i 7 l n trong o n mã chương trình này. M i l n g i
hàm f òi h i 3 l n g i n hàm thi t l p sao chép: khi tham sô truy n vào b ng giá tr
u, khi v và w ư c kh i t o. L nh g i th b y là    kh i t o y.
Ví d 6
   Cho bi t k t qu in ra màn hình c a chương trình sau:
L i gi i
                                              CT 2_6.CPP
           #include <iostream.h>
           #include <conio.h>                                                            3.
              class A
                 {
                    static int count;
                   public:
                    A() { count++;}
                    ~A() { count--;}

                     static void printNum()
                        {
                            cout<<” Gia tri cua count la:”<<count<<endl;
                        }
                  };
              int A::count=0;
              void main()
                  {
                     clrscr();
                      A::printNum();
                      A a1;
                      a1.printNum();
                      A *pa=new A;
                      a1.printNum();

                                                                                  Trang 20
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
                   delete pa;
                   a1.printNum();
                   A a2=a1;
                   a2.printNum();
                   getch();
              }
                                                                             4.


L i gi i
   K t q in ra màn hình:
   Gia tri cua count la 0
   Gia tri cua count la 1
   Gia tri cua count la 2
   Gia tri cua count la 1
   Gia tri cua count la 1
   Trong l p A, thu c tính count và hàm thành ph n printNum là các thành ph n tĩnh
  ư c chia s b i m i i tư ng c a A. Ban u thu c tính count ư c khai báo kh i
t o là 0( dòng int A::count=0), do v y dòng u tiên c a chương trình chính ư c g i
   n phương th c printNum s ưa ra màn hình giá tr c a count là 0. Ti p theo ta t o
m t i tư ng a1 s d ng hàm thi t l p d ng A(). Hàm này làm tăng count lên 1. Do
v y, dòng g i phương th c printNum ti p theo s ưa ra màn hình giá tr c a count là
1. Tương t       i v i l nh new ta cũng t o ra m t i tư ng m i và lúc này giá tr c a
count là 2. Sau khi s d ng l nh new t o i tư ng, chương trình s d ng delete
xoá i tư ng ó kh i b nh . Lúc này hàm hu b ư c g i và count gi m xu ng 1.
   i tư ng a2 ư c khai báo s d ng hàm thi t l p sao chép m c nh, mà hàm này
không làm thay i giá tr count. Do v y, count v n gi giá tr 1.

Ví d 6
   Tim ra ch sai v quy n truy xu t trong o n chương trình sau:
class A
   {
       int pri;
      public:
       int bub;
       friend void funcA(A);
       firend class B;
   };
class B
   {
       void func(A a)
           {
              cout<<a.pri;
              cout<<a.pub;
           }
   };
class C
   {
       void func(A a)
           {
              cout<<a.pri;
              cout<<a.pub;

                                                                     Trang 21
L P TRÌNH HƯ NG   I TƯ NG V I C++            Smith Nguyen Studio.
       }
   };
void funcA(A a)
   {
      cout<<a.pri;
      cout<<a.pub;
   }
void funcB(A a)
   {
      cout<<a.pri;
      cout<<a.pub;
   }
L i gi i
   Truy xu t n thu c tính pri c a i tư ng a trong hàm funcB và trong hàm thành
ph n func c a l p C là không th ư c. T t c các truy xu t n thu c tính pub u
  ư c b i vì ây là thu c tính public. Trong hàm funcA, ta có th truy nh p ư c thu c
tính pri b i vì hàm này ã ư c khai báo là b n bè c a l p A. Tương t , t t c các
hàm thành ph n c a l p B cũng u có th truy xu t t i thu c tính pri c a l p A b i vì
l p B ã ư c coi là b n bè c a l p A.

Ví d 7
      qu n lý i m thi vào trư ng HSPKTHY c a các thí sinh, ta xây d ng l p
ThiSinh mô t các thí sinh bao g m các thu c tính và phương th c sau:
   - Tên thí sinh
   -   i m c a ba môn thi Toán, Lý, Hoá
   - Nh p thông tin c a các thí sinh g m tên và i m c a ba môn thi Toán, Lý, Hoá
   - In thông tin tên, i m và t ng i m thi 3 môn
   - Tính t ng i m thi c a thí sinh
Trên cơ s l p ã xây d ng ư c, vi t chương trình làm các công vi c sau.
   - Nh p danh sách k t qu thi c a các thí sinh vào t bàn phím
   -   ưa ra màn hình danh sách thí sinh trung tuy n( i m chu n vào trư ng là 18)

L i gi i
                                              CT2_7.CPP
              #include <iostream.h>
              #include <stdio.h>                                                     5.
              #include <conio.h>
              class ThiSinh
                 {
                      // Các thu c tính
                      char ten[25];// Tên c a thí sinh khôngdài quá 24 ký t
                      int toan, ly, hoa;// i m ba môn toán, lý, hoá
                   public:
                    // Các phương th c
                      void nhapdl();//Nh p d li u cho thí sinh
                      void inkq();// In k t qu thi c a thí sinh
                      int tong();// Tính t ng i m c a thí sinh
                   };
                   void ThiSinh::nhapdl()
                      {
                          cout<<”Nhap ten:”;fflush(stdin);gets(ten);
                          cout<<”Nhap diem toan:”;cin>>toan;
                          cout<<”Nhap diem ly:”;cin>>ly;
                          cout<<”Nhap diem hoa:”;cin>>hoa;
                      }

                                                                              Trang 22
L P TRÌNH HƯ NG   I TƯ NG V I C++             Smith Nguyen Studio.
                   void ThiSinh::inkq()
                     { // K t qu thi c a thí sinh ư c in trên m t dòng theo nh d ng
                         // Ten          Toan          Ly            Hoa
                     Tong
                         printf(“%-25s%6d%6d%6%6dn”,ten,toan,ly,hoa,tong());
                     }
                   int ThiSinh::tong()
                     {
                         return (toan+ly+hoa);
                     }
                    void main()
                     { // Chương trình chính th c hi n nh p danh sách vào s lư ng thí
                   // sinh c n nh p
                         clrscr();
                         int n;
                         cout<<”Cho so thi sinh:”;cin>>n;
                     // T o n i tư ng thí sinh cho n thí sinh c n nh p d li u
                         ThiSinh *dsts=new ThiSinh[n];
                     // Nh p d li u cho t ng thí sinh
                         for(int i=0;i<n;++i)
                             {
                                 cout<<” Nhap du lieu cho thi sinh thu:”<<i+1<<endl;
                             // G i phương th c nh p d li u c a thí sinh th i trong m ng
                                 dsts[i].nhapdl();
                             }
                   // In danh sách các thí sinh truýng tuy n
                     cout<<”Danh sach nhung nguoi trung truyen n”;
                     printf(“%-25s%6s%6s%s%6sn”,”Ten”,”Toan”,”Ly”,”Hoa”,”Tong”);
                   for(i=0;i<n;++i)
                     if(dsts[i].tong()>=18)
                             dsts[i].inkq();
                   // Xoá các i tư ng ã t o và k t thúc chương trình
                    delete dsts;
                    getch();
           }
                                                                                                6.


Ví d 8: Hàm thi t l p v i các tham s m c             nh

                                               CT2_8.CPP
           #include <iostream.H>
           class Time                                                                           7.
           {
                     public:
                               Time(int = 0, int = 0, int = 0); //Constructor mac dinh
                               void SetTime(int, int, int);
                               void PrintMilitary();
                               void PrintStandard();

                     private:
                                int Hour;
                                int Minute;
                                int Second;
           };

            //Ham constructor de khoi dong du lieu private
            //Cac gia tri mac dinh la 0
           Time::Time(int Hr, int Min, int Sec)
           {

                                                                                         Trang 23
L P TRÌNH HƯ NG    I TƯ NG V I C++               Smith Nguyen Studio.
                        SetTime(Hr, Min, Sec);
           }

            //Thiet lap cac gia tri cua Hour, Minute va Second
            //Gia tri khong hop le duoc thiet lap la 0
            void Time::SetTime(int H, int M, int S)
           {
                        Hour = (H >= 0 && H < 24) ? H : 0;
                        Minute = (M >= 0 && M < 60) ? M : 0;
                        Second = (S >= 0 && S < 60) ? S : 0;
           }

           //Hien thi thoi gian theo dang gio quan doi: HH:MM:SS
           void Time::PrintMilitary()
           {
                       cout << (Hour < 10 ? "0" : "") << Hour << ":"
                                   << (Minute < 10 ? "0" : "") << Minute << ":"
                                   << (Second < 10 ? "0" : "") << Second;
           }

           //Hien thi thoi gian theo dang chuan: HH:MM:SS AM (hoac PM)
           void Time::PrintStandard()
           {
                       cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12)
                                   << ":" << (Minute < 10 ? "0" : "") << Minute
                                   << ":" << (Second < 10 ? "0" : "") << Second
                                   << (Hour < 12 ? " AM" : " PM");
           }

           int main()
           {
                        Time T1,T2(2),T3(21,34),T4(12,25,42),T5(27,74,99);

                        cout << "Constructed with:" << endl
                                    << "all arguments defaulted:" << endl << " ";
                        T1.PrintMilitary();
                        cout << endl << " ";
                        T1.PrintStandard();
                        cout << endl << "Hour specified; Minute and Second defaulted:"
                                    << endl << " ";
                        T2.PrintMilitary();
                        cout << endl << " ";
                        T2.PrintStandard();
                        cout << endl << "Hour and Minute specified; Second defaulted:"
                                    << endl << " ";
                        T3.PrintMilitary();
                        cout << endl << " ";
                        T3.PrintStandard();
                        cout << endl << "Hour, Minute, and Second specified:"
                                    << endl << " ";
                        T4.PrintMilitary();
                        cout << endl << " ";
                        T4.PrintStandard();
                        cout << endl << "all invalid values specified:"
                                    << endl << " ";
                        T5.PrintMilitary();
                        cout << endl << " ";
                        T5.PrintStandard();
                        cout << endl;
                        return 0;
           }
                                                                                           8.
                                                                                    Trang 24
L P TRÌNH HƯ NG   I TƯ NG V I C++           Smith Nguyen Studio.

Chương trình    ví d trên kh i t o năm     i tư ng c a l p Time ( dòng 52). i
tư ng T1 v i ba tham s l y giá tr m c nh, i tư ng T2 v i m t tham s ư c mô
t , i tư ng T3 v i hai tham s ư c mô t , i tư ng T4 v i ba tham s ư c mô t
và i tư ng T5 v i các tham s có giá tr không h p l .

K t qu




Ví d 9:L p có hàm hu b

                                             CT 2_9.CPP
           #include <iostream.h>
           class Simple                                                               9.
           {
                     private:
                               int *X;
                     public:
                               Simple();              //Constructor
                               ~Simple();      //Destructor
                               void SetValue(int V);
                               int GetValue();
           };

           Simple::Simple()
           {
                     X = new int; //Cap phat vung nho cho X
           }

           Simple::~Simple()
           {
                     delete X; //Giai phong vung nho khi doi tuong bi huy bo
           }

                                                                               Trang 25
L P TRÌNH HƯ NG      I TƯ NG V I C++             Smith Nguyen Studio.
           void Simple::SetValue(int V)
           {
                    *X = V;
           }

           int Simple::GetValue()
           {
                      return *X;
           }

           int main()
           {
                           Simple S;
                           int X;

                           cout<<"Enter a number:";
                           cin>>X;
                           S.SetValue(X);
                           cout<<"The value of this number:"<<S.GetValue();
               return 0;
           }

                                                                                     10.



k t qu




Ví d 10: Chương trình sau minh h a khai báo và s d ng hàm friend.

                                                              CT2_10.CPP
                     #include <iostream.H>
                     class Count
                     {
                             friend void SetX(Count &, int); //Khai bao friend
                             public:
                                     Count()//Constructor
                                     {
                                             X = 0;
                                     }
                                     void Print() const //Xuat
                                     {
                                             cout << X << endl;
                                     }
                             private:
                                     int X;
                     };

                     //Co the thay doi du lieu private cua lop Count vi
                     //SetX() khai bao la mot ham friend cua lop Count
                     void SetX(Count &C, int Val)
                     {


                                                                              Trang 26
L P TRÌNH HƯ NG   I TƯ NG V I C++       Smith Nguyen Studio.
                           C.X = Val;   //Hop le: SetX() la mot friend cua lop Count
                  }

                  int main()
                  {
                          Count Object;

                           cout << "Object.X after instantiation: ";
                           Object.Print();
                           cout << "Object.X after call to SetX friend function: ";
                           SetX(Object, 8); //Thiet lap X voi mot friend
                           Object.Print();
                           return 0;

                  }




      k t qu




D/ BÀI T P T GI I
Câu h i tr c nghi m
Câu 1:
    Ch có m t kh ng nh trong nh ng câu sau là sai. Câu nào?
a./ M i th hi n c a m t l p có s h u riêng các thu c tính thông thư ng
b./ Các th hi n c a m t l p cùng chia s các thu c tính tĩnh c a l p ó
c./ M i th hi n c a m t l p có các nh nghĩa riêng cho các phương th c c a nó.
d./ M i i tư ng là m t th hi n c a m t l p
Câu 2:
    Các t khoá public và private dùng
a./ Cho phép ngư i thi t k l p che d u m t ph n thi hành c a l p trư c ngư i s
d ng l p.
b./ Trình biên d ch t i ưu hoá chương trình
c./     m b o na toàn c a l p khi thi t k
d./ H n ch vi c sao chép l p
Câu 3
Ch ra l i sai v i các khai báo cho l p A
    class A
       {
          A(int i);
       };
    A a1;//(1)
    A b2(5) //(2)
a./ Ch dòng 1 l i
b./ Ch dòng 2 l i
c./ C hai dòng l i
d./ Không dòng nào l i
Câu 4:
    Cho bi t giá tr c a n v i các dòng l nh sau:

                                                                   Trang 27
L P TRÌNH HƯ NG    I TƯ NG V I C++        Smith Nguyen Studio.
class A
   {
      public:
         static int i;
   };
int A::i=5;
A a1;
a1.i++;
A a2;
int n=a2.i+1;
a./ n=5;
b./ n=6;
c./ n=7;
d./ Không câu nào úng
Câu 5:
 Ch ra l i v i các khai báo cho l p A
   class A
      {
         public:
         A(int i);
      };
   A a1(5);
   A a3;// (1)
   A a2=a1;// (2)
a./ Ch dòng 1 l i
b./ Ch dòng 2 l i
c./ C 2 dòng l i
d./ Không dòng nào l i
Bài tâp

Bài 2.1: Xây d ng l p Stack, d       li u bao g m   nh stack và vùng nh   c a stack. Các
thao tác g m:

               Kh i    ng stack.

               Ki m tra stack có r ng không?

               Ki m tra stack có      y không?

               Push và pop.

Bài 2.2: Xây d ng l p hình tr Cylinder, d li u bao g m bán kính và chi u cao c a
hình tr . Các thao tác g m hàm tính di n tích toàn ph n và th tích c a hình tr ó.

Bài 2.3: Hãy xây d ng m t l p Point cho các i m trong không gian ba chi u (x,y,z).
L p ch a m t constructor m c nh, m t hàm Negate()        bi n   i i m thành      i
lư ng có d u âm, m t hàm Norm() tr v kho ng cách t g c và m t hàm Print().

Bài 2.4: Xây d ng m t l p Matrix cho các ma tr n bao g m m t constructor m c nh,
hàm xu t ma tr n, nh p ma tr n t bàn phím, c ng hai ma tr n, tr hai ma tr n và nhân
hai ma tr n.


                                                                          Trang 28
L P TRÌNH HƯ NG   I TƯ NG V I C++       Smith Nguyen Studio.
Bài 2.5: Xây d ng m t l p Matrix cho các ma tr n vuông bao g m m t constructor m c
 nh, hàm xu t ma tr n, tính nh th c và tính ma tr n ngh ch o.

Bài 2.6: Xây d ng l p Person     qu n lý h tên, năm sinh, i m chín môn h c c a t t
c các h c viên c a l p h c. Cho bi t bao nhiêu h c viên trong l p ư c phép làm lu n
văn t t nghi p, bao nhiêu h c viên thi t t nghi p, bao nhiêu ngư i ph i thi l i và tên
môn thi l i. Tiêu chu n  xét:

              Làm lu n văn ph i có i m trung bình l n hơn 7 trong ó không có môn
             nào dư i 5.

              Thi t t nghi p khi i m trung bình không l n hơn 7 và i m các môn
             không dư i 5.

              Thi l i có môn dư i 5.

Bài 2.7: Xây d ng m t l p String. M i i tư ng c a l p String s    i di n m t chu i ký
t . Các thành viên d li u là chi u dài chu i và chu i ký t th c. Ngoài constructor và
destructor còn có các phương th c như t o m t chu i v i chi u dài cho trư c, t o m t
chu i t m t chu i ã có.

Bài 2.8: Xây d ng m t l p Vector       lưu tr   vector g m các s th c. Các thành viên
d li u g m:

              Kích thư c vector.

              M t m ng     ng ch a các thành ph n c a vector.

Ngoài constructor và destructor, còn có các phương th c tính tích vô hư ng c a hai
vector, tính chu n c a vector (theo chu n b t kỳ nào ó).

Bài 2.9: Xây d ng l p Employee g m h tên và ch ng minh nhân dân. Ngoài
constructor còn có phương th c nh p, xu t h tên và ch ng minh nhân dân ra màn
hình


Bài 2.10:
M t l p i tư ng sách trong h th ng qu n lí thư vi n có các thu c tính
  - Tên sách
  - T ng s quy n sách
  - S quy n sách ã cho mư n
Xây d ng l p i tư ng trên v i các phương th như sau
  - Phương th nh p d li u cho i tư ng t bàn phím. Các thông tin c n nh p là
      tên sách, t ng s sách, s ã cho mư n.
  - Phương th c in thông tin i tư ng ra màn hình bao g m tên, t ng s và s ã
      cho mư n.
  - Phương th c tính s sách còn l i trong thư vi n(t ng s - s mư n)
Trên cơ s l p xây d ng ư c, vi t chương trình chính th c hi n các công vi c.
  - Nh p danh sách các quy n sách v i s lư ng sách c n nh p ư c cho vào t
      bàn phím.
  -     ưa ra màn hình thông tin v các quy n sách hi n có trong thư vi n(s sách còn
      l i ph i l n hơn 0)
                                                                       Trang 29
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.
Bài 2.11:
  Vi t m t l p bi u di n hình ch nh t có các thu c tính là     dài hai c nh( chi u r ng
và chi u dài) và có các phương th c sau.
   - Nh p d li u hai c nh cho hình ch nh t
   - Tính chu vi và di n tích hình ch nh t
   - In thông tin c a hình ch nh t ra màn hình(bao g m          dài hai c nh, chu vi và
      di n tích)
  Trên cơ s l p xây d ng ư c vi t chương trình cho phép ngư i s d ng nh p d
  li u c a m t hình ch nh t r i in thông tin v nó ra màn hình.
Bài 2.12:
  Xây d ng m t l p Date mô t thông tin v ngày, tháng, năm(month, day, year). L p
Date có các hàm thành ph n:
   - Hàm thi t l p v i ba tham s có giá tr m c nh( ó là ngày h th ng)
   - Nh p d li u ngày, tháng và năm
   - Hàm in thông tin v ngày tháng năm dư i d ng mm-dd-yy
   - Hàm nextDay()       tăng Date t ng ngày m t
Trên cơ s l p Date v a x y d ng vi t chương trình cho bi t kho ng cách ngày gi a
hai m c th i gian v i ngày b t u ư c nh p vào t bàn phím cho tơi ngày hi n th i.


Bài 2.13:
  Xây d ng l p Stack và l p Queue mô t ho t ng c a ngăn x p và hàng           i các sô
nguyên.
Bài 2.14:
  Xây d ng m t l p mô t các b ng thi u bóng á g i là BangThiDau. Gi thi t m i
b ng có b n     i và thi  u chéo t ng c p. Có l ch các tr n      u c a b ng. T o các
phương th c nh p k t qu thi u và tính i m cho t ng i. Yêu c u vi c nh p k t
q a thi u ph i theo th t th i gian. Thêm các phương th c hi n th thông tin thi u
c a t ng i và c a c b ng. Vi t chương trình       ki m nghi m l p xây d ng ư c.
Bài 2.15:
  M r ng bài t p trên v i l p DoiBong mô t các i bóng thi u. Thông tin c a m i
 ôi bóng bao g m tên        i bóng, danh sách c u th , và hu n luy n viên. L p
bangThiDau s d ng các i tư ng c a l p DoiBong           làm i bóng thi u c a b ng.
Các b ng lúc này có th m thu c tính tên c a b ng thi u.
  S d ng các l p ã xây d ng trên            vi t chương trình qu n lý thi u c a cúp
bóng á th gi i có 32 i thi u ư c chia làm 8 b ng. T o thêm l p mô t l ch thi
  u cho các vòng ti p theo c a gi i. Yêu c u c a chương trình như sau:
  - Ban u ngư i s d ng nh p các thông tin v           i bóng, sau ó phân b ng và l ch
      thi u toàn gi i.
  - K t qu các tr n thi u ư c vào theo th t l ch thi u
  - Chương trình t       ng ch n các i vào vòng ti p theo cho t i tr n trung k t.
  - T i m i th i i m c a gi i chương trình có th ưa ra các thông tin v gi i.
Bài 2.16:
  M t quy n s i n tho i ch a các th có thông tin v tên, a ch và s i n tho i.
Thi t k các l p tương ng v i các th thông tin và s i n tho i. Vi t chương trình cho
phép qu n lý s i n tho i d a trên các l p xây d ng ư c.




                                                                        Trang 30
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.

       §Þnh nghÜa chång to¸n tö trªn líp

M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
   Cách nh nghĩa các phép toán cho ki u d li u l p và c u trúc
   Các toán t chuy n ki u áp d ng cho ki u d li u l p

A/ NH C L I LÝ THUY T
   Toán t      ư c nh nghĩa ch ng b ng cách nh nghĩa m t hàm toán t . Tên hàm
toán t bao g m t khoá operator theo sau là ký hi u c a toán t           ư c nh nghĩa
ch ng.
   H u h t các toán t c a C++ u có th           nh nghĩa ch ng. Không th t o ra các ký
hi u phép toán m i.
   Ph i m b o các c tính nguyên thu c a toán t             ư c nh nghĩa ch ng, ch ng
h n:      ưu tiên, tr t t k t h p, sô ngôi.
   Không s d ng tham s có giá tr ng m nh              nh nghĩa ch ng toán t .
   Các toán t (), [], ->, = yêu c u hàm toán t ph i là hàm thành ph n c a l p.
   Hàm toán t có th là hàm thành ph n hay là hàm b n c a l p
   Khi hàm toán t là hàm thành ph n, toán h ng bên trái luôn là i thu c l p.
   N u toán h ng bên trái là i tư ng c a l p khác thì hàm toán t tương ng ph i là
hàm b n.
   Chương trình d ch không t bi t cách chuy n ki u gi a ki u d li u chu n và ki u
d li u t      nh nghĩa. Vì v y ngư i l p trình c n ph i mô t tư ng minh các chuy n i
này dư i d ng hàm thi t l p chuy n ki u hay hàm toán t chuy n ki u.
   M t hàm toán t chuy n ki u th c hi n chuy n i t m t i tư ng thư c l p sang
   i tư ng thu c l p khác ho c m t i tư ng có ki u ư c nh nghĩa trư c.
   Hàm thi t l p chuy n ki u có m t tham s và th c hi n chuy n           i t m t giá tr
sang i tư ng ki u l p.
   Toán t gán là toán t hay ư c nh nhgiã ch ng nh t, c bi t khi l p có các thành
ph n d li u ng.
          nh nghĩa ch ng toán t tăng, gi m m t ngôi, ph i phân bi t hai hàm toán t
tư ng ng cho d ng ti n t và d ng h u t .
B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...)
   Các l i thư ng g p
     T o m t toán t
     Thay i nh nghĩa c a các toán t trên các ki u ư c nh nghĩa trư c
     Cho r ng vi c nh nghĩa ch ng m t toán t s t           ng kéo theo nh nghĩa ch ng
    c a các toán t liên quan.
     Quên nh nghĩa ch ng toán t gán và hàm thi t l p sao chép cho các l p có các
    thành ph n d li u ng.
   M t s thói quen l p trình t t
     S d ng toán t        nh nghĩa ch ng khi i u ó làm cho chương trình trong sáng
    hơn.
     Tránh l m d ng nh nghĩa ch ng toán t vì i u ó ãn n khó ki m soát chương
    trình.
     Chú ý n các tính ch t nguyên thu c a toán t        ư c nh nghĩa ch ng.
     Hàm thi t l p, toán t gán, hàm thi t l p sao chép c a m t l p thư ng i cùng
    nhau.

                                                                        Trang 31
L P TRÌNH HƯ NG   I TƯ NG V I C++         Smith Nguyen Studio.
C/ BÀI T P M U
Ví d 1:
   M t l p phân s có toán t c ng(+) ư c nh nghĩa như sau:
      class PS
        {
           public:
              PS(int ts=0, int ms=1);
              PS operator+(PS);
        };
   Trong các dòng l nh sau ây dòng nào sai?
     PS a,b,c;
     a=b+c;//(1)
     a=b+3;//(2)
     a=3+b;//(3)
L i gi i
     Trong ba dòng l nh thì hai dòng u là úng b i vì lúc ó ta có:
     (1) a=b.operator+(c) là toán t     ã ư c nh nghĩa trong l p phân s
     (2)     a=b.operator+(3) v i 3 s t    ng chuy n ki u thành phân s
     Dòng l nh (3) sai vì ta không có toán t c ng m t s nguyên v i m t phân s .
     có th th c hi n ư c t t c ba dòng l nh như trên thì toán t c ng trong l p PS
     ph i ư c nh nghĩa là m t hàm b n.
          class PS
        {
           public:
              PS(int ts=0, int ms=1);
              friend PS operator+(PS);
        };
     Khi ó các l i g i s tương ng v i toán t như sau:
        (1) a=operator+(b,c)
        (2) a=operator+(b,3)
        (3) a=operator+(3,b)

Ví d 2:Chúng ta xây d ng l p s ph c v i tên l p là Complex và a năng hóa toán t
+ trên l p này.
                                           CT3_1.CPP
           #include <iostream.h>
           class Complex                                                                11.
           {
                     private:
                               double Real,Imaginary;
                     public:
                               Complex(double R=0.0,double I=0.0);//Constructor mac
           dinh
                               void Print();//Hien thi so phuc
                               Complex operator + (Complex Z);//Phep cong hai so phuc
                               Complex operator + (double R);//Phep cong mot so phuc
           voi mot so thuc
           };

           Complex::Complex(double R,double I)
           {
                    Real = R;
                    Imaginary = I;
           }


                                                                               Trang 32
L P TRÌNH HƯ NG    I TƯ NG V I C++           Smith Nguyen Studio.
           void Complex::Print()
           {
                   cout<<'('<<Real<<','<<Imaginary<<')';
           }

           Complex Complex::operator + (Complex Z)
           {
                   Complex Tmp;
                   Tmp.Real = Real + Z.Real;
                   Tmp.Imaginary = Imaginary + Z.Imaginary;
                   return Tmp;
           }

           Complex Complex::operator + (double R)
           {
                   Complex Tmp;
                   Tmp.Real = Real + R;
                   Tmp.Imaginary = Imaginary;
                   return Tmp;
           }

           int main()
           {
                        Complex X,Y(4.3,8.2),Z(3.3,1.1);
                        cout<<"X: ";
                        X.Print();
                        cout<<endl<<"Y: ";
                        Y.Print();
                        cout<<endl<<"Z: ";
                        Z.Print();
                        X = Y + Z;
                        cout<<endl<<endl<<"X = Y + Z:"<<endl;
                        X.Print();
                        cout<<" = ";
                        Y.Print();
                        cout<<" + ";
                        Z.Print();
                        X = Y + 3.5;
                        cout<<endl<<endl<<"X = Y + 3.5:"<<endl;
                        X.Print();
                        cout<<" = ";
                        Y.Print();
                        cout<<" + 3.5";
                        return 0;
           }
                                                                         12.


      k t qu




                                                                  Trang 33
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.




Ví d 3:
       Cho m t l p có toán t chuy n ki u như sau:
   class A
          {
             public:
                operator int ();
          };
Khi ó ta có th s d ng câu l nh nào trong nh ng câu l n sau:
   A a;
   int i=a;//(1)
   float f=a;//(2)
L i gi i
   L nh (1) là úng b i vì ta ã có toán t ép ki u int nên chương trình t   ng ép ki u
v m t s nguyên. Còn l nh 2 sai b i vì ta không có toán t ép ki u float.
Ví d 4       a năng hóa toán t []  truy c p n m t ph n t c a vector.
                                        CT3_4.CPP
            #include <iostream.h>
            class Vector                                                     13.
            {
                    private:
                            int Size;
                            int *Data;
                    public:
                            Vector(int S=2,int V=0);
                            ~Vector();
                            void Print() const;
                            int & operator [] (int I);
            };

            Vector::Vector(int S,int V)
            {
                    Size = S;
                    Data=new int[Size];
                    for(int I=0;I<Size;++I)
                            Data[I]=V;
            }

            Vector::~Vector()
            {
                    delete []Data;
            }
            void Vector::Print() const
            {
                    cout<<"Vector:(";

                                                                      Trang 34
L P TRÌNH HƯ NG    I TƯ NG V I C++             Smith Nguyen Studio.
                     for(int I=0;I<Size-1;++I)
                             cout<<Data[I]<<",";
                     cout<<Data[Size-1]<<")"<<endl;
           }

           int & Vector::operator [](int I)
           {
                   return Data[I];
           }

           int main()
           {
                   Vector V(5,1);
                   V.Print();
                   for(int I=0;I<5;++I)
                           V[I]*=(I+1);
                   V.Print();
                   V[0]=10;
                   V.Print();
                   return 0;
           }
                                                                                       14.


      k t qu




Ví d 5: a năng hóa toán t ()          truy c p       n m t ph n t c a vector.
                                               CT3_5.CPP
            //Chuong trinh 4.6
           #include <iostream.h>                                                       15.

           class Vector
           {
                    private:
                                int Size;
                                int *Data;
                     public:
                                Vector(int S=2,int V=0);
                                ~Vector();
                                void Print() const;
                                int & operator () (int I);
           };

           Vector::Vector(int S,int V)
           {
                     Size = S;
                     Data=new int[Size];
                     for(int I=0;I<Size;++I)
                                 Data[I]=V;
           }

           Vector::~Vector()
           {

                                                                                Trang 35
L P TRÌNH HƯ NG     I TƯ NG V I C++                 Smith Nguyen Studio.
                     delete []Data;
            }
            void Vector::Print() const
            {
                     cout<<"Vector:(";
                     for(int I=0;I<Size-1;++I)
                                  cout<<Data[I]<<",";
                     cout<<Data[Size-1]<<")"<<endl;
            }

            int & Vector::operator ()(int I)
            {
                       return Data[I];
            }

            int main()
            {
                         Vector V(5,1);
                         V.Print();
                         for(int I=0;I<5;++I)
                                     V(I)*=(I+1);
                         V.Print();
                         V(0)=10;
                         V.Print();
                         return 0;
            }

                                                                                         16.


      k t                                                                                    qu




Ví d 6: a năng hóa toán t ()                truy c p      n ph n t c a ma tr n.
                                                    CT3_6.CPP
            //Chuong trinh 4.7
            #include <iostream.h>                                                        17.

            class Matrix
            {
                     private:
                                    int Rows,Cols;
                                    int **Data;
                         public:
                                    Matrix(int R=2,int C=2,int V=0);
                                    ~Matrix();
                                    void Print() const;
                                    int & operator () (int R,int C);
            };

            Matrix::Matrix(int R,int C,int V)
            {
                      int I,J;
                      Rows=R;
                      Cols=C;

                                                                                  Trang 36
L P TRÌNH HƯ NG    I TƯ NG V I C++              Smith Nguyen Studio.
                        Data = new int *[Rows];
                        int *Temp=new int[Rows*Cols];
                        for(I=0;I<Rows;++I)
                        {
                                   Data[I]=Temp;
                                   Temp+=Cols;
                        }
                        for(I=0;I<Rows;++I)
                                   for(J=0;J<Cols;++J)
                                             Data[I][J]=V;
           }

           Matrix::~Matrix()
           {
                     delete [] Data[0];
                     delete [] Data;
           }

           void Matrix::Print() const
           {
                       int I,J;
                       for(I=0;I<Rows;++I)
                       {
                                  for(J=0;J<Cols;++J)
                                  {
                                            cout.width(5);//Hien thi canh ler phai voi chieu
           dai 5 ky tu
                                            cout<<Data[I][J];
                                  }
                                  cout<<endl;
                       }
           }

           int & Matrix::operator () (int R,int C)
           {
                      return Data[R][C];
           }

           int main()
           {
                        int I,J;
                        Matrix M(2,3,1);
                        cout<<"Matrix:"<<endl;
                        M.Print();
                        for(I=0;I<2;++I)
                                   for(J=0;J<3;++J)
                                             M(I,J)*=(I+J+1);
                        cout<<"Matrix:"<<endl;
                        M.Print();
                        return 0;
           }

                                                                                               18.


      k t qu




                                                                                     Trang 37
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.




Ví d 7:   a năng hóa toán t ++ và --
                                       CT3_7.CPP
           #include <iostream.h>
                                                            19.
           class Point
           {
                   private:
                           int X,Y;
                   public:
                           Point(int A=0,int B=0);
                           Point operator ++();
                           Point operator --();
                           void Print() const;
           };

           Point::Point(int A,int B)
           {
                   X = A;
                   Y = B;
           }

           Point Point::operator++()
           {
                   ++X;
                   ++Y;
                   return *this;
           }

           Point Point::operator--()
           {
                   --X;
                   --Y;
                   return *this;
           }

           void Point::Print() const
           {
                   cout<<"X="<<X<<",Y="<<Y<<endl;
           }

           int main()
           {
                   Point P1(2,6),P2(5,8);
                   cout<<"Point 1:";
                   P1.Print();
                   cout<<"Point 2:";
                   P2.Print();
                   ++P1;
                   --P2;
                   cout<<"Point 1:";
                   P1.Print();

                                                     Trang 38
L P TRÌNH HƯ NG    I TƯ NG V I C++       Smith Nguyen Studio.
                     cout<<"Point 2:";
                     P2.Print();
                     return 0;
           }
                                                               20.


K t qu




Ví d 8: a năng hóa toán t d u ph y.
                                         CT3_8.CPP
               #include <iostream.h>
                                                               21.
           class Point
           {
                   private:
                           int X,Y;
                   public:
                           Point(int A=0,int B=0);
                           Point operator +(Point P);
                           Point operator ,(Point P);
                           void Print() const;
           };

           Point::Point(int A,int B)
           {
                   X = A;
                   Y = B;
           }

           Point Point::operator+(Point P)
           {
                   Point Tmp;
                   Tmp.X=X+P.X;
                   Tmp.Y=Y+P.Y;
                   return Tmp;
           }

           Point Point::operator,(Point P)
           {
                   Point Tmp;
                   Tmp.X=P.X;
                   Tmp.Y=P.Y;
                   cout<<P.X<<" "<<P.Y<<endl;
                   return Tmp;
           }

           void Point::Print() const
           {
                   cout<<"X="<<X<<",Y="<<Y<<endl;
           }


                                                        Trang 39
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
           int main()
           {
                   Point P1(2,6),P2(5,20),P3(1,1);
                   cout<<"Point 1:";
                   P1.Print();
                   cout<<"Point 2:";
                   P2.Print();
                   cout<<"Point 3:";
                   P3.Print();
                   P1=(P1,P1+P2,P3);
                   cout<<"Point 1:";
                   P1.Print();
                   return 0;
           }
                                                              22.

k t qu




Ví d 9: a năng hóa toán t ->.
                                       CT3_9.CPP
           #include <iostream.h>
                                                              23.
           class MyClass
           {
                   public:
                             int Data;
                             MyClass * operator ->()
                             {
                                     return this;
                             }
           };

           int main()
           {
                   MyClass M;
                   M->Data = 10;
                   cout<<M.Data<<" "<<M->Data;
                   return 0;
           }
                                                              24.

k t qu




Ví d 10: a năng hóa toán t gán.
                                       CT3_10.CPP



                                                       Trang 40
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
            #include <iostream.h>
           #include <string.h>                                       25.

           class String
           {
                   private:
                           char *St;
                           int Len;
                   public:
                           String(char *S);
                           ~String();
                           char *GetStr();
                           String & operator=(String &Obj);
           };

           String::String(char *S)
           {
                   Len=strlen(S);
                   St=new char[Len+1];
                   strcpy(St,S);
           }

           String::~String()
           {
                   delete []St;
           }

           char * String::GetStr()
           {
                   return St;
           }

           String & String::operator=(String &Obj)
           {
                   if (Len< Obj.Len)
                   {
                           delete [] St;
                           St=new char[Obj.Len+1];
                   }
                   Len=Obj.Len;
                   strcpy(St,Obj.St);
                   return *this;
           }

           int main()
           {
                   String S1("Hello"), S2("Chao");
                   cout<<"S1="<<S1.GetStr()<<endl;
                   cout<<"S2="<<S2.GetStr()<<endl;
                   S2=S1;
                   cout<<"S1="<<S1.GetStr()<<endl;
                   cout<<"S2="<<S2.GetStr()<<endl;
                   return 0;
           }


                                                                     26.

k t qu




                                                              Trang 41
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.



Ví d 11: Chúng ta s xây d ng m t l p x lý vi c t o và thao tác trên các chu i
(string). C++ không cài s n ki u d li u chu i. Nhưng C++ cho phép chúng ta thêm
ki u chu i như m t l p thông qua cơ ch a năng hóa.
                                     CT3_11.CPP
           #include   <iostream.h>
           #include   <iomanip.h>                                        27.
           #include   <string.h>
           #include   <assert.h>

           class String
           {
                   private:
                           char *Ptr;     //Con tro tro den diem bat
           dau cua chuoi
                           int Length; //Chieu dai chuoi
                   public:
                           String(const char * = ""); //Constructor
           chuyen doi
                           String(const String &);       //Constructor
           sao chep
                           ~String();                 //Destructor
                           const String &operator=(const String &);
           //Phep gan
                           String &operator+=(const String &);
                           int operator!() const;
                           int operator==(const String &) const;
                           int operator!=(const String &) const;
                           int operator<(const String &) const;
                           int operator>(const String &) const;
                           int operator>=(const String &) const;
                           int operator<=(const String &) const;
                           char & operator[](int);         //Tra ve ky
           tu tham chieu
                           String &operator()(int, int); //Tra ve mot
           chuoi con
                           int GetLength() const;
                           friend   ostream   &operator<<(ostream   &,
           const String &);
                           friend   istream   &operator>>(istream   &,
           String &);
           };

           //Constructor sao chep: Chuyen doi char * thanh String
           String::String(const char *S)
           {
                   cout << "Conversion constructor: " << S << endl;
                   Length = strlen(S);
                   Ptr = new char[Length + 1];
                   assert(Ptr != 0);
                   strcpy(Ptr, S);
           }

           String::String(const String &Copy)
           {
                   cout << "Copy constructor: " << Copy.Ptr << endl;

                                                                 Trang 42
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
                    Length = Copy.Length;
                    Ptr = new char[Length + 1];
                    assert(Ptr != 0);
                    strcpy(Ptr, Copy.Ptr);
           }

           //Destructor
           String::~String()
           {
                   cout << "Destructor: " << Ptr << endl;
                   delete [] Ptr;
           }

           const String &String::operator=(const String &Right)
           {
                   cout << "operator= called" << endl;
                   if (&Right != this)
                   {
                           delete [] Ptr;
                           Length = Right.Length;
                           Ptr = new char[Length + 1];
                           assert(Ptr != 0);
                           strcpy(Ptr, Right.Ptr);
                   }
                   else
                           cout << "Attempted assignment of a String
           to itself" << endl;
                   return *this;
           }

           String &String::operator+=(const String &Right)
           {
                   char *TempPtr = Ptr;
                   Length += Right.Length;
                   Ptr = new char[Length + 1];
                   assert(Ptr != 0);
                   strcpy(Ptr, TempPtr);
                   strcat(Ptr, Right.Ptr);
                   delete [] TempPtr;
                   return *this;
           }

           int String::operator!() const
           {
                   return Length == 0;
           }

           int String::operator==(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) == 0;
           }

           int String::operator!=(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) != 0;
           }

           int String::operator<(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) < 0;
           }

           int String::operator>(const String &Right) const

                                                               Trang 43
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
           {
                    return strcmp(Ptr, Right.Ptr) > 0;
           }

           int String::operator>=(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) >= 0;
           }

           int String::operator<=(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) <= 0;
           }

           char &String::operator[](int Subscript)
           {
                   assert(Subscript >= 0 && Subscript < Length);
                   return Ptr[Subscript];
           }

           String &String::operator()(int Index, int SubLength)
           {
                   assert(Index >= 0 && Index < Length && SubLength
           >= 0);
                   String *SubPtr = new String;
                   assert(SubPtr != 0);
                   if ((SubLength == 0) || (Index + SubLength >
           Length))
                           SubPtr->Length = Length - Index + 1;
                   else
                           SubPtr->Length = SubLength + 1;
                   delete SubPtr->Ptr;
                   SubPtr->Ptr = new char[SubPtr->Length];
                   assert(SubPtr->Ptr != 0);
                   strncpy(SubPtr->Ptr, &Ptr[Index], SubPtr->Length);
                   SubPtr->Ptr[SubPtr->Length] = '0';
                   return *SubPtr;
           }

           int String::GetLength() const
           {
                   return Length;
           }
           ostream &operator<<(ostream &Output, const String &S)
           {
                   Output << S.Ptr;
                   return Output;
           }

           istream &operator>>(istream &Input, String &S)
           {
                   char Temp[100];
                   Input >> setw(100) >> Temp;
                   S = Temp;
                   return Input;
           }

           int main()
           {
                   String S1("happy"), S2(" birthday"), S3;
                   cout << "S1 is "" << S1 << ""; S2 is "" << S2
                             << ""; S3 is "" << S3 << '"' << endl
                             << "The results of comparing S2 and S1:"

                                                                   Trang 44
L P TRÌNH HƯ NG    I TƯ NG V I C++    Smith Nguyen Studio.
           << endl
                                << "S2 == S1 yields " << (S2 == S1) <<
           endl
                                << "S2 != S1 yields " << (S2 != S1) <<
           endl
                                << "S2 >   S1 yields " << (S2 > S1) <<
           endl
                                << "S2 <   S1 yields " << (S2 < S1) <<
           endl
                                << "S2 >= S1 yields " << (S2 >= S1) <<
           endl
                                << "S2 <= S1 yields " << (S2 <= S1) <<
           endl;
                   cout << "Testing !S3:" << endl;
                   if (!S3)
                   {
                           cout << "S3 is empty; assigning S1 to S3;"
           << endl;
                           S3 = S1;
                           cout << "S3 is "" << S3 << """ << endl;
                   }
                   cout << "S1 += S2 yields S1 = ";
                   S1 += S2;
                   cout << S1 << endl;
                   cout << "S1 += " to you" yields" << endl;
                   S1 += " to you";
                   cout << "S1 = " << S1 << endl;
                   cout << "The substring of S1 starting at" << endl
                             << "location 0 for 14 characters, S1(0,
           14), is: "
                             << S1(0, 14) << endl;
                   cout << "The substring of S1 starting at" << endl
                             << "location 15, S1(15, 0), is: "
                             << S1(15, 0) <<endl; // 0 is "to end of
           string"
                   String *S4Ptr = new String(S1);
                   cout << "*S4Ptr = " << *S4Ptr <<endl;
                   cout << "assigning *S4Ptr to *S4Ptr" << endl;
                   *S4Ptr = *S4Ptr;
                   cout << "*S4Ptr = " << *S4Ptr << endl;
                   delete S4Ptr;
                   S1[0] = 'H';
                   S1[6] = 'B';
                   cout <<"S1 after S1[0] = 'H' and S1[6] = 'B' is:
           "<< S1 << endl;
                   cout << "Attempt to assign 'd' to S1[30] yields:"
           << endl;
                   S1[30] = 'd'; //Loi: Chi so vuot khoi mien!!!
                   return 0;
           }




                                                                         28.


k t qu




                                                                 Trang 45
L P TRÌNH HƯ NG   I TƯ NG V I C++   Smith Nguyen Studio.




D/ BÀI T P T GI I
Câu h i tr c nghi m
Câu 1:
   nh nghĩa nào úng cho toán t nh p(>>) c a m t l p T
   a) istream& operator>>(istream&);
   b) istream& operator>>(istream);
   c) friend istream& operator>>(istream&, T&);
   d) friend istream& operator>>(istream&, T);
                                                        Trang 46
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
Câu 2
 nh nghĩa nào phù h p nh t cho toán t l y thành ph n([]) c a l p m ng A
  a) int operator [] (int)
  b) int& operator [] (int)
  c) friend int operator [] (A&, int)
  d) friend int& operator [] (A&, int)
Câu 3:
Ch ra cách nh nghĩa toán t cho l p T b sai
  a) T operator-(T&)
  b) T operator-()
  c) T operator-()
  d) friend T opreator +(T&);
  e) T operator +(T&);
Câu 4:
Ch ra cách nh nghĩa toán t cho l p T bíai
  a) T& operator ++()
  b) T operator ++();
  c) T& operator++(int);
  d) T&operator++(float)
Câu 5:
Cho l p A
  class A
     {
       public:
         operator int ();
       };
       A a;
       int i=a;(1)
       float f=a;(2)
Ch ra dòng nào có l i
  a) Ch dòng 1 l i
  b) Ch dòng 2 l i
  c) C hai dòng u l i
  d) Không dòng nào l i
Bài tâp

Bài 1:
   T o ki u d li u Date bi u di n ngày, tháng, năm. Cài t các toán t        tính m t
ngày trư c ho c sau m t ngày xác nh nào ó, tính kho ng cách thao ngày gi a hai
ngày xác nh, tính th trong tu n c a ngày. Các toán t
vào ra cho ngày.
Bài 2:
        lưu tr m t ma tr n i x ng thì không c n     ô nh cho t t c các ph n t c a
nó. Xây d ng l p bi u di n ma tr n i x ng có các toán t truy nh p t ng ph n t c a
ma tr n. Ch s d ng       lư ng b nh c n thi t    lưu ma tr n i x ng
Bài 3
   Xây d ng l p bi u di n các a th c v i các toán t c ng, tr , nhân, chia và o d u.
   nh nghĩa toán t xu t    k t xu t.
Bài 4:
   Xây d ng m t l p map cho phép bi u di n m t ánh x t m t chu i kí t thành m t
giá tr s nguyên. nh nghĩa toán t [] cho l p     có th s d ng ánh x theo cách như
[“abc”]->5

                                                                     Trang 47
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
Bài 5
  Xây d ng m t l p bi u di n các vector n chi u v i các toán t c ng, tr , tích có
hư ng hai vector và tích vô hư ng m t vector v i m t s th c. nh nghĩa toán t cho
phép truy nh p các thành ph n c a vector.




                                                                   Trang 48
Lap trinh huong doi tuong voi c++   smith.n studio
Lap trinh huong doi tuong voi c++   smith.n studio
Lap trinh huong doi tuong voi c++   smith.n studio
Lap trinh huong doi tuong voi c++   smith.n studio

More Related Content

What's hot

Phong cach lap trinh c++
Phong cach lap trinh c++Phong cach lap trinh c++
Phong cach lap trinh c++
ptquang160492
 
Ky thuat lap trinh c++
Ky thuat lap trinh c++Ky thuat lap trinh c++
Ky thuat lap trinh c++
ptquang160492
 
Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Congdat Le
 
C9 templates
C9 templatesC9 templates
C9 templates
Tiến Quang Phan
 
Bai 17
Bai 17Bai 17
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansi
Huynh MVT
 
lap trinh c Phan2 chuong5
 lap trinh c Phan2 chuong5 lap trinh c Phan2 chuong5
lap trinh c Phan2 chuong5thanhyu
 
Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++tuandong_ptit
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: HàmHuy Rùa
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việt
Môi Trường Việt
 
Nmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcNmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltc
Minh Ngoc Tran
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
mai_non
 
Bài 18 tin hoc 11
Bài 18 tin hoc 11Bài 18 tin hoc 11
Bài 18 tin hoc 11HaBaoChau
 

What's hot (14)

Phong cach lap trinh c++
Phong cach lap trinh c++Phong cach lap trinh c++
Phong cach lap trinh c++
 
Ky thuat lap trinh c++
Ky thuat lap trinh c++Ky thuat lap trinh c++
Ky thuat lap trinh c++
 
T4
T4T4
T4
 
Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++
 
C9 templates
C9 templatesC9 templates
C9 templates
 
Bai 17
Bai 17Bai 17
Bai 17
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansi
 
lap trinh c Phan2 chuong5
 lap trinh c Phan2 chuong5 lap trinh c Phan2 chuong5
lap trinh c Phan2 chuong5
 
Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: Hàm
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việt
 
Nmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcNmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltc
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
 
Bài 18 tin hoc 11
Bài 18 tin hoc 11Bài 18 tin hoc 11
Bài 18 tin hoc 11
 

Similar to Lap trinh huong doi tuong voi c++ smith.n studio

C++ can ban
C++ can banC++ can ban
C++ can ban
ThØȵg Lȝ
 
C3 functions and_library
C3 functions and_libraryC3 functions and_library
C3 functions and_libraryHồ Lợi
 
C++ can ban(dung thu vien iostream)
C++ can ban(dung thu vien iostream)C++ can ban(dung thu vien iostream)
C++ can ban(dung thu vien iostream)Nguyễn Phụng
 
Lap trinh huong_doi_tuong
Lap trinh huong_doi_tuongLap trinh huong_doi_tuong
Lap trinh huong_doi_tuong
vovantrjnh
 
C2 basics of_c_and_cpp
C2 basics of_c_and_cppC2 basics of_c_and_cpp
C2 basics of_c_and_cppHồ Lợi
 
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vnPdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
MasterCode.vn
 
Bồi dưỡng HSG Tin chuyên đề thuật toán
Bồi dưỡng HSG Tin chuyên đề thuật toánBồi dưỡng HSG Tin chuyên đề thuật toán
Bồi dưỡng HSG Tin chuyên đề thuật toán
Nguyễn Đức
 
Giáo trình lập trình C
Giáo trình lập trình CGiáo trình lập trình C
Giáo trình lập trình C
Freelancer
 
Pascal 2
Pascal 2Pascal 2
Pascal 2
Võ Tâm Long
 
Thdc 07
Thdc 07Thdc 07
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Sân Ngoài Còn Lá
 
Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++
LAnhHuy4
 

Similar to Lap trinh huong doi tuong voi c++ smith.n studio (20)

C++ can ban
C++ can banC++ can ban
C++ can ban
 
C3 functions and_library
C3 functions and_libraryC3 functions and_library
C3 functions and_library
 
C3 functions and_library
C3 functions and_libraryC3 functions and_library
C3 functions and_library
 
Bai 18
Bai 18Bai 18
Bai 18
 
C++ can ban(dung thu vien iostream)
C++ can ban(dung thu vien iostream)C++ can ban(dung thu vien iostream)
C++ can ban(dung thu vien iostream)
 
Lap trinh huong_doi_tuong
Lap trinh huong_doi_tuongLap trinh huong_doi_tuong
Lap trinh huong_doi_tuong
 
C2 basics of_c_and_cpp
C2 basics of_c_and_cppC2 basics of_c_and_cpp
C2 basics of_c_and_cpp
 
C2 basics of_c_and_cpp
C2 basics of_c_and_cppC2 basics of_c_and_cpp
C2 basics of_c_and_cpp
 
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vnPdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
 
Bồi dưỡng HSG Tin chuyên đề thuật toán
Bồi dưỡng HSG Tin chuyên đề thuật toánBồi dưỡng HSG Tin chuyên đề thuật toán
Bồi dưỡng HSG Tin chuyên đề thuật toán
 
Giáo trình lập trình C
Giáo trình lập trình CGiáo trình lập trình C
Giáo trình lập trình C
 
Ctdl lab01
Ctdl lab01Ctdl lab01
Ctdl lab01
 
Chuong 09 vb
Chuong 09   vbChuong 09   vb
Chuong 09 vb
 
Chuong 2
Chuong 2Chuong 2
Chuong 2
 
Pascal 2
Pascal 2Pascal 2
Pascal 2
 
Thdc 07
Thdc 07Thdc 07
Thdc 07
 
Tn ktlt
Tn ktltTn ktlt
Tn ktlt
 
C9 templates
C9 templatesC9 templates
C9 templates
 
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
 
Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++
 

More from na

Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oopna
 
Ky.thuat.vi.xu.ly uds
Ky.thuat.vi.xu.ly udsKy.thuat.vi.xu.ly uds
Ky.thuat.vi.xu.ly udsna
 
Chuong13
Chuong13Chuong13
Chuong13na
 
Chuong12
Chuong12Chuong12
Chuong12na
 
Chuong11
Chuong11Chuong11
Chuong11na
 
Chuong09
Chuong09Chuong09
Chuong09na
 
Chuong08
Chuong08Chuong08
Chuong08na
 
Chuong07
Chuong07Chuong07
Chuong07na
 
Chuong06
Chuong06Chuong06
Chuong06na
 
Chuong05
Chuong05Chuong05
Chuong05na
 
Chuong04
Chuong04Chuong04
Chuong04na
 
Chuong03
Chuong03Chuong03
Chuong03na
 
Chuong02
Chuong02Chuong02
Chuong02na
 
Chuong01
Chuong01Chuong01
Chuong01na
 
Chuong10
Chuong10Chuong10
Chuong10na
 

More from na (15)

Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oop
 
Ky.thuat.vi.xu.ly uds
Ky.thuat.vi.xu.ly udsKy.thuat.vi.xu.ly uds
Ky.thuat.vi.xu.ly uds
 
Chuong13
Chuong13Chuong13
Chuong13
 
Chuong12
Chuong12Chuong12
Chuong12
 
Chuong11
Chuong11Chuong11
Chuong11
 
Chuong09
Chuong09Chuong09
Chuong09
 
Chuong08
Chuong08Chuong08
Chuong08
 
Chuong07
Chuong07Chuong07
Chuong07
 
Chuong06
Chuong06Chuong06
Chuong06
 
Chuong05
Chuong05Chuong05
Chuong05
 
Chuong04
Chuong04Chuong04
Chuong04
 
Chuong03
Chuong03Chuong03
Chuong03
 
Chuong02
Chuong02Chuong02
Chuong02
 
Chuong01
Chuong01Chuong01
Chuong01
 
Chuong10
Chuong10Chuong10
Chuong10
 

Recently uploaded

THONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdfTHONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdf
QucHHunhnh
 
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdfDANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
thanhluan21
 
bài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docxbài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docx
HiYnThTh
 
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdfTừ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Man_Ebook
 
Smartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024juneSmartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024june
SmartBiz
 
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
khanhthy3000
 
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...
Bồi Dưỡng HSG Toán Lớp 3
 
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
Nguyen Thanh Tu Collection
 
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thươngPLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
hieutrinhvan27052005
 
Halloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary schoolHalloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary school
AnhPhm265031
 
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docxBÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
HngL891608
 
tiếng việt dành cho sinh viên ngoại ngữ h
tiếng việt dành cho sinh viên ngoại ngữ htiếng việt dành cho sinh viên ngoại ngữ h
tiếng việt dành cho sinh viên ngoại ngữ h
huynhanhthu082007
 
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
Nguyen Thanh Tu Collection
 
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang ThiềuBiểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
lamluanvan.net Viết thuê luận văn
 
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
Nguyen Thanh Tu Collection
 
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủYHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
duyanh05052004
 
trắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxdddddddddddddddddtrắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxddddddddddddddddd
my21xn0084
 
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
NamNguynHi23
 
Từ vay mượn trong tiếng Anh trên các phương tiện tin đại chúng
Từ vay mượn trong tiếng Anh trên các phương tiện tin đại chúngTừ vay mượn trong tiếng Anh trên các phương tiện tin đại chúng
Từ vay mượn trong tiếng Anh trên các phương tiện tin đại chúng
MinhSangPhmHunh
 

Recently uploaded (19)

THONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdfTHONG BAO nop ho so xet tuyen TS6 24-25.pdf
THONG BAO nop ho so xet tuyen TS6 24-25.pdf
 
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdfDANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
DANH SÁCH XÉT TUYỂN SỚM_NĂM 2023_học ba DPY.pdf
 
bài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docxbài dự thi chính luận 2024 đảng chọn lọc.docx
bài dự thi chính luận 2024 đảng chọn lọc.docx
 
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdfTừ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
Từ ngữ về con người và chiến tranh trong Nhật ký Đặng Thùy Trâm.pdf
 
Smartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024juneSmartbiz_He thong MES nganh may mac_2024june
Smartbiz_He thong MES nganh may mac_2024june
 
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
100 DẪN CHỨNG NGHỊ LUẬN XÃ HỘiI HAY.docx
 
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...
 
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
BÀI TẬP BỔ TRỢ TIẾNG ANH I-LEARN SMART WORLD 9 CẢ NĂM CÓ TEST THEO UNIT NĂM H...
 
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thươngPLĐC-chương 1 (1).ppt của trường  ĐH Ngoại thương
PLĐC-chương 1 (1).ppt của trường ĐH Ngoại thương
 
Halloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary schoolHalloween vocabulary for kids in primary school
Halloween vocabulary for kids in primary school
 
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docxBÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
BÁO CÁO CUỐI KỲ PHÂN TÍCH THIẾT KẾ HƯỚNG ĐỐI TƯỢNG - NHÓM 7.docx
 
tiếng việt dành cho sinh viên ngoại ngữ h
tiếng việt dành cho sinh viên ngoại ngữ htiếng việt dành cho sinh viên ngoại ngữ h
tiếng việt dành cho sinh viên ngoại ngữ h
 
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 - SÁCH MỚI - FORM BÀI TẬP 2025 (DÙNG CHUNG ...
 
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang ThiềuBiểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
Biểu tượng trăng và bầu trời trong tác phẩm của Nguyễn Quang Thiều
 
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
BÀI TẬP DẠY THÊM HÓA HỌC LỚP 12 - CẢ NĂM - THEO FORM THI MỚI BGD 2025 (DÙNG C...
 
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủYHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
YHocData.com-bộ-câu-hỏi-mô-phôi.pdf đầy đủ
 
trắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxdddddddddddddddddtrắc nhiệm ký sinh.docxddddddddddddddddd
trắc nhiệm ký sinh.docxddddddddddddddddd
 
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
[NBV]-CHUYÊN ĐỀ 3. GTLN-GTNN CỦA HÀM SỐ (CÓ ĐÁP ÁN CHI TIẾT).pdf
 
Từ vay mượn trong tiếng Anh trên các phương tiện tin đại chúng
Từ vay mượn trong tiếng Anh trên các phương tiện tin đại chúngTừ vay mượn trong tiếng Anh trên các phương tiện tin đại chúng
Từ vay mượn trong tiếng Anh trên các phương tiện tin đại chúng
 

Lap trinh huong doi tuong voi c++ smith.n studio

  • 1. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Mét sè tiÖn Ých vµ më réng cña C++ so víi C M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C Nh p/xu t d li u s d ng toán t cin và cout Vi t chú thích trên m t dòng, khai báo bi n m i nơi, c p phát và thu h i b nh ng s d ng toán new và delete, Gi i các bài t p có s d ng k thu t ch ng hàm, thâm s ng m nh. A/ TÓM T T LÝ THUY T - C++ là m t s m i r ng c a C, do ó có th s d ng m t chương trình biên d ch C++ d ch và th c hi n các chương trình vi t b ng C - C yêu c u các chú thích n m gi a /* và */. C++ cho phép t o m t chú thích b t u b ng “//” cho n h t dòng - C++ cho phép khai báo tuỳ ý. Th m chí có th khai báo bi n trong ph n kh i t o c a câu lênh l p for - C++ cho phép truy n tham s cho hàm b ng tham chi u. i u này tương t như truy n tham bi n cho chương trình con trong ngôn ng l p trình PASCAL. Trong l i g i hàm ta dùng tên bi n và bi n ó s ư c truy n cho hàm qua tham chi u. i u ó cho phép thao tác tr c ti p trên bi n ư c truy n ch không ph i gián ti p qua bi n tr . - Toán t new và delete trong C++ ư c dùng qu n lý b nh ng thay vì các hàm c p phát ng c a C - C++ cho phép ngư i vi t chương trình mô t các giá tr ng m nh cho các tham s c a hàm, nh ó hàm có th ư c g i v i m t danh sách các tham s không . - Toán t “::” cho phép truy nh p bi n toàn c c khi ng th i s d ng bi n c c b và toàn c c cùng tên. - Có th nh nghĩa các hàm cùng tên v i các tham s khác nhau. Hai hàm cùng tên s ư c phân bi t nh giá tr tr v và danh sách ki u các tham s . B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...) Các l i thư ng g p Quên óng */ cho các chú thích Khai báo bi n sau khi bi n ư c s d ng S d ng l nh return tr v giá tr nhưng khi nh nghĩa hàm l i mô t hàm ki u void ho c ngư c l i, quên câu l nh này trong trư ng h p hàm yêu c u giá tr tr v . Không có hàm nguyên m u cho các hàm B qua kh i t o cho các bi n tham chi u Thay i giá tr c a các h ng T o các hàm cùng tên, cùng tham s . M t s thói quen l p trình t t S d ng “//” tránh l i không óng */ khi chú thích n m g n trong m t dòng. S d ng các kh năng vào ra m i c a C++ chương trình d c hơn. t các khai báo biên lên u kh i l nh. Ch dùng t khoá inline v i các hàm “nh ”,”không ph c t p”. S d ng con tr truy n tham s cho hàm khi c n thay i giá tr tham s , còn tham chi u dùng truy n các tham s có kích thư c l n mà không có nhu c u thay i n i dung. Tránh s d ng bi n cùng tên cho nhi u m c ch khác nhau trong chương trình. Trang 1
  • 2. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. C/ BÀI T P M U Ví d 1: C++ ch p nh n hai ki u chú thích. Các l p trình viên b ng C ã quen v i cách chú thích b ng /*…*/. Trình biên d ch s b qua m i th n m gi a /*…*/. Xét chương trình sau : CT1_1.CPP /* Chương trình in các s t 0 n 9. 1. */ #include <iostream.h> void main() { int I; for(I = 0; I < 10 ; ++ I)// 0 - 9 cout<<I<<"n"; // In ra 0 - 9 } 2. M i th n m gi a /*…*/ t dòng 1 n dòng 3 u ư c chương trình b qua. Chương trình này còn minh h a cách chú thích th hai. ó là cách chú thích b t u b ng // dòng 8 và dòng 9. k t qu Nói chung, ki u chú thích /*…*/ ư c dùng cho các kh i chú thích l n g m nhi u dòng, còn ki u // ư c dùng cho các chú thích m t dòng. Ví d 2: Chương trình nh p vào hai s . Tính t ng và hi u c a hai s v a nh p. CT1_2.CPP #include <iostream.h> void main() { int X, Y; cout<< "Nhap vao mot so X:"; Trang 2
  • 3. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. cin>>X; cout<< "Nhap vao mot so Y:"; cin>>Y; cout<<"Tong cua chung:"<<X+Y<<"n"; cout<<"Hieu cua chung:"<<X-Y<<"n"; } Ví d 3: S d ng toán t xu t nh p vi t th c ơn cho chương trình: CT1_2.CPP #include <iostream.h> void menu() { cout<<” Menu n”; cout<<”1. Cong viec 1n”; cout<<”2. Cong viec 2n”; cout<<”3. Cong viec 3n”; cout<<”4. Ket thuc chuong trinh nn”; } void main() { int lc; do { // viet menu len man hinh menu(); //lay lua chon cout<<”Ban hay chon cong viec can thuc hien:1->4”;cin>>lc; switch(lc) { case 1:cout<<”Thuc hien cong viec 1n”; break; case 2:cout<<”Thuc hien cong viec 2n”; break; case 3:cout<<”Thuc hien cong viec 3n”; break; } //lap cho den khi nguoi su dung lua chon 4 } while(lc!=4); } Ví d 4: Tìm l i sai c a o n chương trình sau: int n; cin>>n; for(int i=0;i<n;i++) { int a[100]; cin>>a[i]; } for(i=0;i<n;i++) cout<<a[i]; L ig i Chương trình b l i trong vòng for th hai do bi n m ng a không ư c nh nghĩa. M ng a ư c khai báo trong vòng for th nh t ch có t m ho t ng trong vòng for ó mài thôi. Do v y, chương trình không th bi t trong vòng l p for th hai. Chú ý Trang 3
  • 4. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. bi n nguyên i ư c khai báo trong dòng l nh for có v trí tương ương v i vi c khai báo i bên ngoài for. Vì v y, trong vòng for th hai ta s d ng bi n i nhưng chương trình không báo l i. Ví d 5: Tìm l i sai cho các khai báo prototype hàm dư i ây (các hài này ư c khai báo trong cùng m t chương trình) int func1(int); // (1) float func1(int); // (2) int func1(float); //(3) void func1(int=0,int); //(4) void func2(int,int=0); //(5) void func2(int); //(6) void func2(float); //(7) L i g i: Trong nh nghĩa ch ng hàm, trình biên d ch phân bi t các hàm b i ki u d li u tr ra c a hàm mà ch phân bi t b i danh sách tham s c a hàm. Do v y hàm 1 và hàm 2 b nh nghĩa ch ng lên nhau và trình biên d ch báo l i. Gi a hàm 2 và hàm 3 không có l i b i chúng khác nhau b i ki u d li u c a tham s . Trong hàm 4 ta ã s d ng sai cách truy n giá tr m c nh cho tham s . Không báo gi truy n giá tr m c nh cho m t tham s trư c m t tham s không ư c truy n giá tr ng m nh. Trong cách nh nghĩa hai hàm 5 và 6 có s nh p nh ng. Khi ta g i hàm func2 v i tham s là m t s nguyên thì trình biên d ch không bi t là s g i hàm 5 hay hàm 6 b i vì c hai hàm này u ư c. Trong trư ng h p này trình biên d ch cũng thông báo l i. Ví d 6: Tìm l i sai(l i cú pháp và b nh ) cho chương trình sau: int & refl() { int a=5; return a; } int & rè2(int a) { a++; return a; } int & ref3(int & a) { a++; return a; } int a=5; int &r1; int &r2=22; int &r3=a; int &r4=ref3(5); int &r5=ref3(a); Tr l i: Trong các hàm có k t qu tr v là m t tham chi u, chúng ta luôn ph i chú ý r ng bi n ư c tr l i có giá tr là tham chi u không b xoá kho i b nh chương trình khi k t thúc th c hi n hàm. Do v y hai hàm ref1 và ref2 là sai b i vì nó tr v tham chi u t i biên mà a l i là bi n c c b trong ref1 và là tham s trong ref2 ch ư c t o ra t m th i Trang 4
  • 5. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. trên stack khi g i hàm và xoá kh i stack khi k t thúc hàm. Hàm ref3 không có l i vì a là m t tham chi u t i m t bi n không n m trong hàm. Trong khái báo các tham chi u ph i ư c g n v i m t bi n nào ó trong b nh . Do v y các khai báo r1, r2 là sai. L i g i ref3(5) cũng là sai b i vì tham s cho hàm ph i là tham chi u n m t bi n, trong khi ó ta l i truy n vào h ng s . Ví d 7: Cho bi t k t qu th c hi n chương trình sau: #include <iostream.h> int & foo(int &a,int b) { b+=a; if (b>5) a++; return a; } void main() { int i=2,j=4; int k=foo(i,j); k++; cout<<i<<” “<<j<<” “<<k<<endl; int &l=foo(i,j); l++ ; cout<<i<<” “<<j<<” “<<l<<endl; } L i g i: Trong chương trình trên c n chú ý hai i m. Thi nh t là ta truy n vào cho hàm tham chi u c a bi n i ch không ph i bi n i. Do v y, m i thay i c a tham s này trong hàm là thay i t i bi n i ư c tham chi u t i. Tương t như v y v i tham chi u l. Tham chi u l ư c xác l p b ng tham chi u tr ra c a hàm chính là tham chi u t i bi n i. Do v y m i thay i l chính là thay i i. Ví d 8: Vi t m t hàm hoanvi dùng hoán v hai s nguyên. Sau ó viêt chương trình nh p và s p x p m t m ng s nguyên. Tr l i: CT1_8.CPP #include <iostream.h> void hoanvi(int &a,int &b) { int tam=a; a=b; b=tam; } void main() { // Nhap du lieu int n; cout<<” Ban hay cho so phan tu cua mang n=”;cin>>n; //Cap phat bo nho cho mang int *a=new int(n); cout<<”n Hay nhap gia tri cho cac phan tu cua mang n”; for(int i=0;i<n;++i) { cout<<”a[“<<i<<”]=”;cin>>a[i]; } // Sap xep for(i=0;i<n-1;i++) for(int j=i++;j<n;j++) Trang 5
  • 6. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. if (a[i]>a[j]) hoanvi(a[i],a[j]); // In ket qua cout<<”n Cac phan tu cua mang sau khi da sap xep la n”; for(i=0;i<n;i++) cout<<a[i]<<” “; delete a; } Ví d 9: Chương trình t o m t m ng ng, kh i ng m ng này v i các giá tr ng u nhiên và s p x p chúng. CT1_9.CPP #include <iostream.h> #include <time.h> #include <stdlib.h> void main() { int N; cout<<"Nhap vao so phan tu cua mang:"; cin>>N; int *P=new int[N]; if (P==NULL) { cout<<"Khong con bo nho de cap phatn"; } srand((unsigned)time(NULL)); for(int I=0;I<N;++I) P[I]=rand()%100; //T o các s ng u nhiên t 0 n 99 cout<<"Mang truoc khi sap xepn"; for(I=0;I<N;++I) cout<<P[I]<<" "; for(I=0;I<N-1;++I) for(int J=I+1;J<N;++J) if (P[I]>P[J]) { int Temp=P[I]; P[I]=P[J]; P[J]=Temp; } cout<<"nMang sau khi sap xepn"; for(I=0;I<N;++I) cout<<P[I]<<" "; delete []P; } k t qu Trang 6
  • 7. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 10: Chương trình c ng hai ma tr n trong ó m i ma tr n ư c c p phát ng. Chúng ta có th xem m ng hai chi u như m ng m t chi u như hình 1.2 dư i ây Hình 1.2: M ng hai chi u có th xem như m ng m t chi u. G i X là m ng hai chi u có kích thư c m dòng và n c t. A là m ng m t chi u tương ng. N u X[i][j] chính là A[k] thì k = i*n + j Chúng ta có chương trình như sau : CT1_10.CPP #include <iostream.h> #include <conio.h> //prototype void AddMatrix(int * A,int *B,int*C,int M,int N); int AllocMatrix(int **A,int M,int N); void FreeMatrix(int *A); void InputMatrix(int *A,int M,int N,char Symbol); void DisplayMatrix(int *A,int M,int N); int main() { int M,N; int *A = NULL,*B = NULL,*C = NULL; clrscr(); cout<<"Nhap so dong cua ma tran:"; cin>>M; cout<<"Nhap so cot cua ma tran:"; cin>>N; //C p phát vùng nh cho ma tr n A if (!AllocMatrix(&A,M,N)) { //endl: Xu t ra kí t xu ng dòng (‘n’) cout<<"Khong con du bo nho!"<<endl; return 1; } //C p phát vùng nh cho ma tr n B if (!AllocMatrix(&B,M,N)) { Trang 7
  • 8. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. cout<<"Khong con du bo nho!"<<endl; FreeMatrix(A);//Gi i phóng vùng nh A return 1; } //C p phát vùng nh cho ma tr n C if (!AllocMatrix(&C,M,N)) { cout<<"Khong con du bo nho!"<<endl; FreeMatrix(A);//Gi i phóng vùng nh A FreeMatrix(B);//Gi i phóng vùng nh B return 1; } cout<<"Nhap ma tran thu 1"<<endl; InputMatrix(A,M,N,'A'); cout<<"Nhap ma tran thu 2"<<endl; InputMatrix(B,M,N,'B'); clrscr(); cout<<"Ma tran thu 1"<<endl; DisplayMatrix(A,M,N); cout<<"Ma tran thu 2"<<endl; DisplayMatrix(B,M,N); AddMatrix(A,B,C,M,N); cout<<"Tong hai ma tran"<<endl; DisplayMatrix(C,M,N); FreeMatrix(A);//Gi i phóng vùng nh A FreeMatrix(B);//Gi i phóng vùng nh B FreeMatrix(C);//Gi i phóng vùng nh C return 0; } //C ng hai ma tr n void AddMatrix(int *A,int *B,int*C,int M,int N) { for(int I=0;I<M*N;++I) C[I] = A[I] + B[I]; } //C p phát vùng nh cho ma tr n int AllocMatrix(int **A,int M,int N) { *A = new int [M*N]; if (*A == NULL) return 0; return 1; } //Gi i phóng vùng nh void FreeMatrix(int *A) { if (A!=NULL) delete [] A; } //Nh p các giá tr c a ma tr n void InputMatrix(int *A,int M,int N,char Symbol) { for(int I=0;I<M;++I) for(int J=0;J<N;++J) { cout<<Symbol<<"["<<I<<"]["<<J<<"]="; cin>>A[I*N+J]; } } //Hi n th ma tr n void DisplayMatrix(int *A,int M,int N) { Trang 8
  • 9. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. for(int I=0;I<M;++I) { for(int J=0;J<N;++J) { out.width(7);//Hien thi canh le phai voi chieu dai 7 ky tu cout<<A[I*N+J]; } cout<<endl; } } k t qu D/ BÀI T P T GI I Câu h i tr c nghi m Câu 1: Cho bi t giá tr c a k sau khi th c hi n o n chương trình int i=5,k; { int i=6; ::i--; k=i; } k-=i; V i các k t qu : a) k=0 b) k=1 c) k=2 d)k=3 Câu 2: Tìm l i g i hàm sai cho hàm sau: void func(int i=0,int j=0); a)func() b)dunc(1); Trang 9
  • 10. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. c)func(1.5,2.5); d)func(1,2); Câu 3: Cho bi t giá tr c a y sau khi th c hi n: int &foo(int &a) { a++; return a; } int i=5; int &r=foo(i); r++; a) i=5; b) i=6; c) i=7; d) không câu nào úng Câu 4: Tìm giá tr c a x, y: void test(int &a, int b) { a+=b; b=a; } int x=1,y=2; test(x,y); a) x=1,y=2; b) x=1,y=3 c) x=3,y=2 d) x=3,y=3 Bài t p t gi i Bài 1.1: Anh (ch ) hãy vi t l i chương trình sau b ng cách s d ng l i các dòng nh p/xu t trong C++. /* Chương trình tìm m u chung nh nh t */ #include <stdio.h> void main() { int a,b,i,min; printf("Nhap vao hai so:"); scanf("%d%d",&a,&b); min=a>b?b:a; Trang 10
  • 11. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. for(i = 2;i<min;++i) if (((a%i)==0)&&((b%i)==0)) break; if(i==min) { printf("Khong co mau chung nho nhat"); } printf("Mau chung nho nhat la %dn",i); } Bài 1.2: Vi t chương trình nh p vào s nguyên dương h (2<h<23), sau ó in ra các tam giác có chi u cao là h như các hình sau: Bài 1.3: M t tam giác vuông có th có t t c các c nh là các s nguyên. T p c a ba s nguyên c a các c nh c a m t tam giác vuông ư c g i là b ba Pitago. ó là t ng bình phương c a hai c nh b ng bình phương c a c nh huy n, ch ng h n b ba Pitago (3, 4, 5). Vi t chương trình tìm t t c các b ba Pitago như th sao cho t t c các c nh không quá 500. Bài 1.4: Vi t chương trình in b ng c a các s t 1 n 256 dư i d ng nh phân, bát phân và th p l c phân tương ng. Bài 1.5: Vi t chương trình nh p vào m t s nguyên dương n. Ki m tra xem s nguyên n có thu c dãy Fibonacci không? Bài 1.6: Vi t chương trình nhân hai ma trân Amxn và Bnxp. M i ma tr n ư c c p phát ng và các giá tr c a chúng phát sinh ng u nhiên (V i m, n và p nh p t bàn phím). Trang 11
  • 12. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 1.7: Vi t chương trình t o m t m ng m t chi u ng có kích thư c là n (n nh p t bàn phím). Các giá tr c a m ng này ư c phát sinh ng u nhiên trên o n [a, b] v i a và b u nh p t bàn phím. Hãy tìm s dương nh nh t và s âm l n nh t trong m ng; n u không có s dương nh nh t ho c s âm l n nh t thì xu t thông báo "không có s dương nh nh t" ho c "không có s âm l n nh t". Bài 1.8: Anh (ch ) hãy vi t m t hàm tính bình phương c a m t s . Hàm s tr v giá tr bình phương c a tham s và có ki u cùng ki u v i tham s . Bài 1.9: Trong ngôn ng C, chúng ta có hàm chuy n i m t chu i sang s , tùy thu c vào d ng c a chu i chúng ta có các hàm chuy n i sau : int atoi(const char *s); Chuy n i m t chu i s thành s nguyên ki u int. long atol(const char *s); Chuy n i m t chu i s thành s nguyên ki u long. double atof(const char *s); Chuy n i m t chu i s thành s th c ki u double. Anh (ch ) hãy vi t m t hàm có tên là aton (ascii to number) chuy n i chu i sang các d ng s tương ng. Bài 1.10: Anh ch hãy vi t các hàm sau: Hàm ComputeCircle() tính di n tích s và chu vi c c a m t ư ng tròn bán kính r. Hàm này có prototype như sau: void ComputeCircle(float & s, float &c, float r = 1.0); Hàm ComputeRectangle() tính di n tích s và chu vi p c a m t hình ch nh t có chi u cao h và chi u r ng w. Hàm này có prototype như sau: void ComputeRectangle(float & s, float &p, float h = 1.0, float w = 1.0); Hàm ComputeTriangle() tính di n tích s và chu vi p c a m t tam giác có ba c nh a,b và c. Hàm này có prototype như sau: void ComputeTriangle(float & s, float &p, float a = 1.0, float b = 1.0, float c = 1.0); Hàm ComputeSphere() tính th tích v và di n tích b m t s c a m t hình c u có bán kính r. Hàm này có prototype như sau: void ComputeSphere(float & v, float &s, float r = 1.0); Trang 12
  • 13. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Hàm ComputeCylinder() tính th tích v và di n tích b m t s c a m t hình tr có bán kính r và chi u cao h. Hàm này có prototype như sau: void ComputeCylinder(float & v, float &s, float r = 1.0 , float h = 1.0); Bài 1.11: Vi t chương trình qu n lý i m h c sinh v i c u trúc danh sách n i ơn. Trong chương trình s d ng toán t vào ra và toán t new c p phát b nh ng. Bài 1.12: Vi t m t hàm th c hi n vi c s p x p m t m ng s nguyên theo chi u tăng d n ho c gi m d n. Hàm này t ng m c nh ki u s p x p theo chi u tăng d n. Bài 1.13: Vi t m t hàm gi i phương trình b c hai. Hàm này tr l i thông báo r ng phương trình có nghi m hay không có nghi m kép. N u có nghi m thì nghi m s ư c lưu vào tham s x1, x2 và ư c truy n như là tham bi n. Bài 1.14:Vi t m t hàm tìm v trí xu t hi n u tiên c a m t t khoá trong m t xâu. Hàm này tr l i v trí tìm th y c a t khoá trong xâu(b t u t 0) và thay i con tr xâu ư c truy n vào thành v trí c a ký t ngay sau ký t cu i cùng c a t khoá. T khoá c n tìm ư c ưa vào như là m t tham s và có m t giá tr m c nh. Trang 13
  • 14. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. §èi t−îng vµ líp (Class and Object) M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C Phân tích ư c khái ni m óng gói d li u Khai báo và s d ng m t l p Khai báo và s d ng i tư ng. S d ng hàm thi t l p và hàm hu b Khai báo và s d ng hàm thi t l p sao chép Vai trò c a hàm thi t l p ng m nh A/ NH C L I LÝ THUY T Trong C++, tên c u trúc là m t ki u d li u không c n kèm theo t khoá struct. L p cho phép ngư i l p trình mô t các i tư ng th c t v i các thu c tính và hành vi. Trong C++ thư ng s d ng t khoá class khai báo m t l p. Tên l p là m t ki u d li u dùng khi khai báo các i tư ng thư c l p(các th hi n c th c a l p). Thu c tính c a i tư ng trong m t l p ư c mô t dư i d ng các bi n th hi n. Các hành vi là các hàm thành ph n bên trong l p. Có hai cách nh nghĩa các hàm thành ph n c a m t l p; khi nh nghĩa hàm thành ph n bên ngoài khai báo l p ph i t trư c tên hàm thành ph n tên c a l p và toán t “::” phân bi t v i các hàm t do cùng tên. Ch nên nh nghĩa hàm thành ph n bên trong khai báo l p khi nó không quá ph c t p cho chương trình d c. Có th khai báo và s d ng các con tr i tư ng, tham chi u i tư ng. Hai t khoá public và private dùng ch nh thu c tính truy nh p cho các thành ph n( d li u/hàm) khai báo bên trong l p. Thành ph n bên trong l p ư c khai báo public có th truy nh p t m i hàm khai báo m t i tư ng thu c l p ó. Thành ph n private trong m t i tư ng ch có th truy nh p ư c b i các hàm thành ph n c a i tư ng ho c các hàm thành ph n c a l p dùng t o i tư ng( ây tính c trư ng h p i tư ng là tham s c a hàm thành ph n) Hai hàm thành ph n c bi t c a m t l p g i là hàm thi t l p và hàm hu b . Hàm thi t l p ư c g i t ng(ng m nh) m i khi m t i tư ng ư c t o ra và hàm hu b ư cg it ng khi i tư ng h t th i gian s d ng. Hàm thi t l p có thu c tính public, cùng tên v i tên l p nhưng không có giá tr tr v . M t l p có ít nh t hai hàm thi t l p: hàm thi t l p sao chép ng m nh và hàm thi t l p do ngư i l p trình thi t l p(n u không mô t tư ng minh thì ó là hàm thi t l p ng m nh). Hàm hu b cũng có thu c tính public, không tham s , không giá tr tr v và có tên b t u b i ~ theo sau là tên c a l p. Bên trong ph m v l p( nh nghĩa c a các hàm thành ph n), các thành ph n c a l p ư c g i theo tên. Trư ng h p có m t i tư ng toàn c c cùng tên, mu n xác nh i tư ng y ph i s d ng toán t “::”. L p có th ch a các thành ph n d li u là các i tư ng c a l p khác. Các i tư ng này ph i ư c kh i t o trư c i tư ng tương ng c a l p bao. M i i tư ng có m t con tr ch n b n thân nó, ta g i ó là con tr this. Con tr này có th ư c s d ng tư ng minh ho c ng m nh tham xác nh các thành ph n bên trong i tư ng. Thông thư ng ngư i ta s d ng this dư i d ng ng m nh. Hàm b n c a m t l p là hàm không thu c l p nhưng có quy n truy nh p t i các thành ph n private c a l p. Trang 14
  • 15. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Khai báo b n b có th khai báo b t kỳ ch nào trong khai báo l p. B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...) Các l i thư ng g p Quên d u “;” cu i khai báo l p Kh i t o các thành ph n giá tr trong khai báo l p nh nghĩa ch ng m t hàm thành ph n b ng m t hàm không thu c l p Truy nh p n các thành ph n riêng c a l p t bên ngoài ph m vi l p Khai báo giá tr tr v cho hàm thi t l p và hàm hu b Khai báo hàm hu b có tham s , nh nghĩa ch ng hàm hu b G i tư ng minh hàm thi t l p và hàm hu b G i các thàm thành ph n bên trong hàm thi t l p M t s thói quen l p trình t t Nhóm t t c c các thành ph n có cùng thu c tính truy nh p m t nơi trương khái báo l p, nh v y m i t khoá mô t truy nh p ch ư c xác nh m t l n. Khai báo l p vì v y d c hơn. Theo kinh nghi m, các thành ph n private trư c tiên r i n các thành ph n protectech, cu i cùng là t khoá public. nh nghĩa t t c các hàm thành ph n bên ngoài khai báo l p. i u này nh m ph n bi t gi a hai ph n giao di n và ph n cài t l p. S d ng các ti n x lý #ifndef, #define, #endif cho các t p tin tiêu ch xu t hi n m t l n bên trong chương trinhg ngu n. Ph i nh nghĩa các hàm thi t l p m b o r ng các i tư ng u ư c kh i t o n i dung m t cách úng n. C/ BÀI T P M U Ví d 1: nh nghĩa m t l p mô t và x lý các i m trên màn hình ho . V i tên l p là point L i gi i + Các thu c tính c a l p int x;// hoành (c t) int y;// tung ( hàng) int m;// màu + Các phương th c Nh p d li u m t i m Hi n th m t i m nm t i m L p i m ư c xây d ng như sau: class point { private: int x,y,m; public: void nhapsl(); void hien(); void an() { putpixcel(x,y,getbkcolor()); } void point::nhap() { cout<<”n Nh p hoành (c t) và tung (hàng) c i m:”; cin>>x>>y; cout<<” Nh p màu c a i m:”;cin>>m; } void point::hien() Trang 15
  • 16. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. { int mau_ht; mau_ht=getcolor(); putpixcel(x,y,m); setcolor(mau_ht); } Nh n xét: + Trong c ba phương th c( dù vi t trong hay vi t ngoài nh nghĩa l p) u ư c truy nh p n các thu c tính x,y và m c a l p. + Các phương th c vi t bên trong nh nghĩa l p (như phương th c an()) ư c vi t như m t hàm bình thư ng. +Khi xây d ng các phương th c bên ngoài l p, c n dùng thêm tên l p và toán t ph m vi :: t ngay trư c tên phương th c quy nh rõ ây là phương th c c a l p nào. Ví d 2: Chúng ta xây d ng ki u c u trúc Time v i ba thành viên s nguyên: Hour, Minute và second. Chương trình nh nghĩa m t c u trúc Time g i là DinnerTime. Chương trình in th i gian dư i d ng gi quân i và d ng chu n. CT2_2.CPP #include <iostream.h> class Time { public: Time(); //Constructor void SetTime(int, int, int); //Thiet lap Hour, Minute va Second void PrintMilitary(); //In thoi gian duoi dang gio quan doi void PrintStandard(); //In thoi gian duoi dang chuan private: int Hour; // 0 - 23 int Minute; // 0 - 59 int Second; // 0 - 59 }; //Constructor khoi tao moi thanh vien du lieu voi gia tri zero //Bao dam tat ca cac doi tuong bat dau o trang thai thich hop Time::Time() { Hour = Minute = Second = 0; } //Thiet lap mot gia tri Time moi su dung gio quan doi //Thuc hien viec kiem tra tinh hop le tren cac gia tri du lieu //Thiet lap ca gia tri khong hop le thanh zero void Time::SetTime(int H, int M, int S) { Hour = (H >= 0 && H < 24) ? H : 0; Minute = (M >= 0 && M < 60) ? M : 0; Second = (S >= 0 && S < 60) ? S : 0; } //In thoi gian duoi dang gio quan doi void Time::PrintMilitary() { cout << (Hour < 10 ? "0" : "") << Hour << ":" Trang 16
  • 17. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second; } //In thoi gian duoi dang chuan void Time::PrintStandard() { cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second << (Hour < 12 ? " AM" : " PM"); } int main() { Time T; cout << "The initial military time is "; T.PrintMilitary(); cout << endl << "The initial standard time is "; T.PrintStandard(); T.SetTime(13, 27, 6); cout << endl << endl << "Military time after SetTime is "; T.PrintMilitary(); cout << endl << "Standard time after SetTime is "; T.PrintStandard(); T.SetTime(99, 99, 99); //Thu thiet lap gia tri khong hop le cout << endl << endl << "After attempting invalid settings:" << endl << "Military time: "; T.PrintMilitary(); cout << endl << "Standard time: "; T.PrintStandard(); cout << endl; return 0; } k t qu Trang 17
  • 18. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 3 Nh p m t ngày tháng năm t bàn phím sau ó in ra màn hình. L i gi i CT2_3.CPP #include <iostream.h> #include <conio.h> #define FALSE 0 #define TRUE !FALSE char* Thang[]={"","gieng","hai","ba","bon","nam","sau","bay","tam", "chin","muoi","muoi mot","chap"}; int NgayThang[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; class CDate { private: int mNgay,mThang,mNam; int laNamNhuan(int); public: void nhap(); int hopLe(); void in(); }; void CDate::nhap() { cout<<endl<<"Ngay: ";cin>>mNgay; cout<<endl<<"Thang: "; cin>>mThang; cout<<endl<<"Nam: ";cin>>mNam; } int CDate::hopLe() { if ((mThang<1)||(mThang>12)) return FALSE; else { if ((mNgay>=1)&&(mNgay<=NgayThang[mThang])) return TRUE; else if ((mNgay==29)&&laNamNhuan(mNgay)) return TRUE; else return FALSE; } } int CDate::laNamNhuan(int nam) { if (((nam%400)==0)||(((nam%4)==0)&&((nam%100)!=0))) return TRUE; else return FALSE; } void CDate::in() { cout<<endl<<"Ban da nhap vao ngay "<<mNgay; cout<<" thang "<<Thang[mThang]; cout<<" nam "<<mNam; } void main() { CDate ngay; ngay.nhap(); if (ngay.hopLe()) ngay.in(); else Trang 18
  • 19. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. cout<<"BAN NHAP NGAY KHONG HOP LE"; getch(); } Ví d 4 Ch ra các cách khai báo i tư ng có th cho các l p i tư ng dư i ây: class A { }; class B { B(int, int); public: B(int=0); }; class C { C(C&); public: C(); }; class D { public: D(D&); }; L i gi i V l pA Cách 1: S d ng hàm thi t l p ng m nh A a; ho c A a(); Cách 2: S d ng hàm thi t l p sao chép m c nh. Gi s a là m t i tư ng c a l p A ã ư c khai báo trư c. Ta có th khai báo i tư ng a1 như sau: A a1(a); ho c A a1=a; Nh n xét: Khi trong l p không có m t khai báo hàm thi t l p nào thì trình biên d ch t ng t o ra m t hàm thi t l p m c nh cho l p ó. Do v y ta có th s d ng khai báo i tư ng theo cách 1 cho l p A. Hai chách vi t khai báo A a1(a); và A a1=a; là hoàn toàn gi ng nhau, chúng u s d ng hàm thi t l p sao chép kh i t o i tư ng. V l pB Cách 1: S d ng hàm thi t l p B(int). Ví d : B b(5); Cách 2: S d ng hàm thi t l p B(int) v i tham s ng m nh là 0. B b; tương ương v i B b(0); Cách 3: S d ng hàm thi t l p sao chép tương t như l p A. B b1=b; Nh n xét Chúng ta ch có th khai báo i tư ng theo các hàm thi t l p có thu c tính quy n truy nh p là public Trang 19
  • 20. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Trong hàm thi t l p cũng có th s d ng tham s ng m nh gi ng như các hàm thành ph n khác. V l p C: Ch có th khai báo i tư ng theo hàm thi t l p C() b i vì hàm thi t l p sao chép ã ư c ngư i s d ng nh nghĩa và t quy n truy xu t là private. Do v y không th dùng hàm thi t l p sao chép. Ví d : C c; V l p D: Không th khai báo i tư ng cho l p D b i vì trong l p này ch có hàm thi t l p sao chép. Hàm thi t l p chép mu n s d ng ư c thì ph i có m t i tư ng c a l p D. Do v y mu n khai báo ư c m t i tư ng thu c l p D thì trong l p D c n có m t hàm thi t l p khác sa chép. Ví d 5 Có bao nhiêu l n hàm thi t l p sao chép ư c g i trong o n mã chương trình sau: Widget f(Widget u) { Widget v(u); Widget w=v; return w; } void main() { Widget x; Widget y=f(f(x)); } L i gi i: Hàm thi t l p sao chép ư c g i 7 l n trong o n mã chương trình này. M i l n g i hàm f òi h i 3 l n g i n hàm thi t l p sao chép: khi tham sô truy n vào b ng giá tr u, khi v và w ư c kh i t o. L nh g i th b y là kh i t o y. Ví d 6 Cho bi t k t qu in ra màn hình c a chương trình sau: L i gi i CT 2_6.CPP #include <iostream.h> #include <conio.h> 3. class A { static int count; public: A() { count++;} ~A() { count--;} static void printNum() { cout<<” Gia tri cua count la:”<<count<<endl; } }; int A::count=0; void main() { clrscr(); A::printNum(); A a1; a1.printNum(); A *pa=new A; a1.printNum(); Trang 20
  • 21. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. delete pa; a1.printNum(); A a2=a1; a2.printNum(); getch(); } 4. L i gi i K t q in ra màn hình: Gia tri cua count la 0 Gia tri cua count la 1 Gia tri cua count la 2 Gia tri cua count la 1 Gia tri cua count la 1 Trong l p A, thu c tính count và hàm thành ph n printNum là các thành ph n tĩnh ư c chia s b i m i i tư ng c a A. Ban u thu c tính count ư c khai báo kh i t o là 0( dòng int A::count=0), do v y dòng u tiên c a chương trình chính ư c g i n phương th c printNum s ưa ra màn hình giá tr c a count là 0. Ti p theo ta t o m t i tư ng a1 s d ng hàm thi t l p d ng A(). Hàm này làm tăng count lên 1. Do v y, dòng g i phương th c printNum ti p theo s ưa ra màn hình giá tr c a count là 1. Tương t i v i l nh new ta cũng t o ra m t i tư ng m i và lúc này giá tr c a count là 2. Sau khi s d ng l nh new t o i tư ng, chương trình s d ng delete xoá i tư ng ó kh i b nh . Lúc này hàm hu b ư c g i và count gi m xu ng 1. i tư ng a2 ư c khai báo s d ng hàm thi t l p sao chép m c nh, mà hàm này không làm thay i giá tr count. Do v y, count v n gi giá tr 1. Ví d 6 Tim ra ch sai v quy n truy xu t trong o n chương trình sau: class A { int pri; public: int bub; friend void funcA(A); firend class B; }; class B { void func(A a) { cout<<a.pri; cout<<a.pub; } }; class C { void func(A a) { cout<<a.pri; cout<<a.pub; Trang 21
  • 22. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. } }; void funcA(A a) { cout<<a.pri; cout<<a.pub; } void funcB(A a) { cout<<a.pri; cout<<a.pub; } L i gi i Truy xu t n thu c tính pri c a i tư ng a trong hàm funcB và trong hàm thành ph n func c a l p C là không th ư c. T t c các truy xu t n thu c tính pub u ư c b i vì ây là thu c tính public. Trong hàm funcA, ta có th truy nh p ư c thu c tính pri b i vì hàm này ã ư c khai báo là b n bè c a l p A. Tương t , t t c các hàm thành ph n c a l p B cũng u có th truy xu t t i thu c tính pri c a l p A b i vì l p B ã ư c coi là b n bè c a l p A. Ví d 7 qu n lý i m thi vào trư ng HSPKTHY c a các thí sinh, ta xây d ng l p ThiSinh mô t các thí sinh bao g m các thu c tính và phương th c sau: - Tên thí sinh - i m c a ba môn thi Toán, Lý, Hoá - Nh p thông tin c a các thí sinh g m tên và i m c a ba môn thi Toán, Lý, Hoá - In thông tin tên, i m và t ng i m thi 3 môn - Tính t ng i m thi c a thí sinh Trên cơ s l p ã xây d ng ư c, vi t chương trình làm các công vi c sau. - Nh p danh sách k t qu thi c a các thí sinh vào t bàn phím - ưa ra màn hình danh sách thí sinh trung tuy n( i m chu n vào trư ng là 18) L i gi i CT2_7.CPP #include <iostream.h> #include <stdio.h> 5. #include <conio.h> class ThiSinh { // Các thu c tính char ten[25];// Tên c a thí sinh khôngdài quá 24 ký t int toan, ly, hoa;// i m ba môn toán, lý, hoá public: // Các phương th c void nhapdl();//Nh p d li u cho thí sinh void inkq();// In k t qu thi c a thí sinh int tong();// Tính t ng i m c a thí sinh }; void ThiSinh::nhapdl() { cout<<”Nhap ten:”;fflush(stdin);gets(ten); cout<<”Nhap diem toan:”;cin>>toan; cout<<”Nhap diem ly:”;cin>>ly; cout<<”Nhap diem hoa:”;cin>>hoa; } Trang 22
  • 23. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. void ThiSinh::inkq() { // K t qu thi c a thí sinh ư c in trên m t dòng theo nh d ng // Ten Toan Ly Hoa Tong printf(“%-25s%6d%6d%6%6dn”,ten,toan,ly,hoa,tong()); } int ThiSinh::tong() { return (toan+ly+hoa); } void main() { // Chương trình chính th c hi n nh p danh sách vào s lư ng thí // sinh c n nh p clrscr(); int n; cout<<”Cho so thi sinh:”;cin>>n; // T o n i tư ng thí sinh cho n thí sinh c n nh p d li u ThiSinh *dsts=new ThiSinh[n]; // Nh p d li u cho t ng thí sinh for(int i=0;i<n;++i) { cout<<” Nhap du lieu cho thi sinh thu:”<<i+1<<endl; // G i phương th c nh p d li u c a thí sinh th i trong m ng dsts[i].nhapdl(); } // In danh sách các thí sinh truýng tuy n cout<<”Danh sach nhung nguoi trung truyen n”; printf(“%-25s%6s%6s%s%6sn”,”Ten”,”Toan”,”Ly”,”Hoa”,”Tong”); for(i=0;i<n;++i) if(dsts[i].tong()>=18) dsts[i].inkq(); // Xoá các i tư ng ã t o và k t thúc chương trình delete dsts; getch(); } 6. Ví d 8: Hàm thi t l p v i các tham s m c nh CT2_8.CPP #include <iostream.H> class Time 7. { public: Time(int = 0, int = 0, int = 0); //Constructor mac dinh void SetTime(int, int, int); void PrintMilitary(); void PrintStandard(); private: int Hour; int Minute; int Second; }; //Ham constructor de khoi dong du lieu private //Cac gia tri mac dinh la 0 Time::Time(int Hr, int Min, int Sec) { Trang 23
  • 24. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. SetTime(Hr, Min, Sec); } //Thiet lap cac gia tri cua Hour, Minute va Second //Gia tri khong hop le duoc thiet lap la 0 void Time::SetTime(int H, int M, int S) { Hour = (H >= 0 && H < 24) ? H : 0; Minute = (M >= 0 && M < 60) ? M : 0; Second = (S >= 0 && S < 60) ? S : 0; } //Hien thi thoi gian theo dang gio quan doi: HH:MM:SS void Time::PrintMilitary() { cout << (Hour < 10 ? "0" : "") << Hour << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second; } //Hien thi thoi gian theo dang chuan: HH:MM:SS AM (hoac PM) void Time::PrintStandard() { cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second << (Hour < 12 ? " AM" : " PM"); } int main() { Time T1,T2(2),T3(21,34),T4(12,25,42),T5(27,74,99); cout << "Constructed with:" << endl << "all arguments defaulted:" << endl << " "; T1.PrintMilitary(); cout << endl << " "; T1.PrintStandard(); cout << endl << "Hour specified; Minute and Second defaulted:" << endl << " "; T2.PrintMilitary(); cout << endl << " "; T2.PrintStandard(); cout << endl << "Hour and Minute specified; Second defaulted:" << endl << " "; T3.PrintMilitary(); cout << endl << " "; T3.PrintStandard(); cout << endl << "Hour, Minute, and Second specified:" << endl << " "; T4.PrintMilitary(); cout << endl << " "; T4.PrintStandard(); cout << endl << "all invalid values specified:" << endl << " "; T5.PrintMilitary(); cout << endl << " "; T5.PrintStandard(); cout << endl; return 0; } 8. Trang 24
  • 25. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Chương trình ví d trên kh i t o năm i tư ng c a l p Time ( dòng 52). i tư ng T1 v i ba tham s l y giá tr m c nh, i tư ng T2 v i m t tham s ư c mô t , i tư ng T3 v i hai tham s ư c mô t , i tư ng T4 v i ba tham s ư c mô t và i tư ng T5 v i các tham s có giá tr không h p l . K t qu Ví d 9:L p có hàm hu b CT 2_9.CPP #include <iostream.h> class Simple 9. { private: int *X; public: Simple(); //Constructor ~Simple(); //Destructor void SetValue(int V); int GetValue(); }; Simple::Simple() { X = new int; //Cap phat vung nho cho X } Simple::~Simple() { delete X; //Giai phong vung nho khi doi tuong bi huy bo } Trang 25
  • 26. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. void Simple::SetValue(int V) { *X = V; } int Simple::GetValue() { return *X; } int main() { Simple S; int X; cout<<"Enter a number:"; cin>>X; S.SetValue(X); cout<<"The value of this number:"<<S.GetValue(); return 0; } 10. k t qu Ví d 10: Chương trình sau minh h a khai báo và s d ng hàm friend. CT2_10.CPP #include <iostream.H> class Count { friend void SetX(Count &, int); //Khai bao friend public: Count()//Constructor { X = 0; } void Print() const //Xuat { cout << X << endl; } private: int X; }; //Co the thay doi du lieu private cua lop Count vi //SetX() khai bao la mot ham friend cua lop Count void SetX(Count &C, int Val) { Trang 26
  • 27. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. C.X = Val; //Hop le: SetX() la mot friend cua lop Count } int main() { Count Object; cout << "Object.X after instantiation: "; Object.Print(); cout << "Object.X after call to SetX friend function: "; SetX(Object, 8); //Thiet lap X voi mot friend Object.Print(); return 0; } k t qu D/ BÀI T P T GI I Câu h i tr c nghi m Câu 1: Ch có m t kh ng nh trong nh ng câu sau là sai. Câu nào? a./ M i th hi n c a m t l p có s h u riêng các thu c tính thông thư ng b./ Các th hi n c a m t l p cùng chia s các thu c tính tĩnh c a l p ó c./ M i th hi n c a m t l p có các nh nghĩa riêng cho các phương th c c a nó. d./ M i i tư ng là m t th hi n c a m t l p Câu 2: Các t khoá public và private dùng a./ Cho phép ngư i thi t k l p che d u m t ph n thi hành c a l p trư c ngư i s d ng l p. b./ Trình biên d ch t i ưu hoá chương trình c./ m b o na toàn c a l p khi thi t k d./ H n ch vi c sao chép l p Câu 3 Ch ra l i sai v i các khai báo cho l p A class A { A(int i); }; A a1;//(1) A b2(5) //(2) a./ Ch dòng 1 l i b./ Ch dòng 2 l i c./ C hai dòng l i d./ Không dòng nào l i Câu 4: Cho bi t giá tr c a n v i các dòng l nh sau: Trang 27
  • 28. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. class A { public: static int i; }; int A::i=5; A a1; a1.i++; A a2; int n=a2.i+1; a./ n=5; b./ n=6; c./ n=7; d./ Không câu nào úng Câu 5: Ch ra l i v i các khai báo cho l p A class A { public: A(int i); }; A a1(5); A a3;// (1) A a2=a1;// (2) a./ Ch dòng 1 l i b./ Ch dòng 2 l i c./ C 2 dòng l i d./ Không dòng nào l i Bài tâp Bài 2.1: Xây d ng l p Stack, d li u bao g m nh stack và vùng nh c a stack. Các thao tác g m: Kh i ng stack. Ki m tra stack có r ng không? Ki m tra stack có y không? Push và pop. Bài 2.2: Xây d ng l p hình tr Cylinder, d li u bao g m bán kính và chi u cao c a hình tr . Các thao tác g m hàm tính di n tích toàn ph n và th tích c a hình tr ó. Bài 2.3: Hãy xây d ng m t l p Point cho các i m trong không gian ba chi u (x,y,z). L p ch a m t constructor m c nh, m t hàm Negate() bi n i i m thành i lư ng có d u âm, m t hàm Norm() tr v kho ng cách t g c và m t hàm Print(). Bài 2.4: Xây d ng m t l p Matrix cho các ma tr n bao g m m t constructor m c nh, hàm xu t ma tr n, nh p ma tr n t bàn phím, c ng hai ma tr n, tr hai ma tr n và nhân hai ma tr n. Trang 28
  • 29. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 2.5: Xây d ng m t l p Matrix cho các ma tr n vuông bao g m m t constructor m c nh, hàm xu t ma tr n, tính nh th c và tính ma tr n ngh ch o. Bài 2.6: Xây d ng l p Person qu n lý h tên, năm sinh, i m chín môn h c c a t t c các h c viên c a l p h c. Cho bi t bao nhiêu h c viên trong l p ư c phép làm lu n văn t t nghi p, bao nhiêu h c viên thi t t nghi p, bao nhiêu ngư i ph i thi l i và tên môn thi l i. Tiêu chu n xét: Làm lu n văn ph i có i m trung bình l n hơn 7 trong ó không có môn nào dư i 5. Thi t t nghi p khi i m trung bình không l n hơn 7 và i m các môn không dư i 5. Thi l i có môn dư i 5. Bài 2.7: Xây d ng m t l p String. M i i tư ng c a l p String s i di n m t chu i ký t . Các thành viên d li u là chi u dài chu i và chu i ký t th c. Ngoài constructor và destructor còn có các phương th c như t o m t chu i v i chi u dài cho trư c, t o m t chu i t m t chu i ã có. Bài 2.8: Xây d ng m t l p Vector lưu tr vector g m các s th c. Các thành viên d li u g m: Kích thư c vector. M t m ng ng ch a các thành ph n c a vector. Ngoài constructor và destructor, còn có các phương th c tính tích vô hư ng c a hai vector, tính chu n c a vector (theo chu n b t kỳ nào ó). Bài 2.9: Xây d ng l p Employee g m h tên và ch ng minh nhân dân. Ngoài constructor còn có phương th c nh p, xu t h tên và ch ng minh nhân dân ra màn hình Bài 2.10: M t l p i tư ng sách trong h th ng qu n lí thư vi n có các thu c tính - Tên sách - T ng s quy n sách - S quy n sách ã cho mư n Xây d ng l p i tư ng trên v i các phương th như sau - Phương th nh p d li u cho i tư ng t bàn phím. Các thông tin c n nh p là tên sách, t ng s sách, s ã cho mư n. - Phương th c in thông tin i tư ng ra màn hình bao g m tên, t ng s và s ã cho mư n. - Phương th c tính s sách còn l i trong thư vi n(t ng s - s mư n) Trên cơ s l p xây d ng ư c, vi t chương trình chính th c hi n các công vi c. - Nh p danh sách các quy n sách v i s lư ng sách c n nh p ư c cho vào t bàn phím. - ưa ra màn hình thông tin v các quy n sách hi n có trong thư vi n(s sách còn l i ph i l n hơn 0) Trang 29
  • 30. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 2.11: Vi t m t l p bi u di n hình ch nh t có các thu c tính là dài hai c nh( chi u r ng và chi u dài) và có các phương th c sau. - Nh p d li u hai c nh cho hình ch nh t - Tính chu vi và di n tích hình ch nh t - In thông tin c a hình ch nh t ra màn hình(bao g m dài hai c nh, chu vi và di n tích) Trên cơ s l p xây d ng ư c vi t chương trình cho phép ngư i s d ng nh p d li u c a m t hình ch nh t r i in thông tin v nó ra màn hình. Bài 2.12: Xây d ng m t l p Date mô t thông tin v ngày, tháng, năm(month, day, year). L p Date có các hàm thành ph n: - Hàm thi t l p v i ba tham s có giá tr m c nh( ó là ngày h th ng) - Nh p d li u ngày, tháng và năm - Hàm in thông tin v ngày tháng năm dư i d ng mm-dd-yy - Hàm nextDay() tăng Date t ng ngày m t Trên cơ s l p Date v a x y d ng vi t chương trình cho bi t kho ng cách ngày gi a hai m c th i gian v i ngày b t u ư c nh p vào t bàn phím cho tơi ngày hi n th i. Bài 2.13: Xây d ng l p Stack và l p Queue mô t ho t ng c a ngăn x p và hàng i các sô nguyên. Bài 2.14: Xây d ng m t l p mô t các b ng thi u bóng á g i là BangThiDau. Gi thi t m i b ng có b n i và thi u chéo t ng c p. Có l ch các tr n u c a b ng. T o các phương th c nh p k t qu thi u và tính i m cho t ng i. Yêu c u vi c nh p k t q a thi u ph i theo th t th i gian. Thêm các phương th c hi n th thông tin thi u c a t ng i và c a c b ng. Vi t chương trình ki m nghi m l p xây d ng ư c. Bài 2.15: M r ng bài t p trên v i l p DoiBong mô t các i bóng thi u. Thông tin c a m i ôi bóng bao g m tên i bóng, danh sách c u th , và hu n luy n viên. L p bangThiDau s d ng các i tư ng c a l p DoiBong làm i bóng thi u c a b ng. Các b ng lúc này có th m thu c tính tên c a b ng thi u. S d ng các l p ã xây d ng trên vi t chương trình qu n lý thi u c a cúp bóng á th gi i có 32 i thi u ư c chia làm 8 b ng. T o thêm l p mô t l ch thi u cho các vòng ti p theo c a gi i. Yêu c u c a chương trình như sau: - Ban u ngư i s d ng nh p các thông tin v i bóng, sau ó phân b ng và l ch thi u toàn gi i. - K t qu các tr n thi u ư c vào theo th t l ch thi u - Chương trình t ng ch n các i vào vòng ti p theo cho t i tr n trung k t. - T i m i th i i m c a gi i chương trình có th ưa ra các thông tin v gi i. Bài 2.16: M t quy n s i n tho i ch a các th có thông tin v tên, a ch và s i n tho i. Thi t k các l p tương ng v i các th thông tin và s i n tho i. Vi t chương trình cho phép qu n lý s i n tho i d a trên các l p xây d ng ư c. Trang 30
  • 31. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. §Þnh nghÜa chång to¸n tö trªn líp M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C Cách nh nghĩa các phép toán cho ki u d li u l p và c u trúc Các toán t chuy n ki u áp d ng cho ki u d li u l p A/ NH C L I LÝ THUY T Toán t ư c nh nghĩa ch ng b ng cách nh nghĩa m t hàm toán t . Tên hàm toán t bao g m t khoá operator theo sau là ký hi u c a toán t ư c nh nghĩa ch ng. H u h t các toán t c a C++ u có th nh nghĩa ch ng. Không th t o ra các ký hi u phép toán m i. Ph i m b o các c tính nguyên thu c a toán t ư c nh nghĩa ch ng, ch ng h n: ưu tiên, tr t t k t h p, sô ngôi. Không s d ng tham s có giá tr ng m nh nh nghĩa ch ng toán t . Các toán t (), [], ->, = yêu c u hàm toán t ph i là hàm thành ph n c a l p. Hàm toán t có th là hàm thành ph n hay là hàm b n c a l p Khi hàm toán t là hàm thành ph n, toán h ng bên trái luôn là i thu c l p. N u toán h ng bên trái là i tư ng c a l p khác thì hàm toán t tương ng ph i là hàm b n. Chương trình d ch không t bi t cách chuy n ki u gi a ki u d li u chu n và ki u d li u t nh nghĩa. Vì v y ngư i l p trình c n ph i mô t tư ng minh các chuy n i này dư i d ng hàm thi t l p chuy n ki u hay hàm toán t chuy n ki u. M t hàm toán t chuy n ki u th c hi n chuy n i t m t i tư ng thư c l p sang i tư ng thu c l p khác ho c m t i tư ng có ki u ư c nh nghĩa trư c. Hàm thi t l p chuy n ki u có m t tham s và th c hi n chuy n i t m t giá tr sang i tư ng ki u l p. Toán t gán là toán t hay ư c nh nhgiã ch ng nh t, c bi t khi l p có các thành ph n d li u ng. nh nghĩa ch ng toán t tăng, gi m m t ngôi, ph i phân bi t hai hàm toán t tư ng ng cho d ng ti n t và d ng h u t . B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...) Các l i thư ng g p T o m t toán t Thay i nh nghĩa c a các toán t trên các ki u ư c nh nghĩa trư c Cho r ng vi c nh nghĩa ch ng m t toán t s t ng kéo theo nh nghĩa ch ng c a các toán t liên quan. Quên nh nghĩa ch ng toán t gán và hàm thi t l p sao chép cho các l p có các thành ph n d li u ng. M t s thói quen l p trình t t S d ng toán t nh nghĩa ch ng khi i u ó làm cho chương trình trong sáng hơn. Tránh l m d ng nh nghĩa ch ng toán t vì i u ó ãn n khó ki m soát chương trình. Chú ý n các tính ch t nguyên thu c a toán t ư c nh nghĩa ch ng. Hàm thi t l p, toán t gán, hàm thi t l p sao chép c a m t l p thư ng i cùng nhau. Trang 31
  • 32. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. C/ BÀI T P M U Ví d 1: M t l p phân s có toán t c ng(+) ư c nh nghĩa như sau: class PS { public: PS(int ts=0, int ms=1); PS operator+(PS); }; Trong các dòng l nh sau ây dòng nào sai? PS a,b,c; a=b+c;//(1) a=b+3;//(2) a=3+b;//(3) L i gi i Trong ba dòng l nh thì hai dòng u là úng b i vì lúc ó ta có: (1) a=b.operator+(c) là toán t ã ư c nh nghĩa trong l p phân s (2) a=b.operator+(3) v i 3 s t ng chuy n ki u thành phân s Dòng l nh (3) sai vì ta không có toán t c ng m t s nguyên v i m t phân s . có th th c hi n ư c t t c ba dòng l nh như trên thì toán t c ng trong l p PS ph i ư c nh nghĩa là m t hàm b n. class PS { public: PS(int ts=0, int ms=1); friend PS operator+(PS); }; Khi ó các l i g i s tương ng v i toán t như sau: (1) a=operator+(b,c) (2) a=operator+(b,3) (3) a=operator+(3,b) Ví d 2:Chúng ta xây d ng l p s ph c v i tên l p là Complex và a năng hóa toán t + trên l p này. CT3_1.CPP #include <iostream.h> class Complex 11. { private: double Real,Imaginary; public: Complex(double R=0.0,double I=0.0);//Constructor mac dinh void Print();//Hien thi so phuc Complex operator + (Complex Z);//Phep cong hai so phuc Complex operator + (double R);//Phep cong mot so phuc voi mot so thuc }; Complex::Complex(double R,double I) { Real = R; Imaginary = I; } Trang 32
  • 33. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. void Complex::Print() { cout<<'('<<Real<<','<<Imaginary<<')'; } Complex Complex::operator + (Complex Z) { Complex Tmp; Tmp.Real = Real + Z.Real; Tmp.Imaginary = Imaginary + Z.Imaginary; return Tmp; } Complex Complex::operator + (double R) { Complex Tmp; Tmp.Real = Real + R; Tmp.Imaginary = Imaginary; return Tmp; } int main() { Complex X,Y(4.3,8.2),Z(3.3,1.1); cout<<"X: "; X.Print(); cout<<endl<<"Y: "; Y.Print(); cout<<endl<<"Z: "; Z.Print(); X = Y + Z; cout<<endl<<endl<<"X = Y + Z:"<<endl; X.Print(); cout<<" = "; Y.Print(); cout<<" + "; Z.Print(); X = Y + 3.5; cout<<endl<<endl<<"X = Y + 3.5:"<<endl; X.Print(); cout<<" = "; Y.Print(); cout<<" + 3.5"; return 0; } 12. k t qu Trang 33
  • 34. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 3: Cho m t l p có toán t chuy n ki u như sau: class A { public: operator int (); }; Khi ó ta có th s d ng câu l nh nào trong nh ng câu l n sau: A a; int i=a;//(1) float f=a;//(2) L i gi i L nh (1) là úng b i vì ta ã có toán t ép ki u int nên chương trình t ng ép ki u v m t s nguyên. Còn l nh 2 sai b i vì ta không có toán t ép ki u float. Ví d 4 a năng hóa toán t [] truy c p n m t ph n t c a vector. CT3_4.CPP #include <iostream.h> class Vector 13. { private: int Size; int *Data; public: Vector(int S=2,int V=0); ~Vector(); void Print() const; int & operator [] (int I); }; Vector::Vector(int S,int V) { Size = S; Data=new int[Size]; for(int I=0;I<Size;++I) Data[I]=V; } Vector::~Vector() { delete []Data; } void Vector::Print() const { cout<<"Vector:("; Trang 34
  • 35. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. for(int I=0;I<Size-1;++I) cout<<Data[I]<<","; cout<<Data[Size-1]<<")"<<endl; } int & Vector::operator [](int I) { return Data[I]; } int main() { Vector V(5,1); V.Print(); for(int I=0;I<5;++I) V[I]*=(I+1); V.Print(); V[0]=10; V.Print(); return 0; } 14. k t qu Ví d 5: a năng hóa toán t () truy c p n m t ph n t c a vector. CT3_5.CPP //Chuong trinh 4.6 #include <iostream.h> 15. class Vector { private: int Size; int *Data; public: Vector(int S=2,int V=0); ~Vector(); void Print() const; int & operator () (int I); }; Vector::Vector(int S,int V) { Size = S; Data=new int[Size]; for(int I=0;I<Size;++I) Data[I]=V; } Vector::~Vector() { Trang 35
  • 36. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. delete []Data; } void Vector::Print() const { cout<<"Vector:("; for(int I=0;I<Size-1;++I) cout<<Data[I]<<","; cout<<Data[Size-1]<<")"<<endl; } int & Vector::operator ()(int I) { return Data[I]; } int main() { Vector V(5,1); V.Print(); for(int I=0;I<5;++I) V(I)*=(I+1); V.Print(); V(0)=10; V.Print(); return 0; } 16. k t qu Ví d 6: a năng hóa toán t () truy c p n ph n t c a ma tr n. CT3_6.CPP //Chuong trinh 4.7 #include <iostream.h> 17. class Matrix { private: int Rows,Cols; int **Data; public: Matrix(int R=2,int C=2,int V=0); ~Matrix(); void Print() const; int & operator () (int R,int C); }; Matrix::Matrix(int R,int C,int V) { int I,J; Rows=R; Cols=C; Trang 36
  • 37. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Data = new int *[Rows]; int *Temp=new int[Rows*Cols]; for(I=0;I<Rows;++I) { Data[I]=Temp; Temp+=Cols; } for(I=0;I<Rows;++I) for(J=0;J<Cols;++J) Data[I][J]=V; } Matrix::~Matrix() { delete [] Data[0]; delete [] Data; } void Matrix::Print() const { int I,J; for(I=0;I<Rows;++I) { for(J=0;J<Cols;++J) { cout.width(5);//Hien thi canh ler phai voi chieu dai 5 ky tu cout<<Data[I][J]; } cout<<endl; } } int & Matrix::operator () (int R,int C) { return Data[R][C]; } int main() { int I,J; Matrix M(2,3,1); cout<<"Matrix:"<<endl; M.Print(); for(I=0;I<2;++I) for(J=0;J<3;++J) M(I,J)*=(I+J+1); cout<<"Matrix:"<<endl; M.Print(); return 0; } 18. k t qu Trang 37
  • 38. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 7: a năng hóa toán t ++ và -- CT3_7.CPP #include <iostream.h> 19. class Point { private: int X,Y; public: Point(int A=0,int B=0); Point operator ++(); Point operator --(); void Print() const; }; Point::Point(int A,int B) { X = A; Y = B; } Point Point::operator++() { ++X; ++Y; return *this; } Point Point::operator--() { --X; --Y; return *this; } void Point::Print() const { cout<<"X="<<X<<",Y="<<Y<<endl; } int main() { Point P1(2,6),P2(5,8); cout<<"Point 1:"; P1.Print(); cout<<"Point 2:"; P2.Print(); ++P1; --P2; cout<<"Point 1:"; P1.Print(); Trang 38
  • 39. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. cout<<"Point 2:"; P2.Print(); return 0; } 20. K t qu Ví d 8: a năng hóa toán t d u ph y. CT3_8.CPP #include <iostream.h> 21. class Point { private: int X,Y; public: Point(int A=0,int B=0); Point operator +(Point P); Point operator ,(Point P); void Print() const; }; Point::Point(int A,int B) { X = A; Y = B; } Point Point::operator+(Point P) { Point Tmp; Tmp.X=X+P.X; Tmp.Y=Y+P.Y; return Tmp; } Point Point::operator,(Point P) { Point Tmp; Tmp.X=P.X; Tmp.Y=P.Y; cout<<P.X<<" "<<P.Y<<endl; return Tmp; } void Point::Print() const { cout<<"X="<<X<<",Y="<<Y<<endl; } Trang 39
  • 40. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. int main() { Point P1(2,6),P2(5,20),P3(1,1); cout<<"Point 1:"; P1.Print(); cout<<"Point 2:"; P2.Print(); cout<<"Point 3:"; P3.Print(); P1=(P1,P1+P2,P3); cout<<"Point 1:"; P1.Print(); return 0; } 22. k t qu Ví d 9: a năng hóa toán t ->. CT3_9.CPP #include <iostream.h> 23. class MyClass { public: int Data; MyClass * operator ->() { return this; } }; int main() { MyClass M; M->Data = 10; cout<<M.Data<<" "<<M->Data; return 0; } 24. k t qu Ví d 10: a năng hóa toán t gán. CT3_10.CPP Trang 40
  • 41. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. #include <iostream.h> #include <string.h> 25. class String { private: char *St; int Len; public: String(char *S); ~String(); char *GetStr(); String & operator=(String &Obj); }; String::String(char *S) { Len=strlen(S); St=new char[Len+1]; strcpy(St,S); } String::~String() { delete []St; } char * String::GetStr() { return St; } String & String::operator=(String &Obj) { if (Len< Obj.Len) { delete [] St; St=new char[Obj.Len+1]; } Len=Obj.Len; strcpy(St,Obj.St); return *this; } int main() { String S1("Hello"), S2("Chao"); cout<<"S1="<<S1.GetStr()<<endl; cout<<"S2="<<S2.GetStr()<<endl; S2=S1; cout<<"S1="<<S1.GetStr()<<endl; cout<<"S2="<<S2.GetStr()<<endl; return 0; } 26. k t qu Trang 41
  • 42. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 11: Chúng ta s xây d ng m t l p x lý vi c t o và thao tác trên các chu i (string). C++ không cài s n ki u d li u chu i. Nhưng C++ cho phép chúng ta thêm ki u chu i như m t l p thông qua cơ ch a năng hóa. CT3_11.CPP #include <iostream.h> #include <iomanip.h> 27. #include <string.h> #include <assert.h> class String { private: char *Ptr; //Con tro tro den diem bat dau cua chuoi int Length; //Chieu dai chuoi public: String(const char * = ""); //Constructor chuyen doi String(const String &); //Constructor sao chep ~String(); //Destructor const String &operator=(const String &); //Phep gan String &operator+=(const String &); int operator!() const; int operator==(const String &) const; int operator!=(const String &) const; int operator<(const String &) const; int operator>(const String &) const; int operator>=(const String &) const; int operator<=(const String &) const; char & operator[](int); //Tra ve ky tu tham chieu String &operator()(int, int); //Tra ve mot chuoi con int GetLength() const; friend ostream &operator<<(ostream &, const String &); friend istream &operator>>(istream &, String &); }; //Constructor sao chep: Chuyen doi char * thanh String String::String(const char *S) { cout << "Conversion constructor: " << S << endl; Length = strlen(S); Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, S); } String::String(const String &Copy) { cout << "Copy constructor: " << Copy.Ptr << endl; Trang 42
  • 43. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Length = Copy.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, Copy.Ptr); } //Destructor String::~String() { cout << "Destructor: " << Ptr << endl; delete [] Ptr; } const String &String::operator=(const String &Right) { cout << "operator= called" << endl; if (&Right != this) { delete [] Ptr; Length = Right.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, Right.Ptr); } else cout << "Attempted assignment of a String to itself" << endl; return *this; } String &String::operator+=(const String &Right) { char *TempPtr = Ptr; Length += Right.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, TempPtr); strcat(Ptr, Right.Ptr); delete [] TempPtr; return *this; } int String::operator!() const { return Length == 0; } int String::operator==(const String &Right) const { return strcmp(Ptr, Right.Ptr) == 0; } int String::operator!=(const String &Right) const { return strcmp(Ptr, Right.Ptr) != 0; } int String::operator<(const String &Right) const { return strcmp(Ptr, Right.Ptr) < 0; } int String::operator>(const String &Right) const Trang 43
  • 44. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. { return strcmp(Ptr, Right.Ptr) > 0; } int String::operator>=(const String &Right) const { return strcmp(Ptr, Right.Ptr) >= 0; } int String::operator<=(const String &Right) const { return strcmp(Ptr, Right.Ptr) <= 0; } char &String::operator[](int Subscript) { assert(Subscript >= 0 && Subscript < Length); return Ptr[Subscript]; } String &String::operator()(int Index, int SubLength) { assert(Index >= 0 && Index < Length && SubLength >= 0); String *SubPtr = new String; assert(SubPtr != 0); if ((SubLength == 0) || (Index + SubLength > Length)) SubPtr->Length = Length - Index + 1; else SubPtr->Length = SubLength + 1; delete SubPtr->Ptr; SubPtr->Ptr = new char[SubPtr->Length]; assert(SubPtr->Ptr != 0); strncpy(SubPtr->Ptr, &Ptr[Index], SubPtr->Length); SubPtr->Ptr[SubPtr->Length] = '0'; return *SubPtr; } int String::GetLength() const { return Length; } ostream &operator<<(ostream &Output, const String &S) { Output << S.Ptr; return Output; } istream &operator>>(istream &Input, String &S) { char Temp[100]; Input >> setw(100) >> Temp; S = Temp; return Input; } int main() { String S1("happy"), S2(" birthday"), S3; cout << "S1 is "" << S1 << ""; S2 is "" << S2 << ""; S3 is "" << S3 << '"' << endl << "The results of comparing S2 and S1:" Trang 44
  • 45. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. << endl << "S2 == S1 yields " << (S2 == S1) << endl << "S2 != S1 yields " << (S2 != S1) << endl << "S2 > S1 yields " << (S2 > S1) << endl << "S2 < S1 yields " << (S2 < S1) << endl << "S2 >= S1 yields " << (S2 >= S1) << endl << "S2 <= S1 yields " << (S2 <= S1) << endl; cout << "Testing !S3:" << endl; if (!S3) { cout << "S3 is empty; assigning S1 to S3;" << endl; S3 = S1; cout << "S3 is "" << S3 << """ << endl; } cout << "S1 += S2 yields S1 = "; S1 += S2; cout << S1 << endl; cout << "S1 += " to you" yields" << endl; S1 += " to you"; cout << "S1 = " << S1 << endl; cout << "The substring of S1 starting at" << endl << "location 0 for 14 characters, S1(0, 14), is: " << S1(0, 14) << endl; cout << "The substring of S1 starting at" << endl << "location 15, S1(15, 0), is: " << S1(15, 0) <<endl; // 0 is "to end of string" String *S4Ptr = new String(S1); cout << "*S4Ptr = " << *S4Ptr <<endl; cout << "assigning *S4Ptr to *S4Ptr" << endl; *S4Ptr = *S4Ptr; cout << "*S4Ptr = " << *S4Ptr << endl; delete S4Ptr; S1[0] = 'H'; S1[6] = 'B'; cout <<"S1 after S1[0] = 'H' and S1[6] = 'B' is: "<< S1 << endl; cout << "Attempt to assign 'd' to S1[30] yields:" << endl; S1[30] = 'd'; //Loi: Chi so vuot khoi mien!!! return 0; } 28. k t qu Trang 45
  • 46. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. D/ BÀI T P T GI I Câu h i tr c nghi m Câu 1: nh nghĩa nào úng cho toán t nh p(>>) c a m t l p T a) istream& operator>>(istream&); b) istream& operator>>(istream); c) friend istream& operator>>(istream&, T&); d) friend istream& operator>>(istream&, T); Trang 46
  • 47. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Câu 2 nh nghĩa nào phù h p nh t cho toán t l y thành ph n([]) c a l p m ng A a) int operator [] (int) b) int& operator [] (int) c) friend int operator [] (A&, int) d) friend int& operator [] (A&, int) Câu 3: Ch ra cách nh nghĩa toán t cho l p T b sai a) T operator-(T&) b) T operator-() c) T operator-() d) friend T opreator +(T&); e) T operator +(T&); Câu 4: Ch ra cách nh nghĩa toán t cho l p T bíai a) T& operator ++() b) T operator ++(); c) T& operator++(int); d) T&operator++(float) Câu 5: Cho l p A class A { public: operator int (); }; A a; int i=a;(1) float f=a;(2) Ch ra dòng nào có l i a) Ch dòng 1 l i b) Ch dòng 2 l i c) C hai dòng u l i d) Không dòng nào l i Bài tâp Bài 1: T o ki u d li u Date bi u di n ngày, tháng, năm. Cài t các toán t tính m t ngày trư c ho c sau m t ngày xác nh nào ó, tính kho ng cách thao ngày gi a hai ngày xác nh, tính th trong tu n c a ngày. Các toán t vào ra cho ngày. Bài 2: lưu tr m t ma tr n i x ng thì không c n ô nh cho t t c các ph n t c a nó. Xây d ng l p bi u di n ma tr n i x ng có các toán t truy nh p t ng ph n t c a ma tr n. Ch s d ng lư ng b nh c n thi t lưu ma tr n i x ng Bài 3 Xây d ng l p bi u di n các a th c v i các toán t c ng, tr , nhân, chia và o d u. nh nghĩa toán t xu t k t xu t. Bài 4: Xây d ng m t l p map cho phép bi u di n m t ánh x t m t chu i kí t thành m t giá tr s nguyên. nh nghĩa toán t [] cho l p có th s d ng ánh x theo cách như [“abc”]->5 Trang 47
  • 48. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 5 Xây d ng m t l p bi u di n các vector n chi u v i các toán t c ng, tr , tích có hư ng hai vector và tích vô hư ng m t vector v i m t s th c. nh nghĩa toán t cho phép truy nh p các thành ph n c a vector. Trang 48