함수 사용 주의점
- 매개변수 생성자를 선언하면, 기본 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
명시 없이도 성능 면에서 유리하다 생각되면 인라인 처리함.
- 현재 c++은
- 클래스 내부 정의 함수들은 자동
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 |