Tìm kiếm

SỬ DỤNG DESTRUCTOR (Hàm hủy ~)

/* ------------------ ~ name.class(); -------------------*/

Một destructor là một hàm thành viên đặc biệt của một lớp. Tên của destructor đối với một lớp là ký tự ngã (~) theo sau bởi tên lớp.
Destructor của một lớp được gọi khi đối tượng được hủy bỏ nghĩa là khi sự thực hiện chương trình rời khỏi phạm vi mà trong đó đối tượng của lớp đó được khởi tạo. Destructor không thực sự hủy bỏ đối tượng – nó thực hiện "công việc nội trợ kết thúc" trước khi hệ thống phục hồi không gian bộ nhớ của đối tượng để nó có thể được sử dụng giữ các đối tượng mới.
Một destructor không nhận các tham số và không trả về giá trị. Một lớp chỉ có duy nhất một destructor – đa năng hóa destructor là không cho phép.
Nếu trong một lớp không có định nghĩa một destructor thì trình biên dịch sẽ tạo một destructor mặc định không làm gì cả.
Ví dụ 3.8: Lớp có hàm destructor

1: #include <iostream.h>
2:
3: class Simple
4: {
5: private:
6: int *X;
7: public:
8: Simple(); //Constructor
9: ~Simple(); //Destructor
10: void SetValue(int V);
11: int GetValue();
12: };
13:
14: Simple::Simple()
15: {
16: X = new int; //Cấp phát vùng nhớ cho X
17: }
18:
19: Simple::~Simple()
20: {
21: delete X; //Giải phóng vùng nhớ khi đối tượng bị hủy bỏ.
22: }
23:
24: void Simple::SetValue(int V)
25: {
26: *X = V;
27: }
28:
29: int Simple::GetValue()
30: {
31: return *X;
32: }
33:
34: int main()
35: {
36: Simple S;
37: int X;
38:
39: cout<<"Enter a number:";
40: cin>>X;
41: S.SetValue(X);
42: cout<<"The value of this number:"<<S.GetValue();
43: return 0;
44: } 

Chúng ta chạy ví dụ 3.8, kết quả ở hình 3.8





Read Users' Comments (0)

KHỞI ĐỘNG CÁC ĐỐI TƯỢNG CỦA LỚP : CONSTRUCTOR

/* -------------------------Hàm khởi tạo --------------------*/

Khi một đối tượng được tạo, các thành viên của nó có thể được khởi tạo bởi một hàm constructor. Một constructor là một hàm thành viên với tên giống như tên của lớp. Lập trình viên cung cấp constructor mà được gọi tự động mỗi khi đối tượng của lớp đó được tạo. Các thành viên dữ liệu của một lớp không thể được khởi tạo trong định nghĩa của lớp. Hơn nữa, các thành viên dữ liệu phải được khởi động hoặc trong một constructor của lớp hoặc các giá trị của chúng có thể được thiết lập sau sau khi đối tượng được tạo. Các constructor không thể mô tả các kiểu trả về hoặc các giá trị trả về. Các constructor có thể được đa năng hóa để cung cấp sự đa dạng để khởi tạo các đối tượng của lớp.
Constructor có thể chứa các tham số mặc định. Bằng cách cung cấp các tham số mặc định cho constructor, ngay cả nếu không có các giá trị nào được cung cấp trong một constructor thì đối tượng vẫn được bảo đảm để trong một trạng thái phù hợp vì các tham số mặc định. Một constructor của lập trình viên cung cấp mà hoặc tất cả các tham số của nó có giá trị mặc định hoặc không có tham số nào được gọi là constructor mặc định (default constructor). Chỉ có thể có một constructor mặc định cho mỗi lớp.
Ví dụ 3.7: Constructor với các tham số mặc định

1: #include <iostream.h>

