Phạm vi trong C ++

Scope C



Một thực thể trong C ++ có một tên, có thể được khai báo và / hoặc định nghĩa. Một khai báo là một định nghĩa, nhưng một định nghĩa không nhất thiết phải là một khai báo. Một định nghĩa cấp phát bộ nhớ cho thực thể được đặt tên, nhưng một khai báo có thể hoặc không thể cấp phát bộ nhớ cho thực thể được đặt tên. Vùng khai báo là phần lớn nhất của chương trình trong đó tên của một thực thể (biến) là hợp lệ. Vùng đó được gọi là phạm vi hoặc phạm vi tiềm năng. Bài viết này giải thích phạm vi trong C ++. Hơn nữa, kiến ​​thức cơ bản về C ++ là cần thiết để hiểu được bài viết này.

Nội dung bài viết

Khu vực và phạm vi khai báo

Vùng khai báo là phần lớn nhất của văn bản chương trình trong đó tên của một thực thể là hợp lệ. Đây là khu vực mà tên không đủ tiêu chuẩn có thể được sử dụng (nhìn thấy) để chỉ cùng một thực thể. Hãy xem xét chương trình ngắn sau:







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

vô hiệufn()
{
NSở đâu= 3;
nếu như (1==1)
{
Giá cả<<ở đâu<<' ';
}
}

NSchủ chốt()
{
fn();
trở lại 0;
}

Hàm fn () có hai khối: khối bên trong cho điều kiện if và khối bên ngoài cho phần thân hàm. Mã định danh, var, được giới thiệu và nhìn thấy trong khối bên ngoài. Nó cũng được nhìn thấy trong khối bên trong, với câu lệnh cout. Các khối bên ngoài và bên trong đều là phạm vi cho tên, var.



Tuy nhiên, tên, var, vẫn có thể được sử dụng để khai báo một thực thể khác, chẳng hạn như float trong khối bên trong. Đoạn mã sau minh họa điều này:



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

vô hiệufn()
{
NSở đâu= 3;
nếu như (1==1)
{
trôi nổiở đâu= 7,5;
Giá cả<<ở đâu<<' ';
}
}

NSchủ chốt()
{
fn();
trở lại 0;
}

Đầu ra là 7,5. Trong trường hợp này, tên, var, không còn có thể được sử dụng trong khối bên trong để tham chiếu đến số nguyên của giá trị 3, được đưa vào (khai báo) trong khối bên ngoài. Các khối bên trong như vậy được gọi là phạm vi tiềm năng cho các thực thể được khai báo trong khối bên ngoài.





Lưu ý: Một thực thể cùng loại, giống như của khối bên ngoài, vẫn có thể được khai báo trong khối bên trong. Tuy nhiên, trong trường hợp này, những gì hợp lệ trong khối bên trong là khai báo mới và ý nghĩa của nó, trong khi khai báo cũ và ý nghĩa của nó bên ngoài khối bên trong vẫn hợp lệ trong khối bên ngoài.

Khai báo cùng tên trong khối bên trong thường ghi đè khai báo cùng tên bên ngoài khối bên trong đó. Các khối bên trong có thể lồng các khối bên trong khác.



Phạm vi toàn cầu

Khi một lập trình viên chỉ bắt đầu nhập một tệp, đó là phạm vi toàn cục. Chương trình ngắn sau đây minh họa điều này:

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

trôi nổiở đâu= 9.4;

NSchủ chốt()
{
Giá cả <<ở đâu<<' ';
Giá cả <<::ở đâu<<' ';

trở lại 0;
}

Đầu ra là:
9.4
9.4

Trong trường hợp này, vùng hoặc phạm vi khai báo cho var bắt đầu từ điểm khai báo cho var, tiếp tục đi xuống cho đến cuối tệp (đơn vị dịch).

Khối của hàm main () là một phạm vi khác; nó là một phạm vi lồng nhau cho phạm vi toàn cầu. Để truy cập một thực thể của phạm vi toàn cục, từ một phạm vi khác, mã định danh được sử dụng trực tiếp hoặc đứng trước toán tử phân giải phạm vi, ::.

Lưu ý: Thực thể, main (), cũng được khai báo trong phạm vi toàn cục.

Phạm vi khối

