C++의 const 및 정적 키워드(정의, 목적)

1. 정적의 정의와 사용

정적 함수: 변수 저장 방식 및 가시성 제어
1. 지역 변수 수정:
일반적으로 지역 변수는 프로그램의 스택 영역에 저장되며, 포함하는 명령문 블록이 실행되면 지역 수명주기가 종료됩니다. 수정하려면 static 키워드를 사용하세요. 지역 변수 마지막으로 변수는 정적 데이터 영역을 저장하며 해당 수명 주기는 전체 프로그램이 끝날 때까지 계속됩니다.
그러나 범위는 변경되지 않았으며 범위는 여전히 다른 문 블록으로 제한됩니다.
개인적 이해: static은 변수의 수명을 연장하는 지역 변수로 간주될 수 있는 지역 변수를 수정합니다(함수로 끝나는 것이 아니라 해제됩니다). 2.
전역 변수 수정:
전역 변수의 경우 액세스할 수 있습니다. 이 파일에 있으며 동일한 프로젝트의 다른 소스 파일에서도 액세스할 수 있습니다(선언을 위해 extern을 추가하기만 하면 됩니다). 전역 변수를 수정하기 위해 static을 사용하면 전체 프로젝트의 원래 가시성에서 이 파일의 가시성으로 범위가 변경됩니다.
3. 수정된 기능:
전역 변수와 마찬가지로 범위를 변경하고 이 파일로 사용을 제한합니다.
4. 수정된 클래스:
클래스에서 함수를 수정한다는 것은 해당 함수가 이 클래스의 객체가 아닌 클래스에 속한다는 것을 의미하며,
클래스에서 변수를 수정한다는 것은 해당 변수가 모든 객체의 소유이며 복사본이 하나만 있다는 것을 의미합니다. 저장 공간. 은 클래스와 객체를 통해 호출할 수 있습니다.
(보충: const가 아닌 정적 데이터 멤버는 클래스 외부에서만 정의하고 초기화할 수 있으며 클래스 내에서만 선언할 수 있습니다.)
샘플은 다음과 같습니다.

5: 클래스 멤버/클래스 함수 선언
함수 본문 내 정적 변수의 범위는 함수 본문입니다. 자동 변수와 달리 이 변수의 메모리는 한 번만 할당되므로 해당 값은 다음 번에도 마지막 값을 유지합니다. 모듈
정적 전역 변수는 모듈 내의 함수에 의해 액세스될 수 있지만 모듈 외부의 다른 함수에서는 액세스할 수 없습니다.
모듈 내의 정적 함수는 모듈 내의 다른 함수에 의해서만 호출될 수 있습니다. 이 함수의 사용 범위는 선언된 모듈 내로 제한됩니다.
클래스의 정적 멤버 변수는 전체 클래스가 소유하며 클래스의 모든 개체에 대한 복사본은 하나만 있습니다. 정적
멤버 클래스의 함수는 클래스 전체가 소유하며, 이 함수는 이 포인터를 받지 않으므로, 클래스의 정적 멤버 변수에만 접근할 수 있습니다. static 클래스 객체는 클래스 외부에서 초기화되어야 하며 static으로 수정된 변수는 객체 이전에 존재하므로 static으로 수정된 변수는 클래스 외부에서 초기화되어야 한다 static으로 수정된 클래스 멤버는 객체가 아닌 클래스에 속하므로 정적 클래스 멤버
함수 이 개체에 대한 포인터인 this 포인터가 없습니다. this 포인터가 없기 때문에 정적 클래스 멤버 함수는 비정적 클래스 멤버에 액세스할 수 없고 정적 수정 클래스 멤버에만 액세스할 수 있습니다. 정적 멤버 함수는 가상 클래스 멤버일 수 없습니다. 수정됨
. 정적 멤버는 어떤 개체나 인스턴스에도 속하지 않으므로 virtual을 추가하는 것은 실질적인 의미가 없습니다. 정적 멤버 함수에는 이 포인터가 없으며 가상 함수의 구현은 각 개체에 vptr 포인터를 할당하는 것이며 vptr은 다음을 통해 호출됩니다. this 포인터이므로 가상일 수 없습니다. 가상 함수의 호출 관계는 this->vptr->ctable->virtual function입니다.

class Person
{
    
    
public:
	Person(string name,int age)
	{
    
    
		this->m_name = name;
		this->m_age = age;
	}
  //静态函数
   	static void func()
	{
    
    
		//m_age = 50;   静态函数只能访问静态变量
		m_score = 99;
		cout << m_score << endl;
	}
  
	string m_name;
	int m_age;
   //静态成员变量   类内声明
	static int m_score; 
};

int Person::m_score = 100; //静态变量 类外初始化

int main()
{
    
    
	Person p1("张三" , 18);
	Person p2("李四", 20);

	cout << "成绩 " << p1.m_score << endl; //通过类对象访问
	p2.m_score = 80; //静态变量 只有一个副本,一个内存空间
	cout<< "成绩 " << p2.m_score << endl; 
  
  //静态函数调用
	Person::func();    // 通过类调用
	p1.func();         //通过类对象调用
 
	return 0;
}

