336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
SoSimple sim2 = sim1;
위의 문장은 다음의 형태로 묵시적 변환이 일어나서 복사 생성자가 호출이 된다.
SoSimple sim2(sim1);
결국, 복사 생성작의 묵시적 호출이 된 것으로 볼 수 있는데. 위와 같은 유형의 변환이 마음에 들지 않는다면
explicit 키워드를 이용하여 묵시적 호출을 허용 안하게 할 수 있다.
explicit SoSimple (const SoSimple& cpoy)
{
}

이렇게 explicit을 명시하게 되면 더 이상 묵시적 변환이 발생하지 않아서 대입 연산자를 이용한 객체의 생성 및 초기화는 불가능 하게 된다.

결국 아래와 같은 호출은 불가능 하다.
SoSImple s1;
SoSImple s2 = s1; // SoSImple s2(s1); 이런식으로 객체를 생성 및 초기화 해야함
블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

inline 함수를 의역하자면 프로그램 코드라인 안으로 들어가 버린 함수를 뜻합니다.
C언어에서의 매크로 함수와 비교를 맘ㄶ이 하는데... 잠시 매크로 함수의 장점을 보자면..
"일반적인 함수에 비해서 실행속도의 이점이 있다."
라는 실행속도의 이점으로 성능향상에 도움이 될 수 있다는거죠
반면 단점으로는
"정의하기가 어렵고 복잡한 함수의 형태로 정의하는데에 한계가 있다."
라는 단점이 있습니다.

이러한 매크로 함수의 정의가 복잡하니 일반 함수처럼 가능하면 좋겠다는 생각에 나온 것이 인라인 함수 입니다. (그렇다고  100% 만족한다는 내용은 아님)

참고로 매크로를 이용한 함수의 인라인화는 전처리기에 의해서 처리가 되지만, 키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해서 처리가 됩니다.
따라서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우, 이 키워드를 무시해 버립니다.
또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 합니다.

사실 인라인 함수가 매크로 함수의 장점을 완전히 대체를 하지는 않습니다.
대표적인 예로

#define SQUARE(x) ((x)*(x))
의 경우에 x값의 자료형이 상관없이 매크로에서는 데이터 손실이 발생 하지 않지만...
인라인 함수의 경우에는
inline int SQUARE(int x) {return x*x}
와 같이 float형이나 double형의 인자가 들어오는 경우 데이터 손실이 발생 합니다.

단점이라고 예기는 해도 사실 template을 사용하면 데이터 손실 없이 사용이 가능할 수 있습니다.

template 
inline T SQUARE(T x) 
{
    return x*x
}

한가지 더 주위를 해 줘야 하는 부분은 inline 함수의 위치입니다.
대부분 선언부는 헤더파일에 구현부분은 cpp로 나누어서 관리를 하는데 inline 함수의 경우에는 선언과 동시에 구현부가 같이 존재를 해야 하지요.
이러한 이유는 인라인 함수의 특징을 잘 생각해 보면 답을 알 수가 있습니다.

"컴파일 과정에서 함수의 호출 문이 있는 곳에 함수의 몸체 부분이 삽입이 되야 한다."

위와 같은 이유로 인라인 함수는 컴파일러에 의해서 해당 함수의 몸체가 대체 되야 하기 때문에 선언과 동일한 파일에 저장이 되어 컴파일러가 참조를 할 수 있게 해야 합니다.

출처 : 윤성우 저 열혈강의 C++ 프로그래밍 (개정판)
블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

그동안 모르고 써왔던  C++에서의 표준 헤더 파일의 선언... 이런 뜻이 있더군요..
대부분 C에서 보면 standard library를 include 하기 위해서는 아래와 같이 사용을 합니다.

#include "stdio.h"

여기서 보면 확장자 h가 붙은 걸 확인 할 수 있습니다.

근데 신기하게 C++에서는

#incude <iostream>

와 같이 확장자가 명시가 안되어 있는 예제가 있습니다.

처음에는 그려려니 했는데 다시 기본 문법 책을 참고 하면서 이런 내용이 있네요

"C++에서는 프로그래머가 정의하는 헤더파일의 선언이 아닌, 표준 헤더파일의 선언에서는 확장자를 생략하기로 약속되어 있다." - 윤성우 C++ 개정판 15page

모 C 스타일로 <iostream.h> 라고 해도 되긴 하지만 C++ 컴파일러가 점차 <iostream.h>을 지원하지 않는 추세로 접어들었다고 합니다.

이렇게 확장자를 생략하기로 한 목적은
1. 과거의 표준 라이브러리와 새로운 라이브러리의 구분을 위해서...
2. 새로운 표준 라이브러리를 사용하는 형태로 소스코드를 쉽게 변경할 수 있도록...
하기 위한 목적이 있다는 군요

결국 표준인 만큼 C++에서는 h를 명시 하지 말라는 내용입니다.

출처 : 윤성우 저 열혈강의 C++ 프로그래밍 (개정판
블로그 이미지

뚱땡이 우주인

,