함수 사용 주의점

  • 매개변수 생성자를 선언하면, 기본 void 생성자는 가려지게 되니 명시적 선언 필요
      class A
      {
          A() = default
          A(int a);
      }

참조로 값 반환 지양하기

  • 참조로 값을 반환하게 되면, c++11의 복사 생략, 이동 시멘틱 도입 이점을 못 봄.
  • 또한, c++17버전 부터 복사 생략은 표준에 의해 강제
  • 값을 반환하는 방식이 컴파일러 최적화가 잘 동작하기에 선호

noexcept

  • 함수가 예외를 던지지 않음을 표현
    void myFunction() noexcept {
      // 이 함수는 예외를 던지지 않습니다.
    }
    struct MyStruct {
      int value;
      // noexcept로 이동 연산자를 정의합니다.
      MyStruct(MyStruct&& other) noexcept : value(other.value) {}
    };

const 메서드

  • 해당 클래스 데이터 멤버를 수정할 수 없게 만들 수 있음
  • get 메서드 구현에 용이
    iinline    int getNumberOfMiles() const
      {
          return m_miles;
      }
  • mutable 멤버 변수는 const 함수 내에서도 값이 변경되어도 컴파일 에러 발생 x

인라인(inline) 함수

  • inline 키워드

    • 초기 의미 : 이 함수를 호출하는 문장을 그냥 이 함수의 내용으로 치환 시켜도 됨.
    • c++17부터 : 여러 정의를 허용 함.
      • 현재 c++은 inline명시 없이도 성능 면에서 유리하다 생각되면 인라인 처리함.
    • 클래스 내부 정의 함수들은 자동 inline
      • 선언만 있을 경우, inline 분류 x <- 클래스 밖 멤버함수 정의를 헤더파일에 안하는 이유.
  • 사용 이유

    • 함수 호출 비용을 줄일 수 있기 때문
    • 헤더파일에 정의해도 문제가 없음
      • 헤더 선언, 소스 정의하면 다른 파일에서 참조 시, 문제 발생
  • 인라인 함수 사용

    • 함수 호출의 오버헤드를 줄이기 위해 컴파일러에게 함수 코드를 호출 대신 함수가 호출된 자리로 직접 삽입하도록 요청하는 함수
    • 작은 함수에서 특히 유용
    • 장점
      • 성능 향상: 함수 호출 오버헤드를 줄일 수 있습니다.
      • 코드 크기 감소: 작은 함수의 경우 인라인으로 처리하면 코드 크기를 줄일 수 있습니다.
      • 캐시 적중률 증가: 인라인 함수가 작은 경우 캐시 적중률이 증가할 수 있습니다.
    • 단점
      • 코드 크기 증가: 인라인 함수가 큰 경우 함수 코드가 여러 번 삽입되어 코드 크기가 증가할 수 있습니다.
      • 디버깅 어려움: 인라인 함수는 코드가 삽입되어 디버깅이 어려울 수 있습니다.
      • 컴파일러가 강제하지 않음: inline 키워드를 사용하더라도 컴파일러가 반드시 인라인으로 처리하지는 않습니다. 최적화에 따라 결정됩니다.
        inline int add(int a, int b) {
        return a + b;
        }

static 멤버 함수

  • 인스턴스의 독립성

    • static멤버 함수는 특정 객체의 인스턴스와 무관하게 호출 가능

      class MyClass {
      public:
        static void staticFunction() {
            // 클래스 레벨에서 호출 가능
        }
      };
      
      MyClass::staticFunction(); // 객체 생성 없이 호출 가능
  • 일반적으로 static 멤버 변수의 값 조정하는 것은 static 멤버 함수 사용을 권장(가독성을 위해)

멤버 함수 내부 static 변수

  • 해당 멤버 함수가 호출이 끝나도 값을 계속 유지
  • 정적 로컬 변수 라고 함
      void staticFunction() {
          static int count = 0;
          count++;
          std::cout << "Count: " << count << std::endl;
      }
  • 함수 호출 간에만 값을 유지하고 싶을 떄 좋음

메소드와 함수의 차이

  • 함수
    • 독립적으로 존재
    • 직접 호출 가능
  • 메소드
    • 객체의 기능을 구현하기 위한 클래스 내부에 존재
    • 객체(클래스)를 통해 호출
  • 클래스 메소드
    • 클래스에 속한 메소드
    • 클래스를 통해 접근
  • 인스턴스 메소드
    • 클래스의 객체에 속한 메소드
    • 객체를 통해 접근
  • 정적 메소드
    • 함수와 비슷한 역할을 하지만, 클래스에 속하는 메소드
  • 동적 메소드
    • 동적으로 생성되거나 런타임에 바인딩되는 메소드
    • 리플렉션(JAVA), 델리게이트(C#), Python, JS

함수명 구하기(__func__)

  • 모든 함수는 내부적으로 __func__ 라는 로컬 변수 정의
  • 현재 함수의 이름을 담음
      int addNum()
      {
          cout << "E function " << __func__ << endl;
      }

'공부 > C++' 카테고리의 다른 글

튜플(Tuple)  (0) 2025.03.05
클래스  (0) 2025.03.03
enum_class  (0) 2025.03.03
C++ 변수  (0) 2025.03.03
C++ 여러가지 기본  (0) 2025.03.02

+ Recent posts

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });