본문 바로가기
C++ Practice

전문가 C++ 공부

by Srff5123 2024. 2. 22.
728x90

1. 참조형

    함수의 전형적인 패턴은 0개 또는 1개 이상의 파라미터를 받아서 계산을 하고 하나의 결괏값을 리턴하는 것이다.

    하지만 이런 패턴이 맞지 않는 경우도 이다. 리턴하고 싶은 결괏값이 2개 이상일 수도 있고 파라미터로 넘겨진 변수를        함수에서 변경해주길 원할 수도 있다.

     이러한 경우 C는 포인터를 사용하여 해결하는데, 코드가 복잡해질수있는 단점이 존재한다.

    C++에서는 포인터 없이 참조에 의한 전달(Pass By Reference)를 이용하여 해결할 수있다.

    함수 파라미터의 정의부에서 변수 이름 앞에 &연산자를 붙인다.

    함수 안에서도 함수 호출 시 사용된 변수의 포인터가 사용된다. 

 

   2.예외 처리 

     C++에서 작성한 코드가 엉뚱한 메모리영역을 해집거나 0으로 나누기를 시도해도 컴파일러가 걸러주지를 않는다.

     하지만 C++의 Exception은 코드의 안정성을 한 단계 높이기 위해 언어 차원에서 제공되는 기능이다.

 

     예상치 못한 상황이 왔을 경우를 대비에 nullptr이나 특별한 에러 코드에 매핑하는 방법으로 대응을 할 수 있는데

      exception을 사용하면 훨씬 더 나은 예외 처리 방법을 제공한다.

     특정 코드가 예외적인 상황을 인지하면 Throw를 다른 코드가 던져진 익셉셥을 받을 경우 Catch를 하여 필요한 뒤처리

     를 한다. Throw 구문에 이르면 리턴값도 없이 함수의 실행이 즉시 중단된다. 

     

     throw할 때 스택 변수에 무슨 일이 일어나는지 정확하게 이해하고 이를 바탕으로 catch 블록 에서의 작업을 적절하게         구성해야 한다. catch블록이 하나도 없다면 throw될 때 표준 라이브러리가 exception을 받게 되고 프로그램이 종료된다.

 

     3. 참조형 Const

       참조형 파라미터에 const가 사용되는 경우도 흔히 있다. 참조형은 파라미터 변수를 변경할 수 있게 하려고 이용하므로

       Const를 사용하는 건 일견 모순되어 보인다. 하지만 그 이외에도 성능면에서 불필요한 값의 복제를 피하려는 경우도           많기 때문에 이 경우에는 Const가 의미 있는 역할을 한다. const 이면서 참조형인 파라미터를 이용함으로써 값 복제

       오버헤드도 피하고 참조형의 위협 요소인 원본의 변조도 막을 수 있다.

       객체를 이용할 경우에는 복제 작업 자체가 의도하지 않은 부작용을 낳기 쉽다.

       

      4. 타입 추론

        Decltype(auto)를 이용하면 표현식의 타입이 자동으로 연역된다. 만약 const 한정자가 붙어 있다면 const의 속석을 없          애 버린다. decltype는 이런 효과가 없기 때문에 중복된 코드를 만들게 된다. 이러한 문제를 해결하기 위해 

        Decltype(auto) 사용한다.

         foo()를 호출해서 그 리턴값을 auto 변수에 담을 수 있다

    auto f1 - foo();

 

        auto는 함수 foo()의 리턴값이 가진 const 속성을 없애버리기에 f1은 string 타입이 되며 복제본이 만들어진다.

       만약 f1이 const 참조형을 유지하길 원한다면 명시적으로 const를 표기해준다. const auto& f1 = foo();

 

     또 다른 방법으로는 decltype(foo()) f2 = foo(); 이고 이또한 const의 속성이 유지된다.

 

     하지만 위의 경우에는 코드가 복잡해 지기에 decltype(auto) f3 = foo(); 이러한 식으로 해결한다.

728x90

'C++ Practice' 카테고리의 다른 글

C++ 부동 소수점  (0) 2024.03.15
전문가 C++공부  (0) 2024.03.01
02. 전문가 C++ 공부  (1) 2024.02.06
01. C++ 공부  (0) 2024.01.12
비트 연산 활용  (0) 2023.12.19