Lập trình hướng đối tượng

29 748 1
Lập trình hướng đối tượng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Lâp trình hướng đối tượng

Chương 4: Các kỹ thuật xây dựng hàm, sử dụng biến, LTHDT Huỳnh Quyết Thắng Cao Tuấn Dũng Bộ môn CNPM Các thành phần tĩnh (static)    Việc khai báo liệu phạm vi toàn cục (global) khơng đảm bảo an tồn gây xung đột Để khắc phục điều ta khai báo liệu dạng Static Từ khoá static: – Các liệu static chiếm địa cố định tạo lần, lần tham chiếu sau sử dụng lại liệu tạo  Mang tính cục khả sử dụng: coi kỹ thuật quản lý định danhbiến/hàm TS H.Q Thắng - TS C.T Dũng CNPM Các thành phần tĩnh  Các biến địa phương khai báo cục hàm: – Trong trường hợp biến địa phương không khai báo biến static lần gọi hàm chương trình dịch lại đăng ký tạo biến – Khi khai báo biến địa phương biến static chương trình dịch khởi tạo lần (ở lần gọi đầu tiên) biến địa phương thông qua trỏ stack lần gọi sau chi tham chiếu tới biến tạo để sử dụng lại chúng mà không tạo biến  Tạo lần/tham chiếu nhiều lần/lưu giá trị lần tham chiếu trước TS H.Q Thắng - TS C.T Dũng CNPM Biến địa phương static Biến địa phương static: void f() { static int x=0; x++; } Lần gọi 1: f() Lần gọi 2: f() Biến địa phương không static void f() { int x=0; x++; } Lần gọi 1: f() Lần gọi 2: f() TS H.Q Thắng - TS C.T Dũng CNPM Thành phần liệu tĩnh  Tương tự biến tĩnh thành viên tĩnh – biến static x khai báo hàm f(), tồn suốt trình chạy chương trình – dùng chung cho tất lần chạy hàm f(), – hàm f() gọi lần  Đối với class, static dùng để khai báo thành viên liệu dùng chung cho thể lớp – tồn suốt trình chạy chương trình, – dùng chung cho tất thể lớp, – lớp TS H.Q Thắng - TS C.T Dũng CNPM Thành phần tĩnh: Chia sẻ tất đối tượng valCount val1 val2 value TS H.Q Thắng - TS C.T Dũng CNPM value Thành phần liệu tĩnh  Định nghĩa lưu trữ cho thành phần liệu tĩnh lớp – Bắt buộc phải định nghĩa thành phần liệu tĩnh với từ khoá static – Khai báo đăng ký nhớ để dành lưu trữ liệu thành phần tĩnh – Chỉ định nghĩa lần  Ví dụ khai báo: class A { static int i; }; int A::i =1; TS H.Q Thắng - TS C.T Dũng CNPM Đếm số đối tượng lớp (C++) class MyClass { public: MyClass(); // Constructor ~MyClass(); // Destructor void printCount(); // Output current value of count private: static int count; // static member to store // number of instances of MyClass }; TS H.Q Thắng - TS C.T Dũng CNPM Thành phần liệu tĩnh Định nghĩa khởi tạo    Thành viên tĩnh lưu trữ độc lập với thể lớp, đó, thành viên tĩnh phải định nghĩa: int MyClass::count; ta thường định nghĩa thành viên tĩnh file chứa định nghĩa phương thức muốn khởi tạo giá trị cho thành viên tĩnh ta cho giá trị khởi tạo định nghĩa int MyClass::count = 0; TS H.Q Thắng - TS C.T Dũng CNPM Thành phần tĩnh: My Class int MyClass::count = 0; MyClass::MyClass() { this->count++; // Increment the static count } MyClass::~MyClass() { this->count ; // Decrement the static count } void MyClass::printCount() { cout PrintCount(); y->PrintCount(); delete x; y->PrintCount(); } There There There There are are are are currently currently currently currently 2 instance(s) instance(s) instance(s) instance(s) TS H.Q Thắng - TS C.T Dũng CNPM of of of of MyClass MyClass MyClass MyClass 11 Đặc điểm thành phần liệu tĩnh      Thuộc lớp không thuộc đối tượng nào, sử dụng theo cú pháp: tên lớp :: tên biến Không thể sử dụng trỏ this Chịu ảnh hưởng quy định đóng gói liệu: từ khóa private, public, protected Các đối tượng lớp (thông qua hàm thành phần) truy nhập sử dụng liệu thành phần tĩnh Chỉ cấp phát nhớ cho liệu thành phần tĩnh biến tồn cục phạm vi xét TS H.Q Thắng - TS C.T Dũng CNPM 12 Java: Định nghĩa bên lớp TS H.Q Thắng - TS C.T Dũng CNPM 13 Java: thành phần DL tĩnh TS H.Q Thắng - TS C.T Dũng CNPM 14 Phương thức tĩnh   Từ khoá static dùng cho phương thức  phương thức tĩnh Một phương thức tĩnh gọi cách độc lập với thể lớp – phương thức tĩnh không dùng trỏ (tham chiếu) this – sửa đổi thành viên liệu từ phương thức tĩnh – gọi phương thức tĩnh mà không cần tạo thể lớp - gọi thẳng tên lớp TS H.Q Thắng - TS C.T Dũng CNPM 15 Phương thức tĩnh  Hàm thành phần tĩnh có quyền truy nhập, xử lý liệu lớp (các liệu thành phần tĩnh) mà khơng có quyền truy nhập sử dụng liệu thành phần thông thường (tại sao?)  Hàm thành phần tĩnh chịu ảnh hưởng quy định đóng gói liệu: private, public, protected TS H.Q Thắng - TS C.T Dũng CNPM 16 Ví dụ (C++) class MyClass { public: MyClass(); ~MyClass(); static void printCount(); private: static int count; }; • Dùng tên lớp kèm theo toán tử phạm vi (::) để gọi phương thức tĩnh: MyClass::printCount(); • Hoặc dùng đối tượng sẵn có để gọi phương thức tĩnh: MyClass x; x.printCount(); TS H.Q Thắng - TS C.T Dũng CNPM 17 Phương thức tĩnh Java class MyUtils { //===================== mean public static double mean(int[] p) { int sum = 0; for (int i=0; i1 (hai hàm trở lên) báo lỗi TS H.Q Thắng - TS C.T Dũng CNPM 40 20 Kỹ thuật chồng hàm LTHDT  Phân loại kỹ thuật chồng hàm: – Chồng hàm dựa đối số: số lượng kiểu liệu – Ví dụ: void f (int); void f (int, float); void f (); – Đặc điểm: Chấp nhận tất ngơn ngữ lập trình hướng đối tượng TS H.Q Thắng - TS C.T Dũng CNPM 41 Kỹ thuật chồng hàm LTHDT  Phân loại kỹ thuật chồng hàm: – Chồng hàm dựa kiểu liệu trả từ hàm Ví dụ: void f(int); int f(int); float f(int); – Đặc điểm: Khó thực chương trình dich, khơng chấp nhận ngơn ngữ lập trình hướng đối tượng C++ TS H.Q Thắng - TS C.T Dũng CNPM 42 21 Chồng hàm  Các điểm cần lưu ý chồng hàm: – Các hàm xem xét chồng hàm chúng phải có phạm vi (cùng lớp, mơ-đun) – Các hàm phải có tên hàm – Chỉ nên sử dụng hàm có mục đích, chức  Chồng hàm thường gặp xây dựng hàm thiết lập cho lớp TS H.Q Thắng - TS C.T Dũng CNPM 43 Java: định nghĩa chồng phương thức public class Ship4 { public double x=0.0, y=0.0, speed=1.0, direction=0.0; public String name; public Ship4(double x, double y, double speed, double direction, String name) { this.x = x; this.y = y; this.speed = speed; this.direction = direction; this.name = name; } public Ship4(String name) { this.name = name; } private double degreesToRadians(double degrees) { return(degrees * Math.PI / 180.0); } TS H.Q Thắng - TS C.T Dũng CNPM 44 22 Java: định nghĩa chồng phương thức public void move() { move(1); } public void move(int steps) { double angle = degreesToRadians(direction); x = x + (double)steps * speed * Math.cos(angle); y = y + (double)steps * speed * Math.sin(angle); } public void printLocation() { System.out.println(name + " is at (" + x + "," + y + ")."); } } TS H.Q Thắng - TS C.T Dũng CNPM 45 Sử dụng phương thức định nghĩa chồng public class Test4 { public static void main(String[] args) { Ship4 s1 = new Ship4("Ship1"); Ship4 s2 = new Ship4(0.0, 0.0, 2.0, 135.0, "Ship2"); s1.move(); s2.move(3); s1.printLocation(); s2.printLocation(); } } TS H.Q Thắng - TS C.T Dũng CNPM 46 23 Hàm có đối số mặc định (C++)  Khai báo hàm void hamf (int x, float y=1.0) – ý nghĩa: đối số x đối số giá trị mặc định, đối số y đối số có giá trị mặc định – có hai dạng gọi hàm func:  func(10); đối số x nhận giá trị x=10 đối số y nhận giá trị y=1.0 (giá trị mặc định)  func(10, 5.0); đối số x nhận giá trị x=10 đối số y nhận giá trị y=5.0 (giá trị truyền vào)  Hàm với đối số mặc định cho phép they đổi dạng hàm truyền giá trị/biến cho đối số TS H.Q Thắng - TS C.T Dũng CNPM 47 Hàm có đối số mặc định (C++)  Nguyên tắc khai báo hàm với đối số mặc định: – Để đảm bảo chương trình dịch xác định giá trị/biến truyền cho đối số cần phải giữ ngun tắc:  Các đối số khơng có giá trị mặc định xếp lên đầu danh sách đối số hàm  Các đối số có giá trị mặc định xếp xuống cuối danh sách đối số hàm    void f (int x, int y, int a=0, float b=1.0) Gọi hàm: (x) (y) (a) (b) f(1, 2, 5) TS H.Q Thắng - TS C.T Dũng CNPM 48 24 Hàm có đối số mặc định (C++) int getSum(int, int=0, int=0);// OK int getSum(int, int=0, int); //wrong!  Khi đối số bị bỏ qua lời gọi hàm, tất đối số sau phải bị bỏ qua sum = getSum(num1, num2); // OK sum = getSum(num1, , num3);// wrong! Ngôn ngữ Java không hỗ trợ đặc tính TS H.Q Thắng - TS C.T Dũng CNPM 49 Khi sử dụng ?  Sử dụng hàm với đối số có giá trị mặc định: – Thơng thường cơng việc mà hàm thực không thay đổi chất hay giải thuật thực Các đối số nhận giá trị mặc định hay truyền vào làm thay đổi kết mà không thay đổi ý nghĩa công việc – Trường hợp thứ hai nên sử dụng hàm có đối số giá trị mặc định: cơng việc hàm mang tính chất mở rộng trường hợp đối số nhận giá trị truyền vào TS H.Q Thắng - TS C.T Dũng CNPM 50 25 Khi sử dụng ?  Ví dụ (1): void f (int x, int y, int a=0, float b=1.0) – Công việc thực hiên f phụ thuộc vào đối số x, y, a, b thông thường a=0 b=1 nhiên số trường hợp a b nhận giá trị khác  Ví dụ (2): void f (int x, int y) – bình thường hàm f phụ thuộc vào hai giá trị đối số x,y Bây lý phát triển mở rộng f phụ thuộc vào đối số f(int x, int y, int a) – Làm định nghĩa lại f mà chương trình lời gọi cũ f có hai đối số không bị ảnh hưởng Lời giải khai báo đối số a đối số với giá trị mặc định: – f (int x, int y, int a=0); TS H.Q Thắng - TS C.T Dũng CNPM 51 Hằng LTHDT   Nguyên lý LTHDT thể đặc điểm tư tưởng lập trình: thay đổi khơng thay đổi nên sử dụng chúng Trong ngơn ngữ lập trình hướng đối tượng có từ khoá mang ý nghĩa khác để sử dụng trường hợp khai báo số: – const (C++) – final (java) TS H.Q Thắng - TS C.T Dũng CNPM 52 26 Con trỏ  Con trỏ tới hằng: – const int * pi – Trong trường hợp khai báo pi trỏ giá trị mà pi trỏ tới giá trị không đổi, không phép sử dụng pi để thay đổi giá trị – int a =10; int b=20; – pi=&a; //Lệnh – pi=&b; //Lệnh – *pi = 100; //Lệnh sai TS H.Q Thắng - TS C.T Dũng CNPM 53 Hằng trỏ  Hằng trỏ – int const *pi – Trong trường hợp khai báo pi trỏ tức pi trỏ tới địa không đổi, không phép sử dụng pi để thay đổi địa mà pi trỏ tới – int a =10; int b=20; int const *pi = &a; – pi=&b; //Lệnh sai  *pi = 100; //Lệnh TS H.Q Thắng - TS C.T Dũng CNPM 54 27 Sử dụng hàm  Truyền đối số từ khoá const – Khi khai báo hàm sử dụng từ khóa const để khai báo đối số hàm, dã quy định thân hàm sử dụng lện thay đổi giá trị đối số void f(const int n) { n++; // Lỗi thay đổi giá trị n } TS H.Q Thắng - TS C.T Dũng CNPM 55 Giá trị trả từ hàm – Tương tự trường hợp truyền đối số, khai báo hàm có giá trị trả hằng, tức bên thân hàm không phép thay đổi biến nằm lệnh return – Trên thực tế liệu giá trị trả từ hàm khơng có ý nghĩa #include const int f(int &i) { i++; return (++i); } void main() { int d=1; d=f(d); cout

Ngày đăng: 16/08/2012, 15:51

Hình ảnh liên quan

Tham chiếu - Lập trình hướng đối tượng

ham.

chiếu Xem tại trang 11 của tài liệu.
 Một tham chiếu có thể làm ột biến, tham số hình thức của hàm hay dùng làm giá trịtrảvềcủa một hàm - Lập trình hướng đối tượng

t.

tham chiếu có thể làm ột biến, tham số hình thức của hàm hay dùng làm giá trịtrảvềcủa một hàm Xem tại trang 11 của tài liệu.
– Việc sử dụng tham chiếu trong khai báo tham số hình thức của hàm sẽyêu cầu trình dịch truyềnđịa chỉcủ a biến cho hàm và hàm sẽthao tác trực tiếp trên các biếnđó. - Lập trình hướng đối tượng

i.

ệc sử dụng tham chiếu trong khai báo tham số hình thức của hàm sẽyêu cầu trình dịch truyềnđịa chỉcủ a biến cho hàm và hàm sẽthao tác trực tiếp trên các biếnđó Xem tại trang 12 của tài liệu.
 Từ khoá cosnt trong khai báo tham số hình thức nhằm - Lập trình hướng đối tượng

kho.

á cosnt trong khai báo tham số hình thức nhằm Xem tại trang 15 của tài liệu.
Hàm thiết lập sao chép MyClass x(5); - Lập trình hướng đối tượng

m.

thiết lập sao chép MyClass x(5); Xem tại trang 16 của tài liệu.
Khai báo điển hình - Lập trình hướng đối tượng

hai.

báo điển hình Xem tại trang 16 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan