Const 인수를 사용한 함수 오버로딩: 수행할 수 없는 이유
C에서 함수 오버로딩은 이름이 같은 여러 함수를 허용하지만 클래스 내에서 공존할 수 있는 다양한 매개변수 목록 그러나 포인터나 참조가 아닌 매개변수의 불변성만을 기반으로 함수를 오버로드할 수는 없습니다.
다음 코드 예제를 고려하세요.
#include <iostream> using std::cout; class Test { public: Test() {} int foo(const int) const; // const function int foo(int); // non-const function }; int main() { Test obj; Test const obj1; int variable = 0; do { obj.foo(3); // Call the const function obj.foo(variable); // Attempt to call the non-const function variable++; usleep(2000000); } while (1); } int Test::foo(int a) { cout << "NON CONST" << std::endl; a++; return a; } int Test::foo(const int a) const { cout << "CONST" << std::endl; return a; }
코드에서 알 수 있듯이 인수의 불변성을 기반으로 foo 메소드를 오버로드하려고 시도합니다. 즉, const 인수를 허용하는 const 버전과 non-const 인수를 허용하는 비const 버전입니다. 그러나 이 코드를 사용하면 함수를 오버로드할 수 없다는 컴파일 오류가 발생합니다.
이 오류는 C가 비포인터, 비참조 유형의 상수에만 기반한 오버로드를 허용하지 않기 때문에 발생합니다. 그 이유는 값 인수를 전달할 때 실제 인수가 호출된 함수 내의 임시 변수에 복사되기 때문입니다. 이 복사본은 원래 인수와 다르며 해당 상수는 원래 인수의 상수성에 영향을 주지 않습니다.
따라서 위의 예에서 obj.foo(3)를 호출하면 리터럴의 임시 복사본이 됩니다. 3이 생성되어 const 함수에 전달됩니다. 마찬가지로, obj.foo(variable)를 호출하면 변수의 임시 복사본이 생성되어 const가 아닌 함수에 전달됩니다. 컴파일러는 인수의 불변성에만 기초하여 이 두 가지 경우를 구별할 수 없습니다.
요약하자면, 비포인터, 비참조 유형의 불변성을 기반으로 하는 함수 오버로드는 C에서 허용되지 않습니다. 값 인수의 상수성은 함수 내부 인수의 상수성에 영향을 주지 않으며, 컴파일러는 인수 유형만으로는 둘을 구별할 수 없기 때문입니다.
위 내용은 포인터나 참조가 아닌 인수의 불변성에만 기초하여 C 함수를 오버로드할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!