2:
3: class Time
4: {
5: public:
6: Time(int = 0, int = 0, int = 0); //Constructor mặc định
7: void SetTime(int, int, int);
8: void PrintMilitary();
9: void PrintStandard();
10:
11: private:
12: int Hour;
13: int Minute;
14: int Second;
15: };
16:
17: //Hàm constructor để khởi động dữ liệu private
18: //Các giá trị mặc định là 0
19: Time::Time(int Hr, int Min, int Sec)
20: {
21: SetTime(Hr, Min, Sec);
22: }
23:
24: //Thiết lập các giá trị của Hour, Minute và Second
25: //Giá trị không hợp lệ được thiết lập là 0
26: void Time::SetTime(int H, int M, int S)
27: {
28: Hour = (H >= 0 && H < 24) ? H : 0;
29: Minute = (M >= 0 && M < 60) ? M : 0;
30: Second = (S >= 0 && S < 60) ? S : 0;
31: }
32:
33: //Hiển thị thời gian theo dạng giờ quân đội: HH:MM:SS
34: void Time::PrintMilitary()
35: {
36: cout << (Hour < 10 ? "0" : "") << Hour << ":"
37:       << (Minute < 10 ? "0" : "") << Minute << ":"
38:       << (Second < 10 ? "0" : "") << Second;
39: }
40:
41: // Hiển thị thời gian theo dạng chuẩn: HH:MM:SS AM (hoặc PM)
42: void Time::PrintStandard()
43: {
44: cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12)
45:       << ":" << (Minute < 10 ? "0" : "") << Minute
46:       << ":" << (Second < 10 ? "0" : "") << Second
47:       << (Hour < 12 ? " AM" : " PM");
48: }
49:
50: int main()
51: {
52: Time T1,T2(2),T3(21,34),T4(12,25,42),T5(27,74,99);
53:
54: cout << "Constructed with:" << endl
55:       << "all arguments defaulted:" << endl << " ";
56: T1.PrintMilitary();
57: cout << endl << " ";
58: T1.PrintStandard();
59: cout << endl << "Hour specified; Minute and Second defaulted:"
60: << endl << " ";
61: T2.PrintMilitary();
62: cout << endl << " ";
63: T2.PrintStandard();
64: cout << endl << "Hour and Minute specified; Second defaulted:"
65: << endl << " ";
66: T3.PrintMilitary();
67: cout << endl << " ";
68: T3.PrintStandard();
69: cout << endl << "Hour, Minute, and Second specified:"
70: << endl << " ";
71: T4.PrintMilitary();
72: cout << endl << " ";
73: T4.PrintStandard();
74: cout << endl << "all invalid values specified:"
75: << endl << " ";
76: T5.PrintMilitary();
77: cout << endl << " ";
78: T5.PrintStandard();
79: cout << endl;
80: return 0;
81: }

Chương trình ở ví dụ 3.7 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ệ.
Chúng ta chạy ví dụ 3.7, kết quả ở hình 3.7

 Hình 3.7: Kết quả của ví dụ 3.7
Nếu không có constructor nào được định nghĩa trong một lớp thì trình biên dịch tạo một constructor mặc định. Constructor này không thực hiện bất kỳ sự khởi tạo nào, vì vậy khi đối tượng được tạo, nó không bảo đảm để trong một trạng thái phù hợp.

Read Users' Comments (0)

kỉ niệm trường xưa...



Tuổi thơ trôi như giấc mơ,
Kỷ niệm trường xưa đã qua đâu ngờ,
Một thời học sinh dấu yêu
Nào ai qua đi không gì luyến lưu,
Từng trang lưu bút viết nên bao điều,
Gởi lại lòng tôi nhớ nhung sớm chiều
Dù cách xa tình sẽ không phai nhoà.

Ngày từng ngày vội vàng trôi qua, ghi dấu bao nhiêu kỷ niệm,
Lời dịu dàng hiền hoà thiết tha tâm huyết cô thầy khuyên dạy,
Lòng thầm nguyện một đời khắc ghi hai tiếng cô thầy thân thương,
Mai chia tay muôn phương cách xa bạn ơi chớ quên.

Thầy cô cho em lớn khôn, từng lời thầy em viết trong tâm hồn,
Bài học ngày xưa khó quên, hành trang ngày nay cho đời thắp lên
Ngày mai bạn ơi có nơi phương nào, dặn lòng đừng quên dấu yêu hôm nào,
Còn ngất ngây tình đắm say sau này.

Nghe xôn xao nôn nao vấn vương giây phút chia tay đến rồi,
Bạn bè ngày nào cùng sánh vai chia sớt cho nhau vui buồn,
Và rồi lòng chợt buồn xuyến xao xao xuyến nghẹn ngào con tim
Mưa đâu rơi rơi ướt mi nhòe đôi mắt ai.

Ngày từng ngày vội vàng trôi qua, ghi dấu bao nhiêu kỷ niệm,
Lời dịu dàng hiền hoà thiết tha tâm huyết cô thầy khuyên dạy,
Lòng thầm nguyện một đời khắc ghi hai tiếng cô thầy thân thương,
Mai chia tay muôn phương cách xa bạn ơi chớ quên.

Sẽ nhớ hoài kỷ niệm trường xưa đã qua,
Sẽ nhớ hoài cô thầy ngày thơ đã xa,
Sẽ nhớ hoài ôi bạn bè sao thiết tha,
Nỗi nhớ này xin gởi lại trong tiếng ca...



/* Nhớ quá ..................................*/
                                           My school: THPT Đội Cấn (Vĩnh tường - Vĩnh Phúc) 

Read Users' Comments (0)

Gửi làn gió...



Đến ngày tết năm nay con ko yên lòng
Nhớ gia đình và mẹ ở nhà
Đến ngày tết năm nay không có chúng ta
Sống cùng nhau đủ mặt như cũ
Mặc dù trái tim con sống cách xa mẹ
Chân tình con với mẹ vẫn sẻ chia
Đường trường hôm nay con từng ngày vẫn muốn biết
Mẹ ơi ,có hạnh phúc không?

Đêm giao thừa năm nay ai cũng vui mừng
Đón mùa xuân và một năm mới
Đêm giao thừa năm nay nếu mẹ ko ngờ
Là con thấy yêu mẹ thiết tha
Mặc dù trái tim con sống cách xa mẹ
Chân ân tình con với mẹ vẫn sẻ chia
Nhưng trong hôm nay con từng ngày vẫn muốn biết
Mẹ ơi ,có hạnh phúc không?

Gửi bài ca bài này đi theo làn gió
Nếu mà mẹ được nghe mẹ hãy đừng lo
Con ở bên này vẫn khỏe thoải mái
Bước tiếp bằng trái tim dũng cảm
Sẽ chăm chỉ học hỏi tiến tới kiến thức
Con sẽ thành người tốt cho mẹ hạnh phúc
Tuy rất khó khăn,và rất gian khổ 
Luôn vượt qua chẳng sợ điều chi
Đều dành cho mẹ yêu thương!!





*/ Mẹ...........con sẽ Cố Gắng ........*/
                                        Con trai: ...ĐMT...... 

Read Users' Comments (0)

Ý nghĩa , cách dùng private: và public: trong Class


Ý nghĩa , cách dùng private: và public: trong Class :
"---------------------------------------------------------------"
Các lớp cho phép lập trình viên mô hình các đối tượng mà có các thuộc tính (biểu diễn như các thành viên dữ liệu – Data members) và các hành vi hoặc các thao tác (biểu diễn như các hàm thành viên – Member functions). Các kiểu chứa các thành viên dữ liệu và các hàm thành viên được định nghĩa thông thường trong C++ sử dụng từ khóa class, có cú pháp như sau:


class <class-name>
{



<member-list> //Thân của lớp

};
Trong đó:



class-name: tên lớp.
member-list: đặc tả các thành viên dữ liệu và các hàm thành viên.

Các hàm thành viên đôi khi được gọi là các phương thức (methods) trong các ngôn ngữ lập trình hướng đối tượng khác, và được đưa ra trong việc đáp ứng các message gởi tới một đối tượng. Một message tương ứng với việc gọi hàm thành viên.
Khi một lớp được định nghĩa, tên lớp có thể được sử dụng để khai báo đối tượng của lớp theo cú pháp sau:



<class-name> <object-name>;

Chẳng hạn, cấu trúc Time sẽ được định nghĩa dưới dạng lớp như sau:



class Time
{
public:
Time();
void SetTime(int, int, int)
void PrintMilitary();
void PrintStandard()
private:
int Hour; // 0 - 23
int Minute; // 0 - 59
int Second; // 0 - 59
};