Mỗi câu lệnh if, while, do, for hoặc switch có thể xác định một khối. Một câu lệnh như vậy là một câu lệnh ghép. Tên của một biến được khai báo trong một khối có phạm vi của khối. Phạm vi của nó bắt đầu từ điểm khai báo và kết thúc ở cuối khối của nó. Chương trình ngắn sau đây minh họa điều này cho biến, nhận dạng:

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

NSchủ chốt()
{
nếu như (1==1)
{
/ * một số câu lệnh * /
NSdanh tính= 5;
Giá cả<<danh tính<<' ';
/ * một số câu lệnh * /
}
trở lại 0;
}

Một biến, chẳng hạn như danh tính, được khai báo ở phạm vi khối là một biến cục bộ.

Một biến được khai báo bên ngoài phạm vi khối và ở trên nó có thể được nhìn thấy trong tiêu đề của khối (ví dụ: điều kiện cho if-block) và cả trong khối. Chương trình ngắn sau đây minh họa điều này cho biến, định danh:

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

NSchủ chốt()
{
NSnhận dạng= số 8;

nếu như (nhận dạng== số 8)
{
Giá cả<<nhận dạng<<' ';
}
trở lại 0;
}

Đầu ra là 8. Ở đây có hai phạm vi khối: khối cho hàm main () và câu lệnh ghép if lồng nhau. Khối lồng nhau là phạm vi tiềm năng của khối hàm main ().

Một khai báo được giới thiệu trong phạm vi khối không thể được nhìn thấy bên ngoài khối. Chương trình ngắn sau đây, không biên dịch, minh họa điều này bằng biến, variab:

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

NSchủ chốt()
{
nếu như (1 == 1)
{
NSvariab= mười lăm;
}
Giá cả<<variab<<' '; // error: được truy cập bên ngoài phạm vi của nó.

trở lại 0;
}

Trình biên dịch tạo ra một thông báo lỗi cho variab.

Một thực thể được giới thiệu, được khai báo trong tiêu đề của một hàm ghép, không thể nhìn thấy bên ngoài (bên dưới) câu lệnh ghép. Mã vòng lặp sau sẽ không biên dịch, dẫn đến thông báo lỗi:

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

NSchủ chốt()
{
(NStôi=0;tôi<4; ++tôi)
{
Giá cả<<tôi<<'';
}
Giá cả<<tôi<<'';

trở lại 0;
}

Biến lặp, i, được nhìn thấy bên trong khối vòng lặp for nhưng không nằm bên ngoài khối vòng lặp for.

Phạm vi chức năng

Một tham số chức năng được nhìn thấy trong khối chức năng. Một thực thể được khai báo trong một khối chức năng được nhìn thấy từ điểm khai báo đến cuối khối chức năng. Chương trình ngắn sau đây minh họa điều này:

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

chuỗi fn(chuỗi str)
{
charsọc[] = 'chuối';
/ * các câu lệnh khác * /
string totalStr=P+sọc;
trở lạitotalStr;
}

NSchủ chốt()
{
chuỗi totStr=fn('Ăn ');
Giá cả<<totStr<<' ';

trở lại 0;
}

Đầu ra là:
ăn chuối

Lưu ý: Một thực thể được khai báo bên ngoài hàm (ở trên nó) có thể được nhìn thấy trong danh sách tham số hàm và cả trong khối hàm.

Nhãn mác

Phạm vi của nhãn là chức năng mà nó xuất hiện. Đoạn mã sau minh họa điều này:

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

vô hiệufn()
{
đi đếnlabl;
/ * các câu lệnh khác * /
labl: NSkhông phải= 2;
Giá cả<<không phải<<' ';
}

NSchủ chốt()
{
fn();

trở lại 0;
}

Đầu ra là 2.

Phạm vi điều tra

Danh sách chưa được ghi lại
Hãy xem xét khối if sau:

nếu như (1==1)
{
enum {a, b, c=NS+2};
Giá cả<<đến<<''<<NS<<''<<NS<<' ';
}

Đầu ra là 0 1 3.

Dòng đầu tiên trong khối là một kiểu liệt kê, a, b và c là các kiểu liệt kê của nó. Phạm vi của điều tra viên bắt đầu từ điểm khai báo đến hết khối bao quanh của điều tra.

Câu lệnh sau sẽ không được biên dịch vì điểm khai báo của c nằm sau điểm khai báo của a:

enum {đến=NS+2, b, c};

Đoạn mã sau sẽ không biên dịch vì các điều tra viên được truy cập sau khối bao quanh của điều tra:

nếu như (1==1)
{
enum {a, b, c=NS+2};
}
Giá cả<<đến<<''<<NS<<''<<NS<<' '; // error: out of scope

Kiểu liệt kê trên được mô tả là kiểu liệt kê không có biên tập, và các điều tra viên của nó được mô tả là kiểu điều tra chưa được biên tập. Điều này là do nó chỉ bắt đầu bằng từ dành riêng, enum. Các kiểu liệt kê bắt đầu bằng lớp enum hoặc enum struct được mô tả là kiểu liệt kê có phạm vi. Điều tra viên của họ được mô tả là điều tra viên có phạm vi.

Liệt kê theo phạm vi
Câu lệnh sau là OK:

enum lớpnam{a, b, c=NS+2};

Đây là một ví dụ về cách liệt kê theo phạm vi. Tên của lớp là nam. Ở đây, phạm vi của điều tra viên bắt đầu từ điểm khai báo đến cuối định nghĩa liệt kê, và không phải kết thúc khối bao quanh cho phép liệt kê. Đoạn mã sau sẽ không biên dịch:

nếu như (1==1)
{
enum lớpnam{a, b, c=NS+2};
Giá cả<<đến<<''<<NS<<''<<NS<<' '; // error: out of scope đối với enum class hoặc enum struct
}

Phạm vi lớp học

Với phạm vi thông thường, vùng khai báo bắt đầu từ một điểm, sau đó tiếp tục và dừng lại ở một điểm khác. Phạm vi tồn tại trong một vùng liên tục. Với lớp, phạm vi của một thực thể có thể nằm trong các vùng khác nhau không được liên kết với nhau. Các quy tắc cho các khối lồng nhau vẫn được áp dụng. Chương trình sau đây minh họa điều này:

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

// Lớp cơ sở
lớpCla
{
riêng:
NSmemP= 5;
được bảo vệ:
NSmemPro= 9;
công cộng:
vô hiệufn()
{
Giá cả<<memP<<' ';
}
};

//Lớp có nguồn gốc
lớpDerCla: công cộngCla
{
công cộng:
NSderMem=memPro;
};
NSchủ chốt()
{
Cla obj;
phản đối.fn();
DerCla derObj;
Giá cả<<derObj.derMem<<' ';

trở lại 0;
}

Đầu ra là:
5
9

Trong lớp Cla, biến memP, được nhìn thấy tại điểm khai báo. Sau đó, phần ngắn của bảo vệ bị bỏ qua, sau đó được nhìn thấy lại trong khối chức năng thành viên của lớp. Lớp dẫn xuất bị bỏ qua, sau đó được nhìn thấy lại ở phạm vi (khối) hàm main ().

Trong lớp Cla, biến memPro, được nhìn thấy ở điểm khai báo. Phần của hàm công khai fn () bị bỏ qua, sau đó được nhìn thấy trong khối mô tả lớp dẫn xuất. Nó được nhìn thấy một lần nữa trong hàm main ().

Toán tử phân giải phạm vi
Toán tử phân giải phạm vi trong C ++ là ::. Nó được sử dụng để truy cập một thành viên tĩnh của lớp. Chương trình sau đây minh họa điều này:

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

lớpCla
{
công cộng:
tĩnh NS hăng sômem= 5;
công cộng:
tĩnh vô hiệufn()
{
Giá cả<<mem<<' ';
}
};
NSchủ chốt()
{
Giá cả<<Cla::mem<<' ';
Cla::fn();

trở lại 0;
}

Đầu ra là:
5
5

Các thành viên tĩnh được nhìn thấy trong khối hàm main (), được truy cập bằng toán tử phân giải phạm vi.

Phạm vi tham số mẫu

Phạm vi bình thường của tên tham số mẫu bắt đầu từ điểm khai báo đến cuối khối của nó, như trong đoạn mã sau:

bản mẫu<tên loạiNS,tên loạiU> cấu trúcLứa tuổi
{
T John= mười một;
Bạn Peter= 12.3;
T Mary= 13;
U Joy= 14,6;
};

U và T được nhìn thấy trong khối.

Đối với nguyên mẫu hàm mẫu, phạm vi bắt đầu từ điểm khai báo đến cuối danh sách tham số hàm, như trong câu lệnh sau:

bản mẫu<tên loạiNS,tên loạiU> vô hiệuhàm số(Bạn không, bạn không,hăng sô char *P);

Tuy nhiên, khi nói đến mô tả lớp (định nghĩa), phạm vi cũng có thể là các phần khác nhau như trong đoạn mã sau:

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

bản mẫu<lớpNS,lớpU> lớpTheCla
{
công cộng:
t num;
tĩnhU ch;

vô hiệuhàm số(U cha,hăng sô char *P)
{
Giá cả << 'Có ' <<trên một<< 'sách đáng giá' <<không<<P<< ' trong cửa hàng.' << ' ';
}
tĩnh vô hiệuniềm vui(U ch)
{
nếu như (ch== 'đến')
Giá cả << 'Chức năng thành viên tĩnh chính thức' << ' ';
}
};

NSchủ chốt()
{
TheCla<NS,char>phản đối;
phản đối.trên một = 12;
phản đối.hàm số('$','500');

trở lại 0;
}

Ẩn tên

Ví dụ về ẩn tên xảy ra khi tên của cùng một kiểu đối tượng được khai báo lại trong một khối lồng nhau. Chương trình sau đây minh họa điều này:

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

vô hiệufn()
{
NSở đâu= 3;
nếu như (1==1)
{
NSở đâu= 4;
Giá cả<<ở đâu<<' ';
}
Giá cả<<ở đâu<<' ';
}

NSchủ chốt()
{
fn();
trở lại 0;
}

Đầu ra là:
4
3

Đó là vì var trong khối lồng nhau đã ẩn var trong khối ngoài.

Khả năng lặp lại tuyên bố trong cùng một phạm vi

Điểm của khai báo là nơi tên được giới thiệu (lần đầu tiên) trong phạm vi của nó.

Nguyên mẫu hàm
Các thực thể khác nhau, thậm chí thuộc các kiểu khác nhau, thường không thể được khai báo trong cùng một phạm vi. Tuy nhiên, một nguyên mẫu hàm có thể được khai báo nhiều lần trong cùng một phạm vi. Chương trình sau với hai nguyên mẫu hàm và định nghĩa hàm tương ứng minh họa điều này:

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

vô hiệufn(NStrên một);
vô hiệufn(NStrên một);

vô hiệufn(NStrên một)
{
Giá cả<<trên một<<' ';
}

NSchủ chốt()
{
fn(5);

trở lại 0;
}

Chương trình hoạt động.

Các chức năng bị quá tải
Các hàm quá tải là các hàm có cùng tên nhưng chữ ký hàm khác nhau. Là một ngoại lệ khác, các hàm được nạp chồng có cùng tên có thể được định nghĩa trong cùng một phạm vi. Chương trình sau đây minh họa điều này:

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

vô hiệufn(NStrên một)
{
Giá cả<<trên một<<' ';
}

vô hiệufn(trôi nổikhông)
{
Giá cả<<không<<' ';
}

NSchủ chốt()
{
fn(5);
trôi nổiflt= 8.7;
fn(flt);

trở lại 0;
}

Đầu ra là:
5
8.7

Các hàm quá tải đã được xác định trong phạm vi toàn cục.

Phạm vi không gian tên

Phạm vi không gian tên xứng đáng với bài viết của riêng nó. Bài báo đã được viết cho trang web này, linuxhint.com. Chỉ cần gõ các từ tìm kiếm Phạm vi không gian tên vào hộp tìm kiếm của trang này (trang) và bấm OK, và bạn sẽ nhận được bài báo.

Phạm vi trong các phần khác nhau

Lớp không phải là lược đồ duy nhất mà phạm vi có thể nằm trong các phần khác nhau. Công cụ chỉ định bạn bè, một số cách sử dụng nhất định của công cụ chỉ định-loại-được xây dựng và chỉ thị sử dụng là các lược đồ khác mà phạm vi ở những nơi khác nhau - để biết chi tiết, hãy xem sau.

Phần kết luận

Phạm vi là một vùng khai báo. Vùng khai báo là phần lớn nhất của văn bản chương trình trong đó tên của một thực thể là hợp lệ. Nó có thể được chia thành nhiều phần phù hợp với các sơ đồ lập trình nhất định, chẳng hạn như các khối lồng nhau. Các phần không có điểm khai báo tạo thành phạm vi tiềm năng. Phạm vi tiềm năng có thể có hoặc không có phần khai báo.