programing

C++에 오버로드 기능이 추가된 이유는 무엇입니까?

topblog 2023. 10. 20. 13:23
반응형

C++에 오버로드 기능이 추가된 이유는 무엇입니까?

저는 C학점이 있습니다.C++에 오버로딩 기능이 추가된 이유가 궁금합니다.C는 오버로딩 기능은 없지만 C++는 기능이 있는데 필요한 게 뭐였을까요?

그 당시 언어 디자이너의 머릿속에 떠오른 것은 무엇이었습니까?

유지보수성을 높입니다.T형을 가지고 있고 그것으로 함수를 호출하면 T를 변경해야 하고, 새로운 T에 대해 함수가 오버로드되었다면 즉시 다시 컴파일할 수 있습니다.C에서는 다시 돌아가서 모든 통화 사이트를 뒤지고 호출된 기능을 변경해야 합니다.sqrt()를 취합니다.Float를 sqrt()로 변경하려면 sqrtf()로 변경해야 합니다.

뿐만 아니라 C++의 유형 시스템의 볼륨과 복잡성은 C보다 훨씬 더 크며, 가능한 모든 오버로드에 대해 별도의 함수 이름을 가져야 하는 것은 동일한 목적을 수행하지만 다른 인수를 사용하는 함수에 대한 합리적인 이름 풀을 빠르게 소진시킬 것입니다. 왜냐하면 이제는 인수해야 할 인수가 훨씬 더 많이 있기 때문입니다.

예를 들어 C와 C++ 문자열 라이브러리를 비교합니다.C 문자열 라이브러리는 strcat() 문자열에 추가할 수 있는 한 가지 방법을 제공합니다.C++의 std::string::append에는 8개의 오버로드가 있습니다.append_a, append_b 등을 뭐라고 부를까요?말도 안 돼요. 그들은 모두 같은 기능을 하고, 다른 방식으로 기능을 합니다.

편집: 실제로 언급할 가치가 있습니다.append이것은 정말 나쁜 예입니다. 많은 C++ 문자열 오버로드가 매우 중복됩니다.그러나 이는 그보다 더 일반적인 경우이며 모든 오버로드가 중복되는 것은 아닙니다.

DeadMG가 말한 것 외에, 한 가지 좋은 이유는 만약 당신이 예를 들어 호출하는 템플릿 함수를 작성하고 있다면 입니다.sqrt, 그렇다면 당신은 일반적인 전화 방식이 필요합니다.sqrt-- 만약 당신이 노력하고 어떻게든 이름을 바꾸어야 한다면 매우 어려울 것입니다.sqrtf,sqrtd, 템플릿 파라미터의 유형에 따라 등을 선택합니다.과부하가 걸리면 이 문제가 해결됩니다. 왜냐하면 당신은 단지 글을 쓸 뿐이기 때문입니다.sqrt컴파일러가 어떤 오버로드를 사용해야 하는지 알아내도록 합니다.

template <typename T>
T sqrt_plus_one(T t) // contrived example
{
  return sqrt(t) + 1;
}

abs/labs/labs/fabs/fabsf/fabsl 중에서 "선택"하시겠습니까? 아니면 그냥 abs()를 선택하시겠습니까?

분명히 abs().

따라서 기능 과부하는 프로그래머들에게 다른 장점을 제외하고는 대부분의 경우 안도감을 줍니다.

당신은 말의 입에서 바로 답을 얻을 수 있었습니다.Bjarne Stroustrup의 C++의 설계와 진화는 전체 장을 과부하, 그 역사, 진화, 설계 절충 및 결정에 할애합니다.

여기서는 이 이야기를 되짚지 않고 흥미로운 역사적 사실을 몇 가지 언급하겠습니다.

  • 조작자와 기능 과부하는 밀접한 관련이 있습니다.
  • 초기 C++에는 특별한 키워드가 있었습니다 (overload과적된 것으로 식별자를 선언하기 위해 사용되어야 했던 것.
  • 함수 오버로딩은 type-safe linking (즉, 이름 망글링)을 요구합니다; 처음 구현되었을 때, 그것은 기존의 C와 C++ 코드에서 놀라운 수의 링크 시간 오류를 발견하는 데 도움을 주었습니다 (Strostrup의 인용을 인용하면, "실행 중"과 같았습니다).lint처음으로 C 프로그램에 출연했습니다. 다소 당황스럽습니다.)

기능 과부하가 아니라면 편안하게 물건을 만들 수 있는 방법을 생각해 보세요.

std::string foo = "bar";
std::vector< std::string > myStringVector;
myStringVector.push_back( std::string() );
myStringVector.push_back( std::string( "hello" ) );
myStringVector.push_back( std::string( foo ) );

물론 말도 안 되는 예이지만, 요점을 잘 보여줍니다.

또 다른 점은 템플릿 프로그래밍입니다.매개 변수 유형별로 다른 함수 이름을 가져야 하는 경우에는 일반 템플릿을 제공할 수 없습니다.

다형성을 사용하여, 우리는 같은 함수 이름을 가지지만 다른 인수 목록을 가진 함수들의 패밀리를 설계할 수 있습니다.함수는 함수 호출에서 인수 목록에 따라 다른 작업을 수행합니다.

언급URL : https://stackoverflow.com/questions/4314040/why-was-function-overloading-added-to-c

반응형