const의 용법, 특히 함수 뒤에 사용

4977 단어
const의 용법, 특히 함수 뒤에 사용
일반적인 비const 구성원 함수에서this의 유형은 클래스 유형을 가리키는 const 포인터입니다.this가 가리키는 값을 변경할 수 있지만,this가 저장한 주소를 변경할 수 없습니다.const 구성원 함수에서this의 유형은 const 클래스 형식의 대상을 가리키는 const 바늘입니다.this가 가리키는 대상도 바꿀 수 없고,this가 저장한 주소도 바꿀 수 없습니다.
키워드: Const, Const 함수, Const 변수, 함수 뒤의 Const
const 키워드를 보았을 때, C++ 프로그래머가 가장 먼저 생각한 것은 const 상수일 수도 있습니다.이것은 결코 좋은 조건 반사가 아니다.콘스트로 상량을 정의할 줄만 알았다면, 화약을 폭죽 제작에만 사용한 셈이다.const의 더 큰 매력은 함수의 매개 변수, 반환값, 심지어 함수의 정의체까지 수식할 수 있다는 것이다.const는 constant의 줄임말로'고정불변'이라는 뜻이다.const로 장식된 것들은 모두 강제 보호를 받아 의외의 변동을 예방하고 프로그램의 건장성을 높일 수 있다.그래서 많은 C++ 프로그램 설계 서적들이 "Useconst whenever you need"라고 조언한다.
 1. const 

만약 파라미터가 출력용으로 사용된다면, 어떤 데이터 형식이든지, '바늘 전달' 을 사용하든지, '인용 전달' 을 사용하든지,const 수식을 추가할 수 없다. 그렇지 않으면 이 파라미터는 출력 기능을 잃게 될 것이다.const는 입력 매개 변수만 수식할 수 있습니다. 만약 입력 매개 변수가 '바늘 전달' 을 사용한다면, const 수식을 추가하면 의외로 이 바늘이 바뀌는 것을 방지하고 보호 역할을 합니다.예를 들어 StringCopy 함수:void StringCopy(char*strDestination, const char*strSource);여기서 strSource는 입력 매개변수이고 strDestination은 출력 매개변수입니다.strSource에 const 수식을 더하면 함수 내의 문장이 strSource의 내용을 바꾸려고 하면 컴파일러가 오류를 지적합니다.만약 입력 매개 변수가 '값 전달' 을 사용한다면, 함수는 자동으로 임시 변수를 만들어서 이 매개 변수를 복제하는데 사용하기 때문에, 이 입력 매개 변수는 원래 보호할 필요가 없기 때문에const 수식을 붙이지 마십시오.예를 들어 함수voidFunc1(int x)를voidFunc1(const int x)로 쓰지 마십시오.같은 도리로 함수voidFunc2(A)를 voidFunc2(const A)로 쓰지 마라.여기서 A는 사용자 정의 데이터 유형입니다.내부 데이터 형식이 아닌 매개 변수에 대해서voidFunc(A)처럼 성명된 함수는 효율이 비교적 낮을 수밖에 없다.함수 체내에서 A 유형의 임시 대상을 생성하여 매개 변수 a를 복제하는데 사용하고 임시 대상의 구조, 복제, 분석 과정은 모두 시간을 소모하기 때문이다.효율을 높이기 위해 함수 성명을voidFunc(A&a)로 바꿀 수 있다. 인용 전달은 매개 변수의 별명만 빌려 쓸 뿐 임시 대상이 필요하지 않기 때문이다.그러나 함수voidFunc(A&a)에는 단점이 있다.'인용 전달'은 매개 변수 a를 바꿀 수 있다. 이것은 우리가 기대하지 않는 것이다.이 문제를 해결하는 것은 매우 쉬우므로 const 수식을 하면 되기 때문에 함수는 최종적으로voidFunc(const A &a)가 된다.이런 식으로 따지면 효율을 높이기 위해voidFunc(int x)를voidFunc(const int&x)로 바꿔야 합니까?내부 데이터 유형의 매개 변수는 구조, 분석 과정이 존재하지 않고 복제도 매우 빠르기 때문에'값 전달'과'인용 전달'의 효율은 거의 비슷하다.문제는 이렇게 얽혀 있기 때문에 나는 어쩔 수 없이'const & '수식 입력 매개 변수의 용법을 총괄할 수밖에 없다.내부 데이터 형식이 아닌 입력 매개 변수에 대해'값 전달'의 방식을'const 인용 전달'으로 바꾸어 효율을 높이는 것이 목적이다.예를 들어, voidFunc(A)를 voidFunc(const A & a)로 변경합니다.내부 데이터 형식의 입력 매개 변수에 대해 '값 전달' 방식을 'const 인용 전달' 으로 바꾸지 마십시오.그렇지 않으면 효율을 높이는 목적에 도달하지 못할 뿐만 아니라 함수의 이해성도 떨어진다.예를 들어 voidFunc(int x)는 voidFunc(const int &x)로 변경해서는 안 됩니다.
 2  const 

'포인터 전달' 방식의 함수 반환값에 const 수식을 추가하면 함수 반환값 (즉 포인터) 의 내용을 수정할 수 없습니다. 이 반환값은 const 수식의 같은 유형의 포인터에만 부여될 수 있습니다.예를 들어 함수 constchar * GetString(void)다음 문장은 컴파일 오류가 발생합니다.char*str = GetString().올바른 사용법은 constchar*str = GetString()입니다.만약 함수 반환 값이 '값 전달 방식' 을 사용한다면, 함수는 반환 값을 외부 임시 저장소에 복사하기 때문에 const 수식은 아무런 가치가 없다.예를 들어 함수 intGetInt(void)를 constint GetInt(void)로 쓰지 마십시오.같은 도리로 함수 AGetA(void)를 constA GetA(void)로 쓰지 마십시오. 여기서 A는 사용자가 정의한 데이터 형식입니다.만약 반환 값이 내부 데이터 형식이 아니라면, 함수 AGetA (void) 를 constA & GetA (void) 로 바꾸면 확실히 효율을 높일 수 있습니다.그러나 이때 절대 조심해야 한다. 함수가 도대체 한 대상의'카피'를 되돌려주고 싶은지 아니면'별명'만 되돌려주고 싶은지 반드시 알아야 한다. 그렇지 않으면 프로그램이 잘못될 것이다.함수 반환값은'인용 전달'을 사용하는 경우가 많지 않다. 이런 방식은 일반적으로 클래스의 부수 함수에만 나타나는데 목적은 체인식 표현을 실현하기 위한 것이다.예: classa {A &operate = (const A &other);//대입 함수};Aa, b, c;//a, b, c는 A의 객체
a= b = c;//정상적인 체인 할당 (a=b) = c;//비정상적인 체인식 값 부여, 그러나 합법적으로 값 부여 함수의 반환값을const로 수식하면, 이 반환값의 내용은 변경할 수 없습니다.상례에서 문장 a=b=c는 여전히 정확하지만 문장(a=b)=c는 불법이다.
3const 구성원 함수
데이터 구성원을 수정하지 않는 함수는const 형식으로 표시해야 합니다.const 구성원 함수를 작성할 때 데이터 구성원을 부주의로 수정하거나 다른 비const 구성원 함수를 호출하면 컴파일러가 오류를 지적하여 프로그램의 건장성을 높일 것이다.다음 프로그램에서 클래스 Stack의 구성원 함수인 GetCount은 계수에만 사용되며, 논리적으로 GetCount는 const 함수이어야 한다.컴파일러가 GetCount 함수의 오류를 나타냅니다.classStack {public: void Push(int elem), int Pop(void), intGetCount(void) const;//const 구성원 함수private: intm num, int m data[100];int Stack::GetCount(void) const {++ m num;//컴파일 오류, 데이터 구성원 m num Pop();//컴파일 오류, 비const 함수 returnm num 호출;const 구성원 함수의 성명은 이상해 보입니다. const 키워드는 함수 성명의 끝에만 놓을 수 있습니다. 아마도 다른 부분은 이미 점용되었기 때문입니다.Const 함수에 대한 몇 가지 규칙:
a.const 대상은 const 구성원 함수에만 접근할 수 있고 const 대상이 아니라 임의의 구성원 함수에 접근할 수 있습니다.const 구성원 함수를 포함합니다.b.const 대상의 구성원은 수정할 수 없지만 const 대상은 지침을 통해 유지하는 대상은 수정할 수 있습니다.c.const 구성원 함수는 대상의 데이터를 수정할 수 없습니다. 대상이 const 성질을 가지고 있든 없든.그것은 컴파일할 때 구성원 데이터의 수정 여부를 근거로 검사를 진행한다.e. 그러나mutable 수식자의 데이터 구성원을 더하면 어떠한 상황에서도 어떤 수단을 써서든 수정할 수 있다. 자연히 이때의const 구성원 함수는 수정할 수 있다.
제목:const를 뒤에 놓으면 무슨 의미가 있습니까?
함수 AcGePoint3dstartPoint() constconst를 뒤에 놓으면 앞과 차이가 있습니까 = > 정확히 말하면 const는this가 가리키는 대상을 수식하는 것입니다. 예를 들어classa{public: f(int);}를 정의했습니다.여기에 f 함수는 사실 두 개의 매개 변수가 있는데 첫 번째는Aconst this이고 다른 하나는int 형식의 매개 변수이다. 만약에 우리가 f 함수가 매개 변수의 값을 바꾸고 싶지 않으면 함수 원형을 f(constint)로 바꿀 수 있지만 f가this가 가리키는 대상을 바꾸는 것을 허락하지 않는다면?this는 은밀한 매개 변수이기 때문에 const는 직접 수식할 수 없습니다. 함수의 뒤에 추가됩니다. 이것은 this의 유형이 constA constthis라는 것을 나타냅니다.const 수식this는 본질이다.'이 구성원 함수는 클래스의 데이터를 수정하지 않는다는 뜻이다. 그렇지 않으면 컴파일링이 잘못된다'는 말은 하나의 현상일 뿐이다. 근원은this가const 유형이기 때문이다.

좋은 웹페이지 즐겨찾기