Saturday, May 2, 2015

1. Class & Object



Hình ảnh trên mô tả cho khái niệm Class và Object. 

Class là một bản mô tả chi tiết về các đặc điểm cũng như cách thức hoạt động của một sự vật hay hiện tượng nào đó. 
+ Object là một sự vật hay hiện tượng cụ thể, có đặc điểm và các thức hoạt động được miêu tả trong Class.

Như trên hình, Class là một bản thiết kế từ đó đưa vào nhà máy để sản xuất hàng loạt các xe có đặc điểm và cách lái xe giống nhau.

2. Attributes & Methods
Như đã nêu trên, Class mô tả các đặc điểm và cách thức hoạt động, người ta gọi đó là Attributes & Methods (hay còn gọi là Behaviors)
+ Attributes (thuộc tính hay data member) là các biến được khai báo để lưu trữ các thông số về đặc điểm của xe
+ Methods (phương thức hay function member) là các functions được khai báo để tương tác với Attributes nhằm đưa ra các hành vi phù hợp.

Ex:
car.h
 #ifndef CAR_H  
 #define CAR_H  
 #define CAR_MAX_SPEED 250  
 class Car  
 {  
 public:  
   Car(); 
   virtual ~Car(); 
 private:  
   float fuel;  
   int speed;  
 public:  
   void reFuel(float fuel){  
     this->fuel = fuel;  
   }  
   float getFuel(){  
     return fuel;  
   }  
   void setSpeed(int speed);  
   int getSpeed();  
   void drive();  
 };  
 #endif // CAR_H  

car.cpp
 #include "car.h"  
 #include <stdio.h>  
 #include <string.h>  
 Car::Car()  
 {  
   fuel = 0;  
   speed = 0;  
 } 
 Car::~Car()
 {
   fuel = 0;
   speed = 0;
 } 
 void Car::setSpeed(int speed){  
   this->speed = speed;  
 }  
 int Car::getSpeed(){  
   return speed;  
 }  
 void Car::drive(){  
   printf("fuel: %f \n", fuel);  
   if(speed > CAR_MAX_SPEED){  
     printf("speed: %d, Fast & Furious \n", speed);  
   }else{  
     printf("speed: %d, It is ok \n", speed);  
   }  
 }  

main.cpp
 #include <iostream>  
 #include "car.h"  
 #include <stdio.h>  
 int main(int argc, char **argv){  
   Car car1;  
   Car car2; 
 
   car1.reFuel(100);  
   car2.reFuel(150);  
   car1.setSpeed(150);  
   car2.setSpeed(270);
  
   printf("car1 drive \n");  
   car1.drive();  

   printf("car2 drive \n");  
   car2.drive(); 
 
   return 1;  
 }  

Compile & Execute
 $ g++ car.h car.cpp main.cpp   
 $ ./a.out   
 car1 drive   
 fuel: 100.000000   
 speed: 150, It is ok   

 car2 drive   
 fuel: 150.000000   
 speed: 270, Fast & Furious   

3. New & Delete
Ở ví dụ trên ta khai báo object thường
   Car car1;  
   Car car2;  

Khi khai báo object dạng con trỏ thì cần thêm hai toán tử newdelete, nó tương tự như mallocfree trong C
 int main(int argc, char **argv){  
   Car *car1 = NULL;  
   Car *car2 = NULL;  

   car1 = new Car();  
   car2 = new Car();  

   car1->reFuel(100);  
   car2->reFuel(150);  
   car1->setSpeed(150);  
   car2->setSpeed(270); 
 
   printf("car1 drive \n");  
   car1->drive();  
   printf("car2 drive \n");  
   car2->drive(); 
 
   delete car1;  
   delete car2;  

   return 1;  
 }  

Khi new thì hàm Constructor  Car::Car( ) được thực hiện, khi delete thì hàm Destructor    Car::~Car( ) được thực hiện
Note: Khi dùng Object pointer với new thì nhất thiết phải gọi delete khi kết thúc chương trình để giải phóng Object, còn trong trường hợp Object thường thì lúc kết thúc chương trình sẽ được tự động giải phóng.