Trong định nghĩa lớp Time chứa ba thành viên dữ liệu là Hour, Minute Second, và cũng trong lớp này, chúng ta thấy các nhãn publicprivate được gọi là các thuộc tính xác định truy cập thành viên (member access specifiers) gọi tắt là thuộc tính truy cập.
Bất kỳ thành viên dữ liệu hay hàm thành viên khai báo sau public có thể được truy cập bất kỳ nơi nào mà chương trình truy cập đến một đối tượng của lớp. Bất kỳ thành viên dữ liệu hay hàm thành viên khai báo sau private chỉ có thể được truy cập bởi các hàm thành viên của lớp. Các thuộc tính truy cập luôn luôn kết thúc với dấu hai chấm (:) và có thể xuất hiện nhiều lần và theo thứ tự bất kỳ trong định nghĩa lớp. Mặc định thuộc tính truy cập là private.

Định nghĩa lớp chứa các prototype của bốn hàm thành viên sau thuộc tính truy cập public Time(), SetTime(), PrintMilitary() và PrintStandard(). Đó là các hàm thành viên public (public member function) hoặc giao diện (interface) của lớp. Các hàm này sẽ được sử dụng bởi các client (nghĩa là các phần của một chương trình mà là các người dùng) của lớp xử lý dữ liệu của lớp. Có thể nhận thấy trong định nghĩa lớp Time, hàm thành viên Time() có cùng tên với tên lớp Time, nó được gọi là hàm xây dựng (constructor function) của lớp Time.
Một constructor là một hàm thành viên đặc biệt mà khởi động các thành viên dữ liệu của một đối tượng của lớp. Một constructor của lớp được gọi tự động khi đối tượng của lớp đó được tạo.
Thông thường, các thành viên dữ liệu được liệt kê trong phần private của một lớp, còn các hàm thành viên được liệt kê trong phần public. Nhưng có thể có các hàm thành viên private và thành viên dữ liệu public.
Khi lớp được định nghĩa, nó có thể sử dụng như một kiểu trong phần khai báo như sau:



Time Sunset, // Đối tượng của lớp Time
ArrayTimes[5], // Mảng các đối tượng của lớp Time
*PTime, // Con trỏ trỏ đến một đối tượng của lớp Time
&DinnerTime = Sunset; // Tham chiếu đến một đối tượng của lớp Time

Ví dụ 3.2: Xây dựng lại lớp Time ví dụ 3.1





1: #include <iostream.h>

2:
3: class Time
4: {
5:    public:
6:    Time();  //Constructor
7:    void SetTime(int, int, int); //Thiết lập Hour, Minute va Second
8:    void PrintMilitary(); //In thời gian dưới dạng giờ quân đội
9:    void PrintStandard(); //In thời gian dưới dạng chuẩn
10:   private:
11:   int Hour; // 0 - 23
12:   int Minute; // 0 - 59
13:   int Second; // 0 - 59
14: };
15:
16: //Constructor khởi tạo mỗi thành viên dữ liệu với giá trị zero
17: //Bảo đảm tất cả các đối tượng bắt đầu ở một trạng thái thích hợp
18: Time::Time()
19: {
20: Hour = Minute = Second = 0;
21: }
22:
23: //Thiết lập một giá trị Time mới sử dụng giờ quânđội
24: //Thực hiện việc kiểm tra tính hợp lệ trên các giá trị dữ liệu
25: //Thiết lập các giá trị không hợp lệ thành zero
26: void Time::SetTime(int H, int M, int S)
27: {
28:    Hour = (H >= 0 && H < 24) ? H : 0;
29:    Minute = (M >= 0 && M < 60) ? M : 0;
30:    Second = (S >= 0 && S < 60) ? S : 0;
31: }
32:
33: //In thời gian dưới dạng giờ quân đội
34: void Time::PrintMilitary()
35: {
36:    cout << (Hour < 10 ? "0" : "") << Hour << ":"
37:         << (Minute < 10 ? "0" : "") << Minute << ":"
38:         << (Second < 10 ? "0" : "") << Second;
39: }
40:
41: //In thời gian dưới dạng chuẩn
42: void Time::PrintStandard()
43: {
44:    cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12)
44:         << ":" << (Minute < 10 ? "0" : "") << Minute
45:         << ":" << (Second < 10 ? "0" : "") << Second
46:         << (Hour < 12 ? " AM" : " PM");
48: }
49:
50: int main()
51: {
52:    Time T; //Đối tượng T của lớp Time
53:
54:    cout << "The initial military time is ";
55:    T.PrintMilitary();
56:    cout << endl << "The initial standard time is ";
57:    T.PrintStandard();
58:
59:    T.SetTime(13, 27, 6);
60:    cout << endl << endl << "Military time after SetTime is ";
61:    T.PrintMilitary();
62:    cout << endl << "Standard time after SetTime is ";
63:    T.PrintStandard();
64:
65:    T.SetTime(99, 99, 99); //Thử thiết lập giá trị không hợp lệ
66:    cout << endl << endl << "After attempting invalid settings:"
67:          << endl << "Military time: ";
68:    T.PrintMilitary();
69:    cout << endl << "Standard time: ";
70:    T.PrintStandard();
71:    cout << endl;
72:    return 0;
73: }
Chúng ta chạy ví dụ 3.2, kết quả ở hình 3.2


