SLIDE1

Showing posts with label giao trinh oop. Show all posts
Showing posts with label giao trinh oop. Show all posts

Saturday, June 20, 2015

[oop c++] phạm vi truy xuất trong kế thừa

Truy xuất theo chiều dọc:
Hàm thành phần của lớp con có quyền truy xuất các thành phần của lớp cha hay không?
Truy xuất theo chiều ngang:
Các thành phần của lớp cha, sau khi kế thừa xuống lớp con, thì thế giới bên ngoài có quyền truy xuất thông qua đối tượng của lớp con hay không?

[oop c++] Kế thừa - định nghĩa, cú pháp, sử dụng

Kế thừa

 là một đặc điểm của ngôn ngữ dùng để biểu diễn mối quan hệ đặc biệt hóa – tổng quát hóa giữa các lớp. Các lớp được trừu tượng hóa và được tổ chức thành một sơ đồ phân cấp lớp.
Sự kế thừa là một mức cao hơn của trừu tượng hóa, cung cấp một cơ chế gom chung các lớp có liên quan với nhau thành một mức khái quát hóa đặc trưng cho toàn bộ các lớp nói trên.

[oop c++] Quan hệ giữa các lớp đối tượng

Giữa các lớp đối tượng có những loại quan hệ sau:

Quan hệ một một (1-1)
Quan hệ một nhiều (1-n)
Quan hệ nhiều nhiều (n-n)
Quan hệ đặc biệt hóa, tổng quát hóa

Thursday, June 18, 2015

[oop c++] Các nguyên tắc xây dựng lớp


  1. Hình thành lớp: Khi ta nghĩ đến “nó” như một khái niệm riêng lẻ ->Xây dựng lớp biểu diễn khái niệm đó.
  2. Lớp là biểu diễn cụ thể của một khái niệm vì vậy tên lớp luôn là danh từ.
  3. Các thuộc tính của lớp là các thành phần dữ liệu nên chúng luôn là danh từ.
  4. Các hàm thành phần (các hành vi) là các thao tác chỉ rõ hoạt động của lớp nên các hàm là động từ.
  5. Các thuộc tính có thể suy diễn từ những thuộc tính khác thì dùng hàm thành phần để thực hiện tính toán. Ví dụ chu vi, diện tích của một tam giác
  6. Tuy nhiên, nếu các thuộc tính suy diễn dòi hỏi nhiều tài nguyên hoặc thời gian để thực hiện tính toán, ta có thể khai báo là dữ liệu thành phần.
  7. Dữ liệu thành phần nên được kết hợp:
  8. Trong mọi trường hợp, nên có phương thức thiết lập (Constructor) để khởi động đối tượng
  9. Nên có phương thức thiết lập có khả năng tự khởi động không cần tham số
  10. Nếu đối tượng có nhu cầu cấp phát tài nguyên thì phải có phương thức thiết lập, copy constructor để khởi động đối tượng bằng đối tượng cùng kiểu và có destructor để dọn dẹp. Ngoài ra còn có phép gán (chương 4).
  11. Nếu đối tượng đơn giản không cần tài nguyên riêng ->Không cần copy constructor và destructor


[oop c++] Thành viên tĩnh – static member

Trong C, static xuất hiện trước dữ liệu được khai báo trong một hàm nào đó thì giá trị của dữ liệu đó vẫn được lưu lại như một biến toàn cục.
Trong C++, nếu static xuất hiện trước một dữ liệu hoặc một phương thức của lớp thì giá trị của nó vẫn được lưu lại và có ý nghĩa cho đối tượng khác của cùng lớp này.
Các thành viên static có thể là public, private hoặc protected.

Đối với class, static dùng để khai báo thành viên dữ liệu dùng chung cho mọi thể hiện của lớp:

Một bản duy nhất tồn tại trong suốt quá trình chạy của chương trình.
Dùng chung cho tất cả các thể hiện của lớp.
Bất kể lớp đó có bao nhiêu thể hiện.

Ví dụ
class Rectangle
{
    private:
       int width;
       int length;
       static int count;
    public:
       void set(int w, int l);
       int area();
}

Ví dụ
Đếm số đối tượng MyClass:
class MyClass{
    public:
        MyClass();
        ~MyClass();
        void printCount();
    private:
        static int count;
};

