.8| Con trỏ this

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 63 - 68)

Xét ví dụ:

Câu lệnh ctr1.clear() sẽ thực hiện truyền ngầm định địa chỉ của đối tượng ctr1 tới lời gọi của phương thức clear. Đây là cách để xác định trường count là của đối tượng nào. Nếu ctr1.clear() thì count là của đối tượng ctr1 cịn nếu ctr2.clear() thì count là của ctr2.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 60

Trong một định nghĩa phương thức, lập trình viên có thể truy cập tới đối số ngầm định thơng qua từ khóa this. Trong thân phương thức thì this là một con trỏ dùng trỏ tới đối tượng đang thực hiện lời gọi đến phương thức đó. Lớp Counter ở trên được viết lại như sau:

Một vài lập trình viên ln sử dụng con trỏ this để dễ đọc hơn và để chỉ đây là thuộc tính của lớp chứ khơng phải là một biến tồn cục hay cục bộ, giúp tránh nhầm lẫn trong trường hợp được nêu ở ví dụ sau:

Một trường hợp sử dụng khác của con trỏ this là dùng để truyền đối tượng hiện hành tới một hàm hay phương thức khác. Giả sử có một hàm tồn cục tên log, hàm này yêu cầu truyền tham số là một đối tượng lớp Counter.

Nếu trong phương thức clear muốn gọi tới hàm log và truyền chính đối tượng hiện tại thì sẽ được viết như sau:

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 61

4.9| PHƯƠNG THỨC HẰNG (CONST METHOD)

Xét lại ví dụ sau:

//simplerational.cpp #include <iostream> #include <cstdlib>

// Models a mathematical rational number class SimpleRational

{

int numerator; int denominator; public:

// Initializes the components of a Rational object SimpleRational(int n, int d): numerator(n),

denominator(d) {

if (d == 0) {

// Display error message

std::cout << "Zero denominator error\n"; exit(1); // Exit the program

} }

// The default constructor makes a zero rational number

// 0/1

SimpleRational(): numerator(0), denominator(1) {} // Allows a client to reassign the numerator

void set_numerator(int n) {

numerator = n; }

// Allows a client to reassign the denominator. // Disallows an illegal fraction (zero

denominator).

void set_denominator(int d) {

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 62

if (d != 0)

denominator = d; else

{

// Display error message

std::cout << "Zero denominator error\n"; exit(1); // Exit the program

} }

// Allows a client to see the numerator's value. int get_numerator()

{

return numerator; }

// Allows a client to see the denominator's value. int get_denominator()

{

return denominator; }

};

// Returns the product of two rational numbers SimpleRational multiply(SimpleRational f1, SimpleRational f2)

{

return {f1.get_numerator() * f2.get_numerator(), f1.get_denominator() * f2.get_denominator()}; } void print_fraction(SimpleRational f) { std::cout << f.get_numerator() << "/" << f.get_denominator(); } int main() {

SimpleRational fract(1, 2); // The fraction 1/2 std::cout << "The fraction is ";

print_fraction(fract); std::cout << '\n';

fract.set_numerator(19); fract.set_denominator(4);

std::cout << "The fraction now is "; print_fraction(fract);

std::cout << '\n';

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 63

instead of ()

SimpleRational fract1{1, 2}, fract2{2, 3}; auto prod = multiply(fract1, fract2);

std::cout << "The product of "; print_fraction(fract1); std::cout << " and "; print_fraction(fract2); std::cout << " is "; print_fraction(prod); std::cout << '\n'; }

Nếu một phương thức không hỗ trợ để thay đổi trạng thái của đối tượng thì nên được khai báo là phương thức hằng (const method). Trong lớp SimpleRational, phương thức get_numerator và get_denominator đơn giản là trả về giá trị cho người dùng, không thay đổi giá trị thuộc tính của đối tượng, vì thế nên thiết kế là phương thức hằng để tránh trường hợp lập trình viên vơ tình thay đổi trạng thái của đối tượng.

Nếu chúng ta cố gắng thay đổi thuộc tính trong phương thức hằng thì sẽ bị báo lỗi. Phương thức hằng khơng những là chiến lược phịng thủ tốt của người thiết kế lớp mà nó cịn được gọi cho đối tượng hằng (const object) trong khi các đối tượng hằng không thể gọi tới các phương thức thông thường khác.

Vì vậy để tăng tối đa độ linh hoạt. Những phương thức khơng có nhu cầu thay đổi trạng thái đối tượng thì nên khai báo là phương thức hằng vì nó có thể được gọi bởi đối tượng thông thường và đối tượng hằng.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 64

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 63 - 68)

Tải bản đầy đủ (PDF)

(143 trang)