Hình 3.2: Kết quả của ví dụ 3.2
Trong ví dụ 3.2, chương trình thuyết minh một đối tượng của lớp Time gọi là T (dòng 52). Khi đó constructor của lớp Time tự động gọi và rõ ràng khởi tạo mỗi thành viên dữ liệu private là zero. Sau đó thời gian được in dưới dạng giờ quân đội và dạng chuẩn để xác nhận các thành viên này được khởi tạo thích hợp (dòng 54 đến 57). Kế tới thời gian được thiết lập bằng cách sử dụng hàm thành viên SetTime() (dòng 59) và thời gian lại được in ở hai dạng (dòng 60 đến 63). Cuối cùng hàm thành viên SetTime() (dòng 65) thử thiết lập các thành viên dữ liệu với các giá trị không hợp lệ, và thời gian lại được in ở hai dạng (dòng 66 đến 70).
Chúng ta nhận thấy rằng, tất cả các thành viên dữ liệu của một lớp không thể khởi tạo tại nơi mà chúng được khai báo trong thân lớp. Các thành viên dữ liệu này phải được khởi tạo bởi constructor của lớp hay chúng có thể gán giá trị bởi các hàm thiết lập.
Khi một lớp được định nghĩa và các hàm thành viên của nó được khai báo, các hàm thành viên này phải được định nghĩa. Mỗi hàm thành viên của lớp có thể được định nghĩa trực tiếp trong thân lớp (hiển nhiên bao gồm prototype hàm của lớp), hoặc hàm thành viên có thể được định nghĩa sau thân lớp. Khi một hàm thành viên được định nghĩa sau định nghĩa lớp tương ứng, tên hàm được đặt trước bởi tên lớp và toán tử định phạm vi (::). Chẳng hạn như ở ví dụ 3.2 gồm các dòng 18, 26, 34 và 42. Bởi vì các lớp khác nhau có thể có các tên thành viên giống nhau, toán tử định phạm vi "ràng buộc" tên thành viên tới tên lớp để nhận dạng các hàm thành viên của một lớp.
Mặc dù một hàm thành viên khai báo trong định nghĩa một lớp có thể định nghĩa bên ngoài định nghĩa lớp này, hàm thành viên đó vẫn còn bên trong phạm vi của lớp, nghĩa là tên của nó chỉ được biết tới các thành viên khác của lớp ngoại trừ tham chiếu thông qua một đối tượng của lớp, một tham chiếu tới một đối tượng của lớp, hoặc một con trỏ trỏ tới một đối tượng của lớp.
Nếu một hàm thành viên được định nghĩa trong định nghĩa một lớp, hàm thành viên này chính là hàm inline. Các hàm thành viên định nghĩa bên ngoài định nghĩa một lớp có thể là hàm inline bằng cách sử dụng từ khóa inline.
Hàm thành viên cùng tên với tên lớp nhưng đặt trước là một ký tự ngã (~) được gọi là destructor của lớp này. Hàm destructor làm "công việc nội trợ kết thúc" trên mỗi đối tượng của lớp trước khi vùng nhờ cho đối tượng được phục hồi bởi hệ thống.
Ví dụ 3.3: Lấy lại ví dụ 3.2 nhưng hai hàm PrintMilitary() và PrintStandard() là các hàm inline.




1: #include <iostream.h>