int MyClass::count = 0;
MyClass::MyClass(){
    this -> count++;
}
MyClass::~MyClass(){
    this -> count--;
}
void MyClass::printCount(){
    cout << “There are currently ” << this  count << “ instance(s) of MyClass.\n”;
}
void main()
{
    MyClass* x = new MyClass;
    x -> printCount();
    MyClass* y = new MyClass;
     x -> printCount();
     y -> printCount();
    delete x;
     y -> printCount();
}


Phương thức static?

Đối với các phương thức static, ngoài ý nghĩa tương tự với dữ liệu, còn có sự khác biệt cơ bản đó là việc cho phép truy cập đến các phương thức static khi chưa khai báo đối tượng (thông qua tên lớp)
Các thành viên lớp tĩnh public có thể được truy cập thông qua bất kỳ đối tượng nào của lớp đó, hoặc chúng có thể được truy cập thông qua tên lớp sử dụng toán tử định phạm vi.
Các thành viên lớp tĩnh private và protected phải được truy cập thông qua các hàm thành viên public của lớp hoặc thông qua các friend của lớp.
Các thành viên lớp tĩnh tồn tại ngay cả khi đối tượng của lớp đó không tồn tại.
Để truy cập một thành viên lớp tĩnh public khi các đối tượng của lớp không tồn tại, đơn giản thêm vào đầu tên lớp và toán tử định phạm vi cho thành viên dữ liệu.
Để truy cập một thành viên lớp tĩnh private hoặc protected khi các đối tượng của lớp không tồn tại, một hàm thành viên public phải được cung cấp và hàm phải được gọi bởi thêm vào đầu tên của nó với tên lớp và toán tử định phạm vi.

[oop c++] hàm bạn, lớp bạn (friend function)

Hàm bạn, lớp bạn (Friend function)


Giả sử có lớp Vector, lớp Matrix
Cần viết hàm nhân Vector với một Matrix
Hàm nhân:
Không thể thuộc lớp Vector
Không thể thuộc lớp Matrix
Không thể tự do
Giải pháp: Xây dựng hàm truy cập dữ liệu?
Hàm bạn không thuộc lớp. Tuy nhiên, có quyền truy cập các thành viên private của lớp.
Khi định nghĩa một lớp, có thể khai báo một hay nhiều hàm “bạn” (bên ngoài lớp)
Ưu điểm:
Kiểm soát các truy nhập ở cấp độ lớp – không thể áp đặt hàm bạn cho lớp nếu điều đó không được dự trù trước trong khai báo của lớp.
Dùng từ khóa friend để khai báo, định nghĩa hàm bạn
Đây là cách cho phép chia sẻ dữ liệu giữa các đối tượng với một hàm tùy ý trong chương trình (hàm friend) hoặc chia sẻ các thành phần của đối tượng có thuộc tính private hay protected với các đối tượng khác (lớp friend).
Các tính chất của quan hệ friend:
Phải được cho, không được nhận
Lớp B là bạn của lớp A, lớp A phải khai báo rõ ràng B là bạn của nó
Không đối xứng, Không bắc cầu
Quan hệ friend có vẻ như vi phạm khái niệm đóng gói (encapsulation) của OOP nhưng có khi lại cần đến nó để cài đặt các mối quan hệ giữa các lớp và khả năng đa năng hóa toán tử trên lớp (sẽ đề cập ở chương sau)

Ví dụ
class COUNTERCLASS{
    int Counter;
public:
    char CounterChar;
    void Init( char );
    void AddOne( ){
        Counter++;
    }
    friend int Total (int);
};
COUNTERCLASS MyCounter[26];     //Có 26 đối tượng
int Total(int NumberObjects)
{
    for (int i=0, sum=0; i<NumberObjects; i++)
        sum += MyCounter[i].Counter
        //Tính tổng số ký tự trong số các Objects ký tự
    return sum;
}

Lưu ý:
Vị trí của khai báo “bạn bè” trong lớp hoàn toàn tùy ý
Trong hàm bạn, không còn tham số ngầm định this như trong hàm thành phần
Hàm bạn của một lớp có thể có một hay nhiều tham số, hoặc có thể có giá trị trả về thuộc kiểu lớp đó
Một lớp có thể truy cập đến các thành phần có thuộc tính private của một lớp khác.
Để thực hiện được điều này, chúng ta có thể lấy toàn bộ một lớp làm bạn (lớp friend) cho lớp khác.

Ví dụ
class TOM{
public:
    friend class JERRY;     //Có lớp bạn là JERRY
private:
    int SecretTom;      //Bí mật của TOM
};
class JERRY{
public:
    void Change(TOM T){
        T.SecretTom++;  //Bạn nên có thể truy cập
    }
};

Wednesday, June 17, 2015

[oop c++] hàm thiết lập constructor, hủy bỏ destructor

Trong hầu hết các thuật giải, để giải quyết một vấn đề thường phải thực hiện các công việc:
Khởi tạo giá trị cho biến, cấp phát vùng bộ nhớ của biến con trỏ, mở tập tin để truy cập,…
Hoặc khi kết thúc, chúng ta phải thực hiện quá trình ngược lại như: Thu hồi vùng bộ nhớ đã cấp phát, đóng tập tin,…
Các ngôn ngữ OOP có các phương thức để thực hiện công việc này một cách “tự động” gọi là phương thức thiết lập và phương thức hủy bỏ.

Constructor 

[oop c++] con trỏ this và phép gán đối tượng

Con trỏ this


Từ khoá this trong định nghĩa của các hàm thành phần lớp dùng để xác định địa chỉ của đối tượng dùng làm tham số ngầm định cho hàm thành phần.
Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành phần.
Ví dụ:
int Trung(point pt){
return (this -> x == pt.x && this -> y == pt.y);
}

Phép gán đối tượng

Là việc sao chép giá trị các thành phần dữ liệu từ đối tượng a sang đối tượng b tương ứng từng đôi một
Ví dụ:
point a, b;
a.init(5,2);
b = a;

[OOP C++] Phạm Vi Truy Xuất Thành Phần Đối Tượng

Trong định nghĩa của lớp ta có thể xác định khả năng truy xuất thành phần của một lớp nào đó từ bên ngoài phạm vi lớp.
private, protected và public là các từ khoá xác định phạm vi truy xuất
Mọi thành phần được liệt kê trong phần public đều có thể truy xuất trong bất kỳ hàm nào.
Những thành phần được liệt kê trong phần private chỉ được truy xuất bên trong phạm vi lớp.
Trong lớp có thể có nhiều nhãn private và public
Mỗi nhãn này có phạm vi ảnh hưởng cho đến khi gặp một nhãn kế tiếp hoặc hết khai báo lớp.
Nhãn private đầu tiên có thể bỏ qua vì C++ ngầm hiểu rằng các thành phần trước nhãn public đầu tiên là private.

Tuesday, June 2, 2015

thao tác file với thư viện fstream

Để sử dụng được thư viện fstream, ta phải include thư viện fstream và using namespace std;

#include <fstream>
using namespace std;
Điều đầu tiên, ta tạo ra một đối tượng fstream. Ta sẽ thao tác với file thông qua đối tượng đó.

fstream f;
Để mở một file, ta dùng phương thức open sau:

f.open(filePath, mod);
Trong đó:

filePath có kiểu dữ liệu là const char*, là đường dẫn đến file cần mở.
mod là chế độ mở file. Chúng ta có một số chế độ như sau:
ios::in Mở file để đọc.
ios::out Mở file có sẵn để ghi
ios::binary Mở file ở chế độ nhị phân.
ios:ate Mở file và đặt con trỏ file vào cuối file.
ios::app Mở file và ghi dữ liệu vào cuối file. Nếu file không tồn tại thì tạo file mới.
ios::trunc Chế độ mở file, xóa bỏ hoàn toàn nội dung trong file được mở.

Sunday, April 26, 2015

thư viện vector STL C++

SỬ DỤNG STL VECTOR TRONG C++
Nguyễn Trí Hải
11520094
KHMT06

I) Giới thiệu:
Lớp mảng động vector<T>có sẵn trong thư viện chuẩn STL của C++ cho phép định nghĩa một mảng động các phần tử kiểu T, vector có các tính chất sau:
- Không cần phải khai báo kích thước của mảng vector có thể tự động cấp phát bộ nhớ, bạn sẽ không phải quan tâm đến quản lý kích thước của nó.
- Vector còn có thể cho bạn biết số lượng các phần tử mà bạn đang lưu trong nó.
- Vector có các phương thức của stack.
- Hỗ trợ tất cả các thao tác cơ bản như chèn ,xóa, sao chép ..

