2013-05-21 8 views
2

필자는 항상 대부분의 코드와 튜토리얼을 읽고 왜 항상 클래스 내부의 멤버 함수를 선언 한 다음 이와 같이 정의하는지 궁금해했습니다.클래스 정의 내에서 멤버 함수 정의하기

 class A{ 

      A doSomething(); 

     }; 

     A A::doSomething(){ 

      //doing something 

     } 

대신 어쨌든이

 class A{ 

      A doSomething(){ 

       //doing something 

      } 

     }; 

을하고, 나는 내 교수 과정을 개정하고 있었고, 난이 발견

"Toute fonction membre définie, 적합 SA CLASSE (, 적합 라 선언 드 라 classe)는 인라인으로 계산할 수 있으며, 인라인으로 사용할 수 있습니다. "

Wh ich는 안으로 번역한다;

"(클래스에서 그 클래스에 정의 모든 멤버 함수 '선언) 인라인 함수와 컴파일러에 의해 간주되지 않습니다. 키워드'인라인 '더 이상을 사용"내가 이해

인접한다입니다 인라인 함수는 매크로처럼 작동합니다. 컴파일러는 함수가 호출되는 모든 인스턴스에 전체 코드 블록을 복사합니다.

내 질문은; 교수님 과정의 진술이 맞습니까? 그렇다면 그 이유는 무엇입니까?

+0

'inline'은 영원히 이후 인라인과 관련이 없습니다. 그것은 약간의 의미 입력 (하나의 정의 규칙을 리프트하고, 아마도 내가 잊어 버린 다른 것)을 가지고 있지만 컴파일러에 의해 인라인되는 함수를 암시하거나 요구하지는 않습니다. – delnan

답변

8

귀하의 교수의 진술은 정확하며, inline의 의미는 귀하의 이해가 아닙니다. inline 함수는 번역 단위에서 여러 정의를 허용하며 실제로 호출이 실제로 인라인 됨 (매크로처럼 확장 됨)을 의미하지는 않습니다.

inline 또는 static없이 헤더에 자유 함수를 정의하고이 헤더를 여러 번역 단위로 포함하는 경우 하나의 정의 규칙을 위반하게됩니다.

구성원 함수는 인라인으로 표시되지 않는 한 비슷합니다 (암시 적으로 클래스 정의 안에 있음).

3

키워드 inline은 C++에서 인라인을 의미하지 않는다, 그것은 단지 정확히 동일한 기능의 여러 정의가이 하나의 정의 규칙을 위반하지 않고 연결 얻을 다른 번역 단위에서 볼 수 있다는 것을 의미한다.

이 점을 염두에두고 멤버 함수 안에 정의하면 암시 적으로 인라인됩니다. 해당 헤더를 포함하는 모든 번역 단위는 동일한 심볼을 생성 할 수 있으며 링커는 그 중 하나를 제외한 모든 심볼을 삭제합니다.

관련 문제