2. const의 정의와 사용

const의 역할: 가독성 제한
1. const는 기본 데이터 유형을 수정합니다.
Const는 기본 데이터 유형 이전과 이후의 결과가 동일합니다. 이러한 상수를 사용하는 경우 상수의 값을 변경할 수 없습니다. const 수정자는 유형 지정자 앞이나 뒤에 사용될 수 있으며 결과는 동일합니다. 이러한 상수를 사용할 때 이러한 상수의 값을 변경하지 마십시오.

const int Max = 100;
int const Min = 1;

void demo()
{
    
    
	//Max = 110; 常量不可修改
	//Min = 2;   常量只读性
	cout << Max << Min << endl;
}

2. 포인터 변수와 참조 변수 수정
const가 *의 왼쪽에 있으면 const는 포인터가 가리키는 변수, 즉 포인터가 상수를 가리키는 변수를 수정합니다.

const가 *의 오른쪽에 있으면 const는 포인터 자체를 수정합니다. 즉, 포인터 자체는 상수입니다.

int a = 10, b = 20;

//使 指针指向常量   (指针指向可改 ,指向的值不可以更改)
const int* p1 = &a;  
p1 = &b;
//*p1 = 100;              错误用法

 //使 指针本身为常量  (指针指向不可改 ,指向的值可以更改)
int* const p2 = &b; 
//p2 = &a;              错误用法
*p2 = 100;


3. Const 는 전달된 매개변수가 함수 본문에서 변경되는 것을 방지하기 위해 일반 함수를 수정 하지만 이는 포인터와 참조에만 의미가 있습니다. 값으로 전달되면 매개변수에 전달되는 것은 실제 매개변수의 복사본일 뿐이기 때문에 함수 본문에서 형식 매개변수가 변경되더라도 실제 매개변수에는 영향을 미치지 않습니다. 좋다:

void func(const int i)
{
    
    
	//i = 10;  不能修改i
	cout << i << endl;
}

const에 의해 수정된 함수 매개변수가 포인터인 경우, 포인터가 가리키는 내용은 보호 역할을 하는 함수 본문에서 수정될 수 없음을 의미합니다.

void fun(const char * src, char * des)
{
    
      
  //保护源字符串不被修改,若修改src则编译出错。
	strcpy(des,src);
}

const 함수 반환 값 수정
const를 사용하여 반환된 포인터나 참조를 수정하여 포인터가 가리키는 내용이나 참조의 내용이 수정되지 않도록 보호합니다.

//const 修饰函数返回值 
const int* getNum(int* a)
{
    
    
	return a;
}

int a = 10;
auto ret= getNum(&a);
//ret = 20  返回值不能修改

4. 클래스에서 const 사용:
const 멤버 변수는 객체의 수명 주기 동안에만 상수입니다. 전체 수업으로 변경될 수 있습니다. 클래스는 여러 개체를 만들 수 있으므로 개체마다 서로 다른 const 데이터 멤버 값을 가질 수 있습니다. 따라서 컴파일러는 클래스 객체가 생성되기 전에는 const 데이터 멤버의 값을 알 수 없기 때문에 클래스 선언 시 const 데이터 멤버를 초기화할 수 없다. 클래스의 생성자. .

const 멤버 함수:
const 멤버 함수의 주요 목적은 멤버 함수가 객체의 내용을 수정하는 것을 방지하는 것입니다. const 키워드와 static 키워드는 멤버 함수에 대해 동시에 사용할 수 없다는 점에 유의해야 합니다. 왜냐하면 static 키워드는 이 포인터를 포함하지 않는 정적 멤버 함수를 수정하기 때문입니다. 즉, const 멤버 함수는 인스턴스화될 수 없으며 특정 기능에 특정해야 합니다.

상수 객체:
상수 객체는 상수 함수만 호출할 수 있으며, 다른 멤버 함수는 호출할 수 없습니다.

보충: const 멤버 함수의 변수를 정말로 수정하고 싶다면 mutable을 사용하여 수정할 수 있습니다. 클래스 전체에서 상수인 멤버 변수에 상수를 생성하려면 클래스의 열거형 상수나 static const를 사용해야 합니다.

class Person
{
    
    
public:
	Person(string name,int age)
	{
    
    
		this->m_name = name;
		this->m_age = age;
	}

	//常函数
	void func() const
	{
    
    
		m_sore = 100;

	}
	//普通成员函数
	void Print()
	{
    
    
		cout << "姓名: " << this->m_name << "  年纪:" << this->m_age << end;
	}
	string m_name;
	int m_age;
	mutable int m_sore =60;  //特殊变量
};

int main()
{
    
    
	const Person p("张三", 18);  // 常对象

	//常对象调用常函数
	p.func();
	//p.Print();  常对象只能调用常函数
	
	p.m_sore = 160;   //m_sore 为特殊变量只能在常对象下修改
	cout << p.m_sore << endl;

	system("pause");
	return 0;
}

추천

출처blog.csdn.net/qq_52302919/article/details/132319184