Bộ chỉ định quyền truy cập C ++

C Access Specifiers



Trong C ++, một lớp là một tập hợp các biến và hàm đã được cấu hình để hoạt động cùng nhau. Khi các biến của lớp là các giá trị đã cho, một đối tượng sẽ thu được. Một đối tượng có các biến và chức năng giống như một lớp, nhưng lần này, các biến có giá trị. Nhiều đối tượng có thể được tạo từ một lớp. Một đối tượng khác với đối tượng khác theo tập giá trị khác nhau được gán cho các biến của đối tượng kia. Tạo một đối tượng từ một lớp được cho là khởi tạo đối tượng. Ngay cả khi hai đối tượng khác nhau có cùng giá trị cho các biến của chúng, các đối tượng này là các thực thể khác nhau, được xác định bằng các tên khác nhau trong chương trình. Các biến cho một đối tượng và lớp tương ứng của nó được gọi là thành viên dữ liệu. Các chức năng của một đối tượng và lớp tương ứng của nó được gọi là các hàm thành viên. Các thành viên dữ liệu và các chức năng thành viên được gọi là thành viên.

Từ truy cập có nghĩa là đọc hoặc thay đổi giá trị của một biến, và nó cũng có nghĩa là sử dụng một hàm. Các chỉ định truy cập C ++ là các từ, riêng tư, bảo vệ và công khai. Họ quyết định liệu một thành viên có thể truy cập các thành viên khác trong lớp của nó hay không, hoặc nếu một hàm hoặc toán tử bên ngoài lớp và không thuộc lớp đó có thể truy cập bất kỳ thành viên nào của lớp đó hay không. Họ cũng quyết định liệu một thành viên của lớp dẫn xuất (con) có thể truy cập vào thành viên của lớp cha hay không.







Cần phải có kiến ​​thức cơ bản về C ++ để hiểu bài viết này và để kiểm tra mã được cung cấp.



Nội dung bài viết

Các chỉ số Công khai và Riêng tư

Lớp
Bất kỳ thành viên nào của một lớp đều có thể truy cập bất kỳ thành viên nào khác của cùng lớp đó, độc lập với thành viên đó được dán nhãn công khai hoặc riêng tư. Hãy xem xét chương trình sau:



#bao gồm
sử dụng không gian têngiờ;

lớpTheCla
{
riêng:
NSnum1;
NSnum2;
công cộng:
TheCla(NSn1,NSn2)
{
num1=n1;num2=n2;
}
NSphương pháp()
{
trở lạinum1;
}
};

NSchủ chốt()
{
TheCla obj(10,hai mươi);
NSno2=phản đối.phương pháp();
Giá cả<<no2<<' ';

// int no1 = obj.num1;

trở lại 0;
}

Đầu ra là 10. Các thành viên private là num1 và num2. Các thành viên chung là TheCla () và method (). Lưu ý rằng TheCla () là hàm khởi tạo khởi tạo các biến quan tâm. Vùng của mã định nghĩa truy cập bắt đầu từ nhãn của nó đến cuối mô tả lớp (định nghĩa) hoặc đến đầu của mã định nghĩa truy cập khác.





Trong hàm main (), câu lệnh đầu tiên là phần khởi tạo liên quan đến hàm khởi tạo, nó khởi tạo num1 và num2. Câu lệnh tiếp theo gọi thành viên công khai, phương thức (), của lớp.

Bây giờ, trong mô tả lớp (định nghĩa), hàm thành viên công khai, TheCla (), truy cập vào các thành viên private, num1 và num2. Ngoài ra, hàm thành viên công khai, method (), truy cập thành viên private, num1. Bất kỳ thành viên nào trong mô tả lớp đều có thể truy cập bất kỳ thành viên nào khác trong cùng mô tả lớp đó; không quan trọng thành viên nào là riêng tư hay công khai.



Tuy nhiên, một hàm hoặc toán tử không được khai báo trong mô tả lớp và bên ngoài mô tả lớp chỉ có thể truy cập các thành viên công khai của lớp. Ví dụ, hàm main () là một hàm được khai báo bên ngoài mô tả lớp. Nó chỉ có thể truy cập method () và các thành viên public của TheCla (). Bên trong hàm main (), hàm TheCla () là obj (10, 20).