4. Class & Object in detail

Concept Description
Constructor & destructor Là hai hàm đặc biệt được gọi khi khởi tạo (new) và giải phóng (detete) object. Theo ví dụ trên Car::Car( ) là constructor, Car::~Car( ) là destructor
Class member functions Member function của một class biểu diễn cho phương thức - method của class đó, được khai báo trong class tương tự như các biến khác (attributes).
Các hàm reFuel, getFuel, setSpeed, getSpeed, drive là các member function, chúng có thể được implement bên trong class (reFuel, getFuel) hoặc đưa ra bên ngoài (setSpeed, getSpeed, drive)
Class access modifiers (*) Thể hiện cho phạm vi xuất hiện/hoạt động của Attributes cũng như Methods, bao gồm các mức độ: public, private và protected
C++ copy constructor Là một Constructor để tạo ra object B bằng cách khởi tạo nó từ một object A có cùng class, object A đã được khởi tạo trước đó
C++ friend functions (*) Là một hàm có chức năng để truy cập vào các member có access modifiers là private & protected từ class này sang một class khác
C++ inline functions (*) Với một inline function, compiler sẽ lấy toàn bộ souce code trong hàm đó và đặt vào chỗ mà inline function đó được gọi. Hàm inline được áp dụng đối với hàm không quá dài và hàm này thường xuyên được gọi nhằm mục đích tăng tốc độ chương trình. Để khai báo hàm inline chỉ việc thêm từ khóa inline vào trước khai báo hàm là đươc,
ví dụ: inline int getSpeed( )
The this pointer in C++ (*) Mỗi một object có một pointer đặc biệt, cái mà tự trỏ đến chính nó.
Ví dụ:
void reFuel(float fuel)
{
this->fuel = fuel;
}
Vì có sự trùng tên fuel giữa một bên là data member của class và một bên là local variable của hàm nên phải thêm this vào để phân biệt.
Pointer to C++ classes Một pointer object cũng được thực hiện tương tự như pointer struct đã được đề cập.
Static members of a class (*) Cả data member và function member của một class đều có thể được khai báo static. Khi đó chúng sẽ là member được dùng chung cho tất cả các object thuộc lớp đó.


4.1 Class Access Modifiers
Phạm vi hoạt động - Accessible
+ Same class (hoặc Base class): trong chính class mà member được khai báo
+ Derived class: trong lớp kế thừa (còn gọi là lớp con, lớp dẫn xuất)
+ Outside class: Từ bên ngoài class

Bảng dưới mô tả phạm vi accessible của các member khi khai báo chúng là public, protected hay private

Access public protected private
Same class yes yes yes
Derived classes yes yes no
Outside classes yes no no

+ Public member có khả năng  accessible ở mọi nơi
+ Protected member được accessible trong class và class kế thừa
+ Private member chỉ được accessible trong chính class nó được khai báo mà thôi.
Ex:
access-modifiers.cpp
 #include <iostream>  
 using namespace std;  
   
 /* BASE CLASS */  
 class Shape  
 {  
 public:  
   void setValue(int pub, int pro, int pri){  
     this->pub = pub;  
     this->pro = pro;  
     this->pri = pri;  
   }  
   
 public:  
   void setPublic(int pub)  
   {  
     this->pub = pub;  
     cout << "setPublic: " << pub << endl;  
   }  
 protected:  
   void setProtected(int pro){  
     this->pro = pro;  
     cout << "setProtected: " << pro << endl;  
   }  
   
 private:  
   void setPrivate(int pri){  
     this->pri = pri;  
     cout << "setPrivate: " << pri << endl;  
   }  
   
   
 public:  
   int pub;  
   
 protected:  
   int pro;  
   
 private:  
   int pri;  
 };  
   
 /* DERIVED CLASS */  
 class Rectangle: public Shape  
 {  
   
 public:  
   void print_info(){  
     cout << "pub: " << pub << " pro: " << pro << endl;  
     /* pri khong the duoc truy cap o lop ke thua vi la private */  
   }  
 };  
   
 int main(void)  
 {  
   Shape shape;  
   Rectangle rect;  
   
   shape.setValue(1,2,3);  
   rect.setValue(3,2,1);  
   
   /* OUTSIDE CLASS */  
   rect.print_info();  
   shape.setPublic(10); /* ok */  
   //shape.setProtected(10); /* fail */  
   //shape.setPrivate(10); /* fail */  
   
   shape.pub = 10; /* ok */  
   //shape.pro = 10; /* fail */  
   //shape.pri = 10; /* fail */  
   
   return 0;  
 }  
   

Xem thêm tại đây.

4.2 C++ friend class & friend function

Như đã biết trong phần 4.1 rằng  private member chỉ có thể truy cập trong chính class mà nó được khai báo, tuy nhiên nhờ có sự hỗ trợ từ C++ friend class & friend function mà private member có thêm một các truy cập khác từ bên ngoài.


Friend function
+ Khai báo hàm bạn bằng cách thêm từ khóa friend trước hàm bình thường, từ đó trong hàm bạn có thể truy cập private member của class
+ Friend function của nhiều class: function đó được khai báo trong tất cả các class là bạn với nó.
+ Note: friend function là một hàm bình thường, nó không phải là function member (method) của class, vì thế nên khi implement nó giống y như hàm bình thường.

Ex:
friend-function.cpp 
 #include<iostream>  
 using namespace std;  
   
 class Rectangle;  
 class Circle;  
   
   
 class Rectangle  
 {  
 private:  
   int w;  
   int h;  
 public:  
   Rectangle(int w, int h){  
     this->w = w;  
     this->h = h;  
   }  
   
   friend int Area(Rectangle); // khai bao ham ban Area  
   friend void print_info(Rectangle rec, Circle cir);  
 };  
   
 class Circle{  
 private:  
   float r;  
   
 public:  
   Circle(float r){  
     this->r = r;  
   }  
   
   friend void print_info(Rectangle rec, Circle cir);  
 };  
   
   
 // ham ban cua class Rectangle  
 int Area(Rectangle rec){  
   return (rec.w*rec.h);  
 }  
   
 //ham ban cua ca Rectangle & Circle  
 void print_info(Rectangle rec, Circle cir){  
   cout<<"rec.w: " << rec.w <<" rec.h: " << rec.h << endl;  
   cout<<"cir.r: " << cir.r << endl;  
 }  
   
 int main()  
 {  
   Rectangle rec(2, 5);  
   Circle cir(10);  
   
   cout<<"Dien tich Rectangle: "<< Area(rec) << endl;  
   print_info(rec, cir);  
   
   return 0;  
 }  
   

Friend class
Khai báo friend class bằng các thêm friend class <class name>

Ex
access-class.cpp
 #include<iostream>  
 using namespace std;  
   
 class A  
 {  
 private:  
   int r; // chieu rong  
   int d; // chieu dai  
 public:  
   A(int, int);  
   friend class B; // khai bao lop B la ban cua A  
 };  
 A::A(int r, int d){  
   this->r=r; this->d=d;  
 }  
   
 class B{  
 private:  
   int r;  
   int d;  
   
 public:  
   B(int r, int d);  
   void print_A_info(A t);  
 };  
   
 B::B(int r, int d){  
   this->r = r;  
   this->d = d;  
 }  
 void B::print_A_info(A t){  
   cout<<"A: r = "<< t.r << ", d= " << t.d << endl;  
 }  
   
 // ham main  
 int main()  
 {  
   A rec(2, 5);  
   B m(5, 2);  
   m.print_A_info(rec);  
   return 0;  
 }  
   


Trong vd trên class A nói rằng class B là bạn của nó, điều đó có nghĩa từ bên trong B có thể truy cập các private member của A, tuy nhiên điều ngược lại là không đúng, trong A không thể truy cập private member của B vì B không xem A là bạn, điều này giống như bạn yêu đơn phương một ai đó vậy.

Xem thêm tại đây.

Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -