프로그래밍 일반/C++ Core Guildlines

C++ Core Guidlines 함수

지노윈 2019. 11. 11. 13:27
반응형

함수 정의 규칙:

매개변수 전달 표현(parameter passing expression) 규칙:

매개변수 전달 의미구조(parameter passing semantic) 규칙:

값 반환 의미구조 규칙:

기타 함수 규칙:

 

함수는 하나의 논리적 동작만 수행해야 한다

하나의 작업만 수행하는 함수는 이해하기 쉽고, 테스트하기 쉽고, 재사용하기 쉽다.

void read_and_print()    // bad
{
    int x;
    cin >> x;
    // check for errors
    cout << x << "\n";
}
int read(istream& is)    // better
{
    int x;
    is >> x;
    // check for errors
    return x;
}

void print(ostream& os, int x)
{
    os << x << "\n";
}

"출력"값 여러 개를 반환할 때는 튜플이나 구조체를 선호하라

반환 값은 그 자체로 문서가 필요하지 않고 "출력 전용"으로 사용된다. C++ 에서는 다수의 값을 반환할때는 tuple(pair를 포함해)를 쓴다는 것을 기억하라,

호출한 지점에서 tie를 사용해 받을 것이다. 반환 값에 의미구조가 있다면 별도의 struct 타입을 사용하라. 그렇지 않다면 일반적인 코드에서는 (이름 없는) tuple이 유용하다.

 

C++11에서는 이렇게 작성할 수 있다, 결과값들을 이미 존재하는 지역변수에 대입한다:

Sometype iter;                                // default initialize if we haven't already
Someothertype success;                        // used these variables for some other purpose

tie(iter, success) = my_set.insert("Hello");   // normal return value
if (success) do_something_with(iter);

C++ 17에서는 다수의 변수들을 선언과 동시에 초기화 할 수 있는 "structured bindings"을 지원한다:

if (auto [ iter, success ] = my_set.insert("Hello"); success) do_something_with(iter);

"인자가 없을 경우"를 허용한다면 T&보다는 T*를 선호하라

포인터(T*)는 nullptr일 수 있지만, 참조(T&)는 그렇지 않다.

경우에 따라서는 "개체 없음"을 표시하기 위해 nullptr를 사용하는 것이 유용할 수 있다. 그렇지 않다면, 참조가 더 간단하고 좋은 코드로 이어질 것이다.

string zstring_to_string(zstring p) // zstring is a char*; that is a C-style string
{
    if (!p) return string{};    // p might be nullptr; remember to check
    return string{p};
}

void print(const vector<int>& r)
{
    // r refers to a vector<int>; no check needed
}

'프로그래밍 일반 > C++ Core Guildlines' 카테고리의 다른 글

C++ Core Guidlines 인터페이스  (0) 2019.11.11
C++ Core Guidlines 철학  (0) 2019.11.11
C++ Core Guidlines 소개  (0) 2019.11.11