Một hàm bên ngoài hoặc toán tử bên ngoài, chẳng hạn như hàm main (), không thể truy cập bất kỳ thành viên riêng tư nào của lớp, chẳng hạn như num1 hoặc num2. Xóa chỉ báo nhận xét, //, khỏi câu lệnh cuối cùng nhưng một trong hàm main (). Nếu bạn cố gắng biên dịch chương trình, hãy lưu ý rằng chương trình sẽ không biên dịch, đưa ra thông báo lỗi.

Bộ định danh mặc định
Thông số kỹ thuật mặc định cho một lớp là riêng tư. Vì vậy, mô tả lớp ở trên giống với mô tả sau, riêng tư, nhưng không có mã xác định:

lớpTheCla
{
NSnum1;
NSnum2;
công cộng:
TheCla(NSn1,NSn2)
{
num1=n1;num2=n2;
}
NSphương pháp()
{
trở lạinum1;
}
};

Ghi chú : nhãn bộ chỉ định truy cập bắt đầu bằng bộ xác định, sau đó được theo sau bởi dấu hai chấm.

Bộ chỉ định được bảo vệ

Trong một mô tả lớp, và từ một hàm bên ngoài hoặc toán tử bên ngoài, bộ chỉ định được bảo vệ giống với bộ chỉ định riêng. Bây giờ, hãy thay thế trình chỉ định riêng trong chương trình trên bằng trình chỉ định, bảo vệ và loại bỏ chỉ báo nhận xét, //, khỏi câu lệnh cuối cùng nhưng một trong hàm main (). Nếu bạn cố gắng biên dịch chương trình, hãy lưu ý rằng chương trình sẽ không biên dịch, đưa ra thông báo lỗi.

Vấn đề của bộ chỉ định được bảo vệ xuất hiện khi các thành viên của lớp dẫn xuất (kế thừa) phải truy cập vào các thành viên của lớp cơ sở (cha).

Lớp có nguồn gốc công khai với các thành viên công khai
Hãy xem xét chương trình sau:

#bao gồm
sử dụng không gian têngiờ;

lớpTheCla
{
công cộng:
NSnum1= 10;
được bảo vệ:
NSnum2= hai mươi;
riêng:
NSnum3= 30;
};

lớpChildCla: công cộngTheCla
{
công cộng:
NSmethod1()
{
trở lạinum1;
}
NSmethod2()
{
trở lạinum2;
}
/ * int method3 ()
{
trả về num3;
} * /

};

NSchủ chốt()
{
ChildCla childObj;
NSno1=childObj.method1();
Giá cả<<no1<<' ';

NSno2=childObj.method2();
Giá cả<<no2<<' ';

trở lại 0;
}

Đầu ra là:
10
hai mươi

Trong lớp cơ sở, num1 là công khai, num2 được bảo vệ và num3 là riêng tư. Trong lớp dẫn xuất, tất cả các hàm thành viên là công khai. Hàm đầu tiên, method1 (), truy cập thành viên dữ liệu công khai, num1. Hàm thứ hai, method2 (), truy cập thành viên dữ liệu được bảo vệ, num2. Hàm thứ ba, method3 (), mặc dù hiện đã được chú thích, nên truy cập vào thành viên dữ liệu riêng tư, num3.

Một lớp dẫn xuất không được khai báo nếu không có bộ chỉ định truy cập (công khai, được bảo vệ hoặc riêng tư). Ở trên, lớp dẫn xuất được khai báo với trình chỉ định công khai, đó là:

lớpChildCla: công cộngTheCla{}

Bây giờ bỏ nhận xét định nghĩa hàm thành viên thứ ba trong lớp dẫn xuất. Nếu bạn cố gắng biên dịch chương trình, hãy lưu ý rằng nó sẽ không biên dịch, đưa ra thông báo lỗi.

Ghi chú : Khi toàn bộ lớp dẫn xuất được khai báo là public, các thành viên của nó không thể truy cập các thành viên private của lớp cơ sở. Tuy nhiên, các thành viên của nó có thể truy cập công khai và các thành viên được bảo vệ của lớp cơ sở. Chương trình trên minh họa điều này.

Tuy nhiên, lưu ý rằng một thành viên công khai của lớp dẫn xuất công khai có thể truy cập thành viên được bảo vệ của lớp cơ sở.