cơ bản thư viện vector STL C++

khai báo thư viện
#include<vector>
using namespace std;
vector <int> a; khai báo 1 vector kiểu int.không cần khai báo số phần tử của vector, nó sẽ tự nâng bộ nhớ lên. hoặc nếu muôn có thể khai bao như sau
vetor <int> a(10); khai báo 1 vector có 10 phần tử.mặc dù khai báo 10 phần tử như vậy nhưng nó hoàn toàn có thể tự nâng lên khi ta sử dụng hơn.
*các kiểu khai bai báo mặc định giá trị ban đầu cho vector:
vector <int> a(10,2); khai báo vector có 10 phần tử và các phần tủ có giá trị ban đầu là 2;
vector <int> a(vector b); tạo vector a là bản sao của vactor b
vector <int> a(vector b.begin(),b.begin()+5); sao chép vào vector a 5 phần tử dầu tiên của vector b;
[] : phép lấy chỉ số hoàn toàn giống với mảng

Friday, April 24, 2015

cơ bản về thư viện string - STL C++



khai báo thư viện string STL
#include<string>
using namespace std;
string s;
+,+= : phép nối chuỗi.
s="tran khanh toan" : phép gán chuỗi
==,!=,>=,>,<,<= : các phép so sánh chuỗi
[] : phép lấy chỉ số để duyệt các ký tự của chuỗi
s.length() : lấy chiều dài của chuỗi
cout<< và cin>> trong iostream để xuất chuỗi ra màn hình, riêng cin thì chỉ lấy chuỗi đến khi gặp khoản trắng thì dừng

Wednesday, April 22, 2015

tạo lập đối tượng trong c++

*tạo lập đối tượng
Khai báo và tạo đối tượng:
<tên lớp>  <tên đối tượng>;
Gọi hàm thành phần của lớp
<tên đối tượng>.<tên hàm thành phần> (<danh sách các tham số nếu có>);
<tên con trỏ đối tượng><tên hàm thành phần> (<danh sách các tham số nếu có>);

lớp class trong lập trình c++

Một lớp bao gồm các thành phần dữ liệu (thuộc tính) và các phương thức (hàm thành phần).
Lớp trong C++ thực chất là một kiểu dữ liệu do người sử dụng định nghĩa.
Trong C++, dùng từ khóa class để chỉ điểm bắt đầu của một lớp sẽ được cài đặt.
Lớp là một mô tả trừu tượng của nhóm các đối tượng cùng bản chất, ngược lại mỗi một đối tượng là một thể hiện cụ thể cho những mô tả trừu tượng đó.
Lớp là cái ta thiết kế và lập trình

Sunday, March 15, 2015

tổng quan về lập trình hướng đối tượng OOP C++

tổng quan về lập trình hướng đối tượng OOP C++
Mục tiêu của kỹ sư lập trình:
Tạo ra sản phẩm tốt một cách có hiệu quả
Nắm bắt được công nghệ

Độ phức tạp và độ lớn ngày càng cao:
Một số hệ Unix chứa khoảng 4M dòng lệnh
MS Windows chứa hàng chục triệu dòng lệnh
Người dùng ngày càng đòi hỏi nhiều chức năng, đặc biệt là chức năng thông minh
Phần mềm luôn cần được sửa đổi


Cần kiểm soát chi phí:
Chi phí phát triển
Chi phí bảo trì
Giải pháp chính là sử dụng lại (tái sử dụng):
Giảm chi phí và thời gian phát triển
Nâng cao chất lượng

sự khác biệt giữa c và c++

Phạm vi và khai báo:
Không giống như C, chúng ta có thể khai báo một biến tại một vị trí bất kỳ trong chương trình.
Một biến chỉ có tầm tác dụng trong khối lệnh nó được khai báo.
Do đó, C++ cung cấp toán tử định phạm vi (::) để xác định rõ biến nào được sử dụng khi xảy ra tình trạng định nghĩa chồng một tên biến trong một khối lệnh con.

Thursday, February 5, 2015