2:
3: class Time
4: {
5: public:
6: Time(); ; //Constructor
7: void SetTime(int, int, int); // Thiết lập Hour, Minute va Second
8: void PrintMilitary() // In thời gian dưới dạng giờ quânđội
9: {
10: cout << (Hour < 10 ? "0" : "") << Hour << ":"
11:          << (Minute < 10 ? "0" : "") << Minute << ":"
12:          << (Second < 10 ? "0" : "") << Second;
13: }
14: void PrintStandard(); // In thời gian dưới dạng chuẩn
15: private:
16: int Hour; // 0 - 23
17: int Minute; // 0 - 59
18: int Second; // 0 - 59
19: };
20: //Constructor khởi tạo mỗi thành viên dữ liệu với giá trị zero


21: //Bảo đảm tất cả các đối tượng bắt đầu ở một trạng thái thích hợp

22: Time::Time()
23: {
24: Hour = Minute = Second = 0;
25: }
26:
27: #9; //Thiết lập một giá trị Time mới sử dụng giờ quân đội
28: #9; //Thực hiện việc kiểm tra tính hợp lệ trên các giá trị dữ liệu
29: #9; //Thiết lập các giá trị không hợp lệ thành zero
30: void Time::SetTime(int H, int M, int S)
31: {
32: Hour = (H >= 0 && H < 24) ? H : 0;
33: Minute = (M >= 0 && M < 60) ? M : 0;
34: Second = (S >= 0 && S < 60) ? S : 0;
35: }
36:
37: #9; //In thời gian dưới dạng chuẩn
38: inline void Time::PrintStandard()
39: {
40: cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12)
41:       << ":" << (Minute < 10 ? "0" : "") << Minute
42:       << ":" << (Second < 10 ? "0" : "") << Second
43: << (Hour < 12 ? " AM" : " PM");
44: }
45:
46: int main()
47: {
48: Time T;
49:
50: cout << "The initial military time is ";
51: T.PrintMilitary();
52: cout << endl << "The initial standard time is ";
53: T.PrintStandard();
54:
55: T.SetTime(13, 27, 6);
56: cout << endl << endl << "Military time after SetTime is ";
57: T.PrintMilitary();
58: cout << endl << "Standard time after SetTime is ";
59: T.PrintStandard();
60:
61: T.SetTime(99, 99, 99); //Thử thiết lập giá trị không hợp lệ
62: cout << endl << endl << "After attempting invalid settings:"
63:       << endl << "Military time: ";
64: T.PrintMilitary();
65: cout << endl << "Standard time: ";
66: T.PrintStandard();
67: cout << endl;
68: return 0;
69: }


chúc các bạn thành công !
>. <
manhtuan.leo@gmail.com




Các thuộc tính truy cập public private (và protected chúng ta sẽ xem xét sau) được sử dụng đđiều khiển truy cập tới các thành viên dữ liệu và các hàm thành viên của lớp. Chế độ truy cập mặc định đối với lớp là private vì thế tất cả các thành viên sau phần header của lớp và trước nhãn đầu tiên là private. Sau mỗi nhãn, chế độ mà được kéo theo bởi nhãn đó áp dụng cho đến khi gặp nhãn kế tiếp hoặc cho đến khi gặp dấu móc phải (}) của phần định nghĩa lớp. Các nhãn public, private protected có thể được lặp lại nhưng cách dùng như vậy thì hiếm có và có thể gây khó hiểu.
Các thành viên private chỉ có thể được truy cập bởi các hàm thành viên (và các hàm friend) của lớp đó. Các thành viên public của lớp có thể được truy cập bởi bất kỳ hàm nào trong chương trình.
Mục đích chính của các thành viên public để biểu thị cho client của lớp một cái nhìn của các dịch vụ (services) mà lớp cung cấp. Tập hợp này của các dịch vụ hình thành giao diện public của lớp. Các client của lớp không cần quan tâm làm thế nào lớp hoàn thành các thao tác của nó. Các thành viên private của lớp cũng như các định nghĩa của các hàm thành viên public của nó thì không phải có thể truy cập tới client của một lớp. Các thành phần này hình thành sự thi hành của lớp.
Ví dụ 3.5: Chương trình sau cho thấy rằng các thành viên private chỉ có thể truy cập thông qua giao diện public sử dụng các hàm thành viên public.

1: #include <iostream.h>
2:
3: class MyClass
4: {
5: private:
6: int X,Y;
7: public:
8: void Print();
9: };
10:
11: void MyClass::Print()
12: {
13: cout <<X<<Y<<endl;
14: }
15:
16: int main()
17: {
18: MyClass M;
19:
20: M.X = 3; //Error: 'MyClass::X' is not accessible
21: M.Y = 4; //Error: 'MyClass::Y' is not accessible
22: M.Print();
23: return 0;
24: } 

Khi chúng ta biên dịch chương trình này, compiler phát sinh ra hai lỗi tại hai dòng 20 và 21 như sau:





Hình 3.5: Thông báo lỗi của ví dụ 3.5
Thuộc tính truy cập mặc định đối với các thành viên của lớp là private. Thuộc tính truy cập các thành viên của một lớp có thể được thiết lập rõ ràng là public, protected hoặc private. Thuộc tính truy cập mặc định đối với các thành viên của struct public. Thuộc tính truy cập các thành viên của một struct cũng có thể được thiết lập rõ ràng là public, protected hoặc private.
Truy cập đến một dữ liệu private cần phải được điều khiển cẩn thận bởi việc sử dụng của các hàm thành viên, gọi là các hàm truy cập (access functions). 

Read Users' Comments (2)

BT Về Lập trình hướng đối tượng (Mở đầu)

6. Xây dựng lớp hóa đơn gồm các thành phần:
-DL: mã vật tư, tên vật tư, loại phiếu, ngày lập, khối lượng, đơn giá, thành tiền
-Pt: nhập, in, kiểm tra phiếu nhập hay xuất
Hàm main:
-Nhập danh sách hóa đơn
-Tính thành tiền cho các hóa đơn và in tổng thành tiền
-In danh sách sau khi xếp theo số tiền giảm dần 

Code:
#include <iostream.h>
#include <conio.h>

class date
{
public:
int ngay;
int thang;
int nam;
};
class HD
{
 private:
int ma;
char *ten;
char *loai;
date nn;
float kl;
float dg;
 public:
HD()
{
 ten = new char[30];
 loai = new char[10];
 ma = 0;
 nn.ngay = 0;
 nn.thang =0;
 nn.nam=0;
 kl = 0;
 dg = 0;
 }
 ~HD()
 {
delete ten;
delete loai;
}

float tt()

{
return kl*dg;
}



friend istream& operator>>(istream& is,HD &x)
{

cout<<"nhap ma sp: ";is>>x.ma;
is.ignore();
cout<<"Ten : ";is.getline(x.ten,30);
cout<<"loai : ";is.getline(x.loai,10);
cout<<"Ngay lap :"; is>>x.nn.ngay>>x.nn.thang>>x.nn.nam;
cout<<"khoi luong: ";is>>x.kl;
cout<<"don gia: ";is>>x.dg;
return is;
}


friend ostream& operator<<(ostream& os,HD &x)
{
 os<<x.ma<<"\t"<<x.ten<<"\t"<<x.loai<<"\t"<<x.nn.ngay<<"/"<<x.nn.thang<<"/"<<x.nn.nam<<"\t"<<x.kl<<"\t"<<x.dg<<"\t"<<x.tt();
 return os;
 }
};

void main()
{
int n;
HD temp;
HD *p;
cout<<"Nhap so sp : ";cin>>n;
p  = new HD[n+1];
for (int i=1;i<=n;i++)
 {
cout<<"Nhap sp thu "<<i<<": \n";
cin>>p[i];
 p[i].tt();
 }
for (i=1;i<n;i++)
 for (int j=i+1;j<=n;j++)
  if (p[j].tt()>p[i].tt())
{
temp = p[j];
p[j]=p[i];
p[i]=temp;
}
 cout<<"======================Hoa Don Thanh toan====================\n";
 for (int j=1;j<=n;j++)
 {
cout<<p[j];
cout<<"\n";
}
}

Read Users' Comments (0)

Support

Liên hệ DMTuan-Uneti
Mọi thông tin góp ý các bạn liên hệ với mình ! Mail:
  1. manhtuan.leo@gmail.com
  2. manhtuan.itvp@gmail.com

Y!M: manhtuan.it92