Bộ chỉ định lớp và Bộ chỉ định thành viên có nguồn gốc

Lớp có nguồn gốc được bảo vệ với các thành viên công khai
Thay thế công cụ chỉ định công khai bằng bảo vệ trong khai báo của lớp dẫn xuất ở trên, như sau:

lớpChildCla: được bảo vệTheCla{}

Biên dịch và chạy chương trình và lưu ý rằng kết quả vẫn giống như trước.

Vì vậy, khi toàn bộ lớp dẫn xuất được khai báo là bảo vệ, các thành viên của nó không thể truy cập vào các thành viên riêng của lớp cơ sở. Tuy nhiên, các thành viên của nó có thể truy cập công khai và các thành viên được bảo vệ của lớp cơ sở. Điều này cũng giống như khi lớp dẫn xuất được khai báo là public.

Ghi chú : một thành viên được bảo vệ của lớp dẫn xuất công khai có thể truy cập vào một thành viên được bảo vệ của lớp cơ sở.

Lớp học có nguồn gốc riêng tư với các thành viên công khai
Thay thế thông số được bảo vệ bằng private trong khai báo của lớp dẫn xuất ở trên, như sau:

lớpChildCla: riêngTheCla{}

Biên dịch và chạy chương trình và lưu ý rằng kết quả vẫn giống như trước.

Vì vậy, khi toàn bộ lớp dẫn xuất được khai báo là private, các thành viên của nó không thể truy cập các thành viên private của lớp cơ sở. Tuy nhiên, các thành viên của nó có thể truy cập công khai và các thành viên được bảo vệ của lớp cơ sở. Điều này cũng giống như khi lớp dẫn xuất được khai báo là bảo vệ hoặc công khai.

Lớp có nguồn gốc công khai với các thành viên được bảo vệ
Nhập, biên dịch và chạy chương trình sau, trong đó toàn bộ lớp dẫn xuất được bảo vệ và các thành viên của nó cũng được bảo vệ. Một số đoạn mã như sau:

#bao gồm
sử dụng không gian têngiờ;

lớpTheCla
{
công cộng:
NSnum1= 10;
được bảo vệ:
NSnum2= hai mươi;
riêng:
NSnum3= 30;
};

lớpChildCla: công cộngTheCla
{
được bảo vệ:
NSmethod1()
{
trở lạinum1;
}
NSmethod2()
{
trở lạinum2;
}
/ * int method3 ()
{
trả về num3;
} * /

};

NSchủ chốt()
{
/ * ChildCla childObj;
int no1 = childObj.method1 ();
Giá cả<
/ * int no2 = childObj.method2 ();
Giá cả<
trở lại 0;
}

Chương trình hoạt động như nó vốn có. Không có đầu ra và không được cho là có bất kỳ đầu ra nào, dựa trên cách chương trình đã được gõ.

Bây giờ, hãy bỏ chú thích định nghĩa hàm, method3 (), trong lớp dẫn xuất. Nếu bạn cố gắng biên dịch chương trình, hãy lưu ý rằng nó sẽ không biên dịch, đưa ra thông báo lỗi. Điều này có nghĩa là một thành viên riêng không thể được truy cập từ một hàm bên ngoài, toán tử bên ngoài hoặc lớp dẫn xuất. Đây là kết luận tương tự như đã kết luận ở trên, liên quan đến quyền truy cập vào một thành viên riêng.

Ghi chú : một thành viên được bảo vệ của lớp dẫn xuất được bảo vệ có thể truy cập vào một thành viên được bảo vệ của lớp cơ sở.

Bây giờ, đặt các nhận xét trở lại lớp dẫn xuất và bỏ nhận xét đoạn mã đầu tiên trong hàm main (). Nếu bạn cố gắng biên dịch chương trình, hãy lưu ý rằng chương trình sẽ không biên dịch do đoạn mã đầu tiên trong hàm main (). Hiệu ứng này không phải là mới. Ngoài lớp dẫn xuất, các hàm bên ngoài và các toán tử bên ngoài, các thành viên được bảo vệ và riêng tư của một lớp (cơ sở hoặc dẫn xuất) có cùng định nghĩa, riêng tư. Hàm main () xem thành viên được bảo vệ của bất kỳ lớp nào, dù là cơ sở hay dẫn xuất, của cùng một trình xác định, private và bị cấm truy cập vào nó.

