C ++ 연구 노트 13 개 데이터 범위 및 수명

데이터 범위는 데이터의 유효한 영역입니다
. 데이터 범위에는 다음
함수 범위가 포함됩니다 .
더 간단한 것은 함수 의 형식 매개 변수입니다 . 선언함수 범위는 Have the와 같은 괄호 범위로 제한됩니다. 다음 코드

void show(int x);

선언에서 x의 범위는 대괄호로 제한됩니다. 컴파일러는 매개 변수 이름이 아닌 매개 변수 유형 만 확인하므로 선언에서 이름을 정의 할 수 없지만 편의를 위해 이름을 정의하는 것이 좋습니다. 독서의.
로컬 범위 :
함수 매개 변수에서 함수 본문의 끝까지 함수 매개 변수 목록의 범위입니다. 함수 본문에 선언 된 변수의 범위는 선언에서 시작하여 블록 끝의 중괄호에서 끝납니다. 소위 A 블록은 중괄호로 묶인 프로그램 섹션입니다. 특정 회로도는 다음 그림에 나와

있습니다. 그림에서 각 기능의 범위를 볼 수 있습니다.
클래스 범위 :
클래스는 명명 된 멤버의 집합으로 간주 될 수 있습니다. 클래스의 멤버가 공용 속성 인 경우
객체 이름과 멤버 이름 을 사용하여 클래스의 데이터 멤버에 액세스하거나 ptr을 통해 액세스 할 수 있습니다. -> 멤버 이름, 여기서 ptr은 클래스에 대한 포인터입니다. 또는 클래스 이름 :: 객체를 통해 액세스 할 수 있습니다. 요약하면 Xy 또는 X :: y의 두 가지 방법으로 액세스 할 수 있습니다.
네임 스페이스 범위 : 네임 스페이스
의 역할은 프로그램이 많은 모듈로 구성되어 있고 각 모듈의 이름이 같은 이름 일 가능성이 높기 때문에 같은 이름의 모호성을 방지하는 것이므로 모호성을 유발할 수 있으므로 네임 스페이스를 사용합니다. 같은 이름으로 인한 모호성을 방지하는 방법. C ++ j에서
std 네임 스페이스를 사용 하는 문장 자주 볼 수 있습니다 .이 문장은 std 네임 스페이스를 사용함을 의미합니다.이 문장이 추가되지 않은 경우 함수를 사용할 때
위에 std ::를 추가해야합니다. 데이터, 즉 함수 범위, 로컬 범위 및 클래스 범위, 네임 스페이스 범위, 다음은 식별자의 가시성을 설명합니다. ** 먼저 아래 그림과 같이 식별자가시성을 관찰합니다
식별자 범위
. 규칙은 내부 공간과 우주 공간은 같은 변수 명을 가지고 있지 않으며, 외부 공간의 변수는 내부 공간에서 접근이 가능하지만 내부 공간과 외부 공간의 변수 명이 같은 경우 외부 공간 변수는 차폐됩니다., 이러한 규칙은 다소 복잡 할 수 있으므로 공간 범위의 관계를 설명하는 예를 들어 보겠습니다.
구체적인 예제 코드는 다음과 같습니다.

# include <iostream>
namespace global {
    
    
	int i; //在命名空间global 中定义全局变量 i
}
int j;   //定义全局变量j
int main()
{
    
    
global::i = 2;//将全局变量=2
j = 3;

//块作用域
{
    
      

	//定义与全局作用域相同名字的变量测试是否会屏蔽
	int i = 4;
	std::cout << "i =" << i << std::endl;
	//输出j变量
	std::cout << "j =" << j << std::endl;


}
}

작업 결과는 다음과 같습니다.
범위 가시성
(네임 스페이스가있는 변수에는 전역 범위가 있습니다.)

다음은 데이터의 수명에 대한 설명
입니다.
객체 정적 수명의 수명은 프로그램 런타임과 동일합니다. 정적 수명이 있다고합니다. 함수 내에서 정적 수명을 가진 객체를 선언하려면, static 키워드를 사용해야합니다. 객체의 정적 수명 이후에는 객체가 복사되지 않고 함수 반환으로 무효화되지 않습니다. 즉, 함수가 객체를 반환 할 때 값이 다음 값이 호출 될 때 여전히 저장됩니다.
동적 수명 :
객체는 선언 시점에 생성되어 실행 된 블록이 완료되면 종료됩니다.
다음은 정적 함수 멤버의 예입니다.
클래스를 만들고 생성자와 복사 함수가 호출 될 때마다 계산합니다.

# include<iostream>
using namespace std;
class point
{
    
    
private:
	int x;
	int y;//非静态成员
	static int count;//静态数据成员的声明在类内,定义以及初始化要放在类外
public:
	point(int x, int y) :x(x), y(y) {
    
     cout << "calling construction " << endl; count++; }
	int getx() {
    
     return x; }
	int gety() {
    
     return y; }
	void show() {
    
     cout << "count is  " << count << endl; }
	//static  void show() { cout << "count is  " << count << endl; }
	point(point &s) {
    
    
		x = s.x;
		y = s.y;
		count++;
	}
	~point() {
    
     count--; }
};
int point::count = 0;//类外初始化定义
int main()
{
    
    
	point a(1, 2);
	a.show();
	point b(a);
	b.show();//count =2,因为前面已经构造了a,所以count=2



}

실행 결과는 다음과 같
여기에 사진 설명 삽입
으며 정적 데이터 멤버 수명이 프로그램 실행 시간과 동일하므로 두 번째 카운트의 출력이 2가되기 때문에 알 수 있습니다. 문제가 있는데, 클래스가없는 경우 현재 카운트 값을 확인하면 0이어야하지만 count는 private 멤버이므로 오브젝트 명과 멤버 명을 통해서만 접근 할 수 있습니다. 오브젝트가 정의되면, count ++이므로 직접 볼 수 없습니다. 정적 함수를 사용하여 해결할 수 있습니다.
정적 함수 비 정적 함수의 경우 어떤 객체가 호출되었는지 알고 있지만 정적 멤버 함수는 어떤 객체가 호출되었는지 알지 못하므로 정적 함수 멤버를 처리 할 수 ​​있습니다

. 비 정적 함수를 호출하여 관련 문제를 처리합니다.

추천

출처blog.csdn.net/qq_41803340/article/details/112724468