CÁC MỞ RỘNG CỦA C++

CÁC MỞ RỘNG CỦA C++ 
II.1. Các từ khóa mới của C++ 
 Để bổ sung các tính năng mới vào C, một số từ khóa (keyword) mới đã được đưa vào C++ ngoài các từ khóa có trong C. Các chương trình bằng C nào sử dụng các tên trùng với các từ khóa cần phải thay đổi trước khi chương trình được dịch lại bằng C++. Các từ khóa mới này là :  asm catch class delete friend inline new operator private protected public template this throw try virtual   
II.2. Cách ghi chú thích  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 /*…*/. 
II.3. Dòng nhập/xuất chuẩn 

LỊCH SỬ CỦA C++

LỊCH SỬ CỦA C++
Vào những năm đầu thập niên 1980, người dùng biết C++ với tên gọi "C with Classes" được mô tả trong hai bài báo của Bjarne Stroustrup (thuộc AT&T Bell Laboratories) với nhan đề "Classes: An Abstract Data Type Facility for the C Language" và "Adding Classes to C : AnExercise in Language Evolution". Trong công trình này, tác giả đã đề xuất khái niệm lớp, bổ sung việc kiểm tra kiểu tham số của hàm, các chuyển đổi kiểu và một số mở rộng khác vào ngôn ngữ C. Bjarne Stroustrup nghiên cứu mở rộng ngôn ngữ C nhằm đạt đến một ngôn ngữ mô phỏng (simulation language) với những tính năng hướng đối tượng. Trong năm 1983, 1984, ngôn ngữ "C with Classes" được thiết kế lại, mở rộng hơn rồi một trình biên dịch ra đời. Và chính từ đó, xuất hiện tên gọi "C++". Bjarne Stroustrup mô tả ngôn ngữ C++ lần đầu tiên trong bài báo có nhan đề "Data Abstraction in C". Sau một vài hiệu chỉnh C++ được công bố rộng rãi trong quyển "The C++ Programming Language" của Bjarne Stroustrup xuất hiện đánh dấu sự hiện diện thực sự của C++, người lập tình chuyên nghiệp từ đây đã có một ngôn ngữ đủ mạnh cho các dữ án thực tiễn của mình. Về thực chất C++ giống như C nhưng bổ sung thêm một số mở rộng quan trọng, đặc biệt là ý tưởng về đối tượng, lập trình định hướng đối tượng.Thật ra các ý tưởng về cấu trúc trong C++ đã xuất phát vào các năm 1970 từ Simula 70 và Algol 68. Các ngôn ngữ này đã đưa ra các khái niệm về lớp và đơn thể. Ada là một ngôn ngữ phát triển từ đó, nhưng C++ đã khẳng định vai trò thực sự của mình.

CÁC NGÔN NGỮ VÀ VÀI ỨNG DỤNG CỦA OOP

III. CÁC NGÔN NGỮ VÀ VÀI ỨNG DỤNG CỦA OOP
 Xuất phát từ tư tưởng của ngôn ngữ SIMULA67, trung tâm nghiên cứu Palo Alto (PARC) của hãng XEROR đã tập trung 10 năm nghiên cứu để hoàn thiện ngôn ngữ OOP đầu tiên với tên gọi là Smalltalk. Sau đó các ngôn ngữ OOP lần lượt ra đời như Eiffel, Clos, Loops, Flavors, Object Pascal, Object C, C++, Delphi, Java… Chính XEROR trên cơ sở ngôn ngữ OOP đã đề ra tư tưởng giao diện biểu tượng trên màn hình (icon base screen interface), kể từ đó Apple Macintosh cũng như Microsoft Windows phát triển giao diện đồ họa như ngày nay. Trong Microsoft Windows, tư tưởng OOP được thể hiện một cách rõ nét nhất đó là "chúng ta click vào đối tượng", mỗi đối tượng có thể là control menu, control menu box, menu bar, scroll bar, button, minimize box, maximize box, … sẽ đáp ứng công việc tùy theo đặc tính của đối tượng. Turbo Vision của hãng Borland là một ứng dụng OOP tuyệt vời, giúp lập trình viên không quan tâm đến chi tiết của chương trình gia diện mà chỉ cần thực hiện các nội dung chính của vấn đề.