Nếu đoạn mã thứ hai của hàm main () không được chú thích, giải thích tương tự sẽ được áp dụng. Nghĩa là, hàm main () sẽ không thể truy cập thành viên được bảo vệ hoặc riêng tư của lớp dẫn xuất hoặc của lớp cơ sở. Điều này độc lập với việc liệu một thành viên được bảo vệ của lớp dẫn xuất có thể truy cập vào một thành viên được bảo vệ của lớp cơ sở hay không.

Lớp có nguồn gốc được bảo vệ với các thành viên được bảo vệ
Thay thế công cụ chỉ định công khai bằng bảo vệ trong khai báo của lớp dẫn xuất ở trên, như sau:

lớpChildCla: được bảo vệTheCla{}

Đặt nhận xét của các đoạn mã trở lại hàm main (), nếu điều này chưa được thực hiện. Biên dịch và chạy chương trình và lưu ý rằng kết quả vẫn như trước.

Lớp học có nguồn gốc riêng tư với các thành viên được bảo vệ
Thay thế thông số được bảo vệ bằng private trong khai báo của lớp dẫn xuất ở trên, như sau:

lớpChildCla: riêngTheCla

Biên dịch và chạy chương trình và lưu ý rằng kết quả sẽ như trước.

Lớp có nguồn gốc công cộng với các thành viên riêng
Thay thế trình chỉ định private bằng public trong khai báo của lớp dẫn xuất ở trên, như sau:

lớpChildCla: công cộngTheCla{}

Đặt các thành viên của lớp dẫn xuất ở chế độ riêng tư. Biên dịch và chạy chương trình. Kết quả không khác với trường hợp Lớp có nguồn gốc Công cộng với Thành viên được Bảo vệ.

Lớp có nguồn gốc được bảo vệ với các thành viên riêng
Thay thế công cụ chỉ định công khai bằng bảo vệ trong khai báo của lớp dẫn xuất ở trên, như sau:

lớpChildCla: được bảo vệTheCla{}

Biên dịch và chạy chương trình. Kết quả này không khác gì với trường hợp Lớp có nguồn gốc được Bảo vệ với Thành viên được Bảo vệ.

Lớp học có nguồn gốc riêng với các thành viên riêng
Thay thế thông số được bảo vệ bằng private trong khai báo của lớp dẫn xuất ở trên, như sau:

lớpChildCla: riêngTheCla{}

Biên dịch và chạy chương trình. Kết quả này không khác gì so với trường hợp Lớp học có nguồn gốc riêng tư với Thành viên được bảo vệ.

Phần kết luận

Các chỉ định truy cập C ++ là các từ riêng tư, được bảo vệ và công khai. Họ quyết định quyền truy cập cho các thành viên của một lớp. Vùng của mã định danh truy cập bắt đầu từ nhãn của nó, đến cuối mô tả lớp (định nghĩa) hoặc đến đầu của mã định nghĩa truy cập khác. Bất kỳ thành viên nào của một lớp đều có thể truy cập bất kỳ thành viên nào khác của cùng lớp đó. Một thành viên riêng của một lớp không thể được truy cập bởi bất kỳ hàm bên ngoài nào, bất kỳ toán tử bên ngoài nào hoặc một lớp dẫn xuất.

Thành viên của lớp cơ sở phải được bảo vệ để một thành viên riêng của lớp cơ sở có thể được truy cập bởi một thành viên của lớp dẫn xuất. Thành viên được bảo vệ này của lớp cơ sở được xem như là một thành viên riêng của lớp cơ sở bởi một hàm bên ngoài hoặc một toán tử bên ngoài.

Thành viên công cộng của một lớp có thể được truy cập bởi bất kỳ hàm bên ngoài nào, bất kỳ toán tử bên ngoài nào hoặc một lớp dẫn xuất.

Trong trường hợp không có bất kỳ mã xác định truy cập nào trong một lớp, mã xác định riêng tư được giả định. Đó là, chỉ định truy cập mặc định là riêng tư.

Tài liệu tham khảo được sử dụng trong công việc này