• 클래스 생성자

개념 : 객체가 생성될때 호출되는 함수

생성자가 없다면 객체는 생성 될 수 없다

 

아무래도 생성될 때 호출이 되다보니 초기화 기능과 굉장히 잘 부합한다

생성자의 이름은 클래스 이름과 같고 리턴 자료형이 없음에도 void를 기술하지 않는다

 

생성자의 호출에 있어서 명시적호출, 암시적호출이 있다

생성자 함수명의 유무에 차이가 있는듯하다

 

소괄호가 아닌 중괄호로 초기화 한 부분은 리스트 초기화 구문이다

중괄호 안의 값들과 생성자의 매개변수들을 매칭시켜주는 것

 

생성자는 오버로딩도 가능하다

객체의 여러가지 초기화 버전을 갖출 수 있겠다

 


  • 디폴트 생성자

개념 : 매개변수를 기술하지 않아도 되는 생성자

 

디폴트 생성자는 암시적 버전과 명시적 버전이 있다

 

암시적 버전

 

생성자를 작성하지 않으면 C++에서 자동으로 생성자를 만들어 호출해준다

물론 아무일도 하지않는다

[ 사용자 정의 생성자를 작성하면 자동으로 생성되지 않는다 

=  초기화되지 않은 객체의 생성을 사용자가 원하지 않을 수도 있기 때문]

 

명시적 버전

 

사용자 정의 생성자로 매개변수를 기술하지 않아도 호출될 수 있는 생성자를 뜻한다

 

이는 두가지가 있다

사용자는 하나의 디폴트 생성자만 가질수가 있다

 

그렇기 때문에 저 두 생성자를 동시에 사용 할 수 없다

 

주의할 점 하나는 암시적으로 생성자를 사용할 때 소괄호를 사용하면 안된다

"cout<< 생성됨" 이 출력되지 않음

 

이 디폴트 생성자의 필요성은 클래스 배열을 생성할때 꼭 필요하다는 점이다


  • 파괴자

개념 : 객체의 수명이 끝날 때 자동으로 호출이 됨

         객체의 흔적을 지우는 역할과 잘 부합한다

 

생성자와 마찬가지로 사용자 정의 파괴자가 없다면 자동으로 디폴트 파괴자를 생성하여 호출한다

그리고 파괴자는 매개변수를 가지지 못한다

 

파괴자의 호출은 일반적으로 사용자가 코드에 명시적으로 호출하지 않는다

(뒤에 나오는 한가지 예외가 있다고한다)

 

객체의 기억공간에서 벗어난다면 자동으로 호출이 된다

 


  • 내가 헷갈릴만한 것

임시객체부분

결과

선언과 동시에 생성자를 쓰는 부분은 생성자가 한번 호출 된다

[ 컴파일러에 따라 임시객체의 생성 유무가 다르다. 내가 사용하는 환경은 임시객체를 생성하지 않는다 ]

 

선언이 아닌 대입으로 생성자를 사용하는 부분은 임시객체를 생성하고 대입 후 파괴한다

[ 단 이건 컴파일러에 따라 임시객체를 유지하는 시간이 다르다 ]

 

 

생성자만 호출

생성자만 호출되어도 객체가 생성됨


  • const 멤버 함수

 

객체 Test는 값이 변경되면 안되는 const 객체이다

 

컴파일러가 보기에 이 Test객체의 TestFunc이 값을 변경하는지 안하는지 모르니까 컴파일러는 에러를 띄워준다

 

그래서 이 함수는 값을 변경하지 않으니까 안심해 라는 뜻으로 함수선언 소괄호 뒤에 const를 붙여준다

 

const멤버함수를 선언하고 멤버함수의 값을 변경하면 당연히 안된다

 


  • this포인터

객체의 멤버함수들은 기본적으로 this라는 숨은 매개변수를 가지고 있다

 

멤버함수를 호출하면 호출 된 멤버함수는 자신을 호출한 객체를 포인터로 매개변수로 받아오는데

그것을 사용하는게 this 이다

함수 내부에 자동으로 ClassName * const 형으로 선언됨

 

예로 어떠한 상황에서 자기자신을 리턴해주는 경우가 필요한데 이때 사용이 가능하다

 

  • 추상화

'코끼리 상'은 '형상 상' 이라는 이름도 가지고 있다

사물의 어떠한 공통적인 특징을 추출하여 파악

 

내가 생각하기에는 객체의 목적을 공통으로하여 기능들을 추출하는것이 추상화라 생각한다

 

 


  • 클래스

추상화한 것을 사용자 정의 데이터형으로 변환한것

 


  • 사용자 범위 결정 연산자

:: 인데 namespace관련해서도 사용했었다

 

클래스의 멤버함수를 정의 할 때

정의부 함수 머리에 클래스이름::함수이름( ) 이런식으로 사용하는데

이때의 :: 가 이 함수는 이 클래스의 멤버함수라는것을 나타내며

클래스 사용범위 라는걸 알려준다

 


  • 인라인 메서드

클래스 선언 안에 정의를 가지고 있는 모든 함수는 자동으로 인라인 함수가 된다

 

 


  • 멤버함수

같은 클래스로 여러객체를 생성하면 각 객체는 변수들을 위한 각각의 저장 공간을 가진다

 

그러나 메서드는 이렇게 각각 저장을 하지 않고 한곳에 저장된다

 

왜냐하면 함수의 구조가 변경된다던지 이런 일이 없기 때문에 굳이 각각 저장하지 않는거같다

 

멤버함수는 멤버변수와 같이 정적, 비정적이 존재하며 둘다 모두 code영역에 저장이 되며

(저장되는 타이밍은 다르다)

 

같은 클래스에서 나온 객체끼리 모두 공유하면서 사용한다!

 

 

 

  • 위치지정 new

개념 : 사용할 위치를 사용자가 지정할 수 있다

 

이 위치란 말이 처음에는 헷갈렸는데 주소라고 변경해도 될거같다

사용법은 new의 매개변수에 사용할 주소를 추가로 넣어주면 된다

 

대부분 예로 드는 예제
이렇게도 가능하다

기존 new는 힙에서 할당을 해오지만

위치지정 new는 메모리 관리를 모두 개발자에게 맡기기 때문에

힙영역, 정적영역, 스택영역의 메모리에도 지정할 수 있었다.

 

메모리 해제 같은 경우 참조한 메모리의 영역에 맞추어 하면 된다.

힙 같은 경우는 사용자가 해제 해주어야 하니 delete를 써주면 되고

정적, 스택 영역 같은 경우는 자동으로 해제되니 맡기면 된다.

 

맨 위에서 2번째 예시의 코드의 int * pa = new (&a) int; 는 사실 int * pa = &a; 와 같아 보이는데

이처럼 그냥 대입하면 되지 왜 만들었을까 생각을 했다

https://ehei.tistory.com/505
이런 기능이 필요한 이유는 다음과 같다. 힙을 할당하는 건 많은 비용이 든다. 메모리의 정합성을 유지하기 위해 운영체제가 수행해야하는 작업이 있다. 가상 메모리, 페이지 단위 관리, 그리고 메모리 파편화를 피하기 위한 재배치가 그런 것들의 예이다. 여기에 드는 비용은 프로그래머가 예상할 수 없다. 그러나 발생하면 치명적이다. 정체불명의 랙이 생길 수도 있다. 따라서 보통은 메모리풀이란 개념으로 대량의 연속된 메모리를 할당받는다. 그리고 위치지정 new를 이용하여 객체를 그곳에 생성한다

 

다른 생성자 문제도 있겠으나 이렇게 메모리 관리를 위해 사용하는 느낌이 더 강하게 왔고

메모리 풀에도 쓰인다하니 나중에 더 알게될듯 하다.

 


  • 선언영역 & 잠재 사용 범위

선언영역(declarative region) : 선언을 할 수 있는 영역

 

ex) 어떤 변수를 함수 밖에 선언한다면 선언영역은 선언된 파일이다

     어떤 변수를 함수 안에 선언한다면 선언영역은 선언된 블록이다

 

잠재 사용 범위(potential scope) : 간단히 사용 영역

 

ex) 변수를 함수안에 선언하면 잠재 사용 범위는 "변수 선언 ~ 함수 끝" 이다

 

 


  • 이름 공간

 

전역 이름 공간 - 우리가 보통 전역변수를 생성할때 이 전역 이름 공간에 만들고 있었다

 

namespace - 사용자가 정의하는 이름 공간

 

이 namespace는 무조건 전역이름공간에 생성될수밖에 없기 때문에

안에 들어있는 변수나 함수는 전역적 속성을 가진다

 

 

namespace이지만 이름이 생략된 공간 - 내부링크속성을 띄는 정적변수라 볼수있다

 


  • using선언 & using지시

using 선언 :  간단히 이름공간 안에 있는 하나의 변수, 혹은 함수를 using이 사용된 공간에 사용한다는 뜻

단 짚고 넘어가야할 것은 지역이름 공간에 넣는다는 뜻이다

이렇게 선언한 식별자는 같은 공간내에 중복으로 선언 불가능해진다

이유는 위에 언급했듯이 지역이름공간에 넣기때문에 그렇다

아직은 문제 없지만
실행시 에러

 

 

using 지시 : namespcae 전체를 접근하게 한다

주의할 점은 using선언과 달리 전역적으로 사용한다는 것이다

 

using + namspace로 사용

위에서 언급했듯이 선언과는 다르게 이렇게도 가능하다

 

mySpace에 소속된 space1과 같은 식별자를 지역변수로 선언 할 수 있다

 

이 부분이 굉장히 헷갈렸었는데

위에서 말했듯이 선언은 지역이름공간에 넣어주고

지시는 전역적으로 사용하게끔 하기 때문에 이런 차이가 날 수 있게 된것이다.

 

  • thread_local

변수의 존속시간이 쓰레드의 존속 시간과 같다는 제한자

 

존속시간은 예를들어

정적 변수의 존속시간은 프로그램이 실행되고 종료될때까지이다

 


  • volatile
volatile : 변덕스러운
변덕 : 이랬다저랬다 잘 변하는 태도나 성질

개념 : 간단히는 최적화를 수행하지 못하게 막는다, 라고 할수있고

         자세히는 volatile 변수를 참조할때 레지스터에 로드 된 값을 사용하지 않고 항상 메모리를 직접 참조 한다

 

최적화를 왜 막아야하는가? 

최적화로 인해서 생략된 코드때문에 개발자가 의도한대로 흘러가지 않는 경우도 있는 듯 하다

 

https://luna-archive.tistory.com/2

 

[C] 임베디드 시스템에서 volatile 키워드를 사용하는 이유

MCU 프로그래밍을 하다 보면 레지스터를 제어하기 위해 같은 주소에 여러번 값을 여러번 쓰는 경우가 빈번하고, 이런 경우 코드를 보면 앞에 volatile 키워드를 사용하는 경우를 볼 수 있다. 처음

luna-archive.tistory.com

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=classic2u&logNo=50003118713&parentCategoryNo=&categoryNo=15&viewDate=&isShowPopularPosts=false&from=postView

 

이 두 글에 자세히 나와있다

 

최적화가 일어나지 않으므로 코드가 생략되지 않고 모두 직접 메모리에 실행되어 값이 변할수도 있기에

변덕스러운 이라는 뜻이 어울린다고 생각한다

 

일단 이 개념은 여기까지

 


  • mutable

개념 : const 구조체 또는 const 클래스의 멤버지만 변경가능한 멤버변수를 선언할때 사용한다

 

 


  • const의 내부링크

기본 전역 변수는 외부링크로 디폴트가 되어있다

 

하지만 const가 붙으면 내부링크로 변경된다

 


  • 함수와 링크

함수역시 링크 속성을 가진다

 

모든 함수는 정적기억존속을 가진다.(프로그램의 시작과 끝까지) = 외부링크

 

static을 사용하여 내부링크를 부여 할 수 있다

 


  • 단일 정의 규칙

프로그램은 인라인이 아닌 모든 함수에 대해서 정확히 하나의 정의만을 가져야한다

  • 분할컴파일

말그대로 프로그램을 파일로 나누어 컴파일한다는 뜻

 

수정부분의 파일만 수정 후 컴파일하면 되기 때문에 큰 규모의 프로그램을 보다 쉽게 관리 할 수 있다

 


  • #ifndef & #endif

ifndef는 if not defined 라는 의미로 어떠한 매크로 문구가 define되어 있으면

ifndef 과 endif사이의 코드를 실행한다는 의미다

 

정말 쉽게보면 if문에 bool형 조건을 단것과 같다

헤더파일을 여러번 포함시키는 실수를 피하기 위하여 사용하는 기법이다

 


  • Linkage
Linkage  : 연결
연결  :  사물과 사물을 서로 잇다

개념 : 변수의 속성중 하나로 파일과의 연결을 뜻하는 속성이다

이 사물과 사물을 프로그래밍 적으로 보면 파일과 변수라고 생각을 한다

 

이 속성은 세가지 항목으로 이루어져있다

[ 외부링크, 내부링크, 링크없음 ]

 

외부링크 - 말 그대로 현재 속한 파일뿐만 아니라 다른 외부 파일에서도 참조 할 수 있다 라는 속성

 

내부링크 - 현재 속한 파일에서만 참조 할 수 있다 라는 속성

 

링크없음 - 제한된 영역(ex. 스코프)에서만 참조 할 수 있다 라는 속성

 

★★★ Include.cpp 파일 이다, 밑에 코드와 이어짐

 

외부링크된 변수를 다른 파일에서 사용 할 때 필요한게 extern 이다

 

  • extern
extern 외부의, 바깥의

개념 : 다른 파일의 전역변수를 참조 한다는 참조선언이다

 

★★★ main.cpp 파일이다

extern을 사용해 위에 있었던 Include.cpp파일의 전역변수 A를 사용했다

 

참고로 static을 사용한 정적변수B는 내부링크 속성을 가지고 있으므로 extern을 선언해도 사용 할 수 없다

실행전에는 당연히 문제는 없다
하지만 실행결과

 


 

  • Static
static : (변화움직임이 없이) 고정된[고정적인]

 

개념 : 두가지 의미가 있다

 

밖에서 사용 할 경우 - 변수에 내부링크 속성을 사용한다라는 뜻

스코프 안에서 사용 할 경우 - 변수가 정적 기억 존속 시간을 가진다는 뜻

                                           (프로그램이 끝날 때 까지 존속)

 

(함수내부가 아닌)밖에서 Static을 사용한 변수를 정적변수 라 한다

(함수내부가 아닌)밖에서 Static을 사용하지 않은 변수를 전역변수(global) 라 한다

 

이제 밖이 아닌 스코프 안에 사용했을 경우에는 정적지역변수 라고도 하는데

변수는 프로그램이 끝날때까지 남아있으면서 사용된 그 스코프에서만 사용이 가능한데

 

언뜻보면 정말 쓸모없다고 생각이 들었는데 정적지역변수의 특성이 있었다

 

정적지역변수는 선언 부분이 계속 나와도 이미 선언이 되어있으면

초기화 하지 않고 이미 선언된 변수를 사용 할 수 있다

 

Include.cpp
main.cpp

이렇게 값이 계속 유지 되는걸 볼 수있다.

이는 한마디로 함수가 언제 호출 되든 값이 유지되는 변수다

 

정적지역변수는 함수가 다르면 식별자가 같아도 다른 변수로 인식된다

include.cpp
(좌) Test 함수의 정적지역변수A, (우) Test1 함수의 정적지역변수A

정적지역변수는 정말 신기했다ㅋㅋ

  • 오버로딩 분석(overload resoultion)

오버로딩, 함수템플릿, 함수템플릿 오버로딩 등 같은 이름의 함수가 여러개 있다면

컴파일러는 어떤 함수의 정의를 사용할것인가에 대해 C++는 선택과정을 가지고 있는데

이를 오버로딩 분석 이라 한다

 

오버로딩 분석은 함수 시그니쳐로만 판단을 하며 리턴형은 분석 대상이 아니다

 

 

각 단계는

 

1단계 : 호출된 함수의 이름과 동일한 함수들을 모아 목록을 만든다

 

2단계 : 매개변수의 개수와, 각 매개변수의 자료형이 맞는 함수만 뽑아낸다

여기서 자료형이 일치하지 않더라도 암시적 변환이 이루어지고 템플릿의 경우 구체화가 이루어 진다

 

3단계 : 가장 적당한 함수가 있는지 판단한다. 그 순서다

만약 정확하게 대응하는 함수가 두개 이상이거나 없으면 에러가 난다

 

일단 아직은 자세히 들어갈 필요보단 C++에서  여러 함수에 대응될때 매개변수를 통해 하나의 최적의 결과를

얻는다 생각 하면 될듯하다

 


  • decltype

decltype는 특정 식의 자료형을 추론할때 사용된다.

 

밑의 코드처럼 result에는 어떤 자료형이 들어와야 하는지 알 수 없다

+ 연산자는 기본으로 정수형 승급을 적용하여 결과는 정수형 타입이 되지만

따로 오버로딩도 가능하기에 어떤 타입이 될지 알수 없다

 

그에 따른 C++11의 해결책은 decltype 키워드 이다

이렇게 a+b의 자료형을 추론하여 자료형을 선언한다

 


  • 후위반환타입

C++11 에 생긴 Trailing Return Type(리턴 타입 추적 or 후위 반환 타입) 이라는 문법인데

말그대로 리턴타입을 추론해 내는 문법이다

 

사용법은 함수의 반환형을 auto로 사용하고 매개변수 괄호를 지나 -> 자료형 을 기술하면 된다

이런식으로 사용 된다.

 

double을 작성함으로 리턴타입추적의 결과를 double로 찾게된다

 

리턴자료형은 a+b

이 경우에는 decltype을 통해 리턴 자료형을 추론하였다고 볼수있다

 

밑의 코드처럼 꼭 템플릿이 아니라 일반 함수에도 사용 가능하다

[하지만 템플릿을 위해 만들어진 기능인듯하당]

 


기능은 auto와 매우 흡사하고 같이 연역관련 개념은 좀 깊이가 깊은듯 하여 따로 자세히 포스팅을 해야겠다

  • 함수 템플릿

c++에서 추가된 기능, 오버로딩작업을 자동화 해준다

 

Template은 한국어로 형판이라 한다

틀에 재료를 넣고 빼면 틀모양의 물건이 완성된다

틀에 다른 재료를 넣으면 각 재료로 만든 형체가 나온다

 

이 완성된 것은 모양은 같지만 재료는 다르다

여기서 재료는 자료형을 뜻하는것과 비슷하다고 생각한다

 

함수의 틀(모양)은 유지하되 다른 자료형(재료)으로 실행할수있다는 뜻으로 생각한다

 

템플릿은 함수템플릿, 클래스템플릿이 있으며 지금은 함수 템플릿만 정리한다

 

템플릿 설정은 template , class(혹은 typename) , < > 를 사용하여 설정한다

typename은 C++98에서 추가되었고 데이터형을 나타낸다는 사실을 더 분명하게 알려준다

이 템플릿 설정에 있어서 typename과 class는 일단 같은 기능을 한다

 

 

위의 템플릿함수를 사용시 사용할 자료형을 기술해야줘야하는데 (기술하는것을 명시적 구체화라 한다)

매개변수로 인해 자료형이 추론이 가능하다면 생략해도 좋다 (추론하는것으로 암시적 구체화라 한다)

매개변수 1로 인해 int형을 사용한다는걸 추론할수 있음

 


  • 템플릿 오버로딩

일반적인 오버로딩을 하듯 사용하면 된다

 

다만 주의할것은

이렇게 템플릿함수와 일반함수가 같은 함수처럼 보여도

오버로딩과는 별개로 다른 독립적인 함수임을 알아야한다

 


  • 구체화
구체 具體
사물이 직접 경험하거나 지각할 수 있도록 일정한 형태와 성질을 갖춤.

 

밑의 코드처럼 함수 템플릿을 작성하기만 한다고 실제 함수의 정의가 생성되는건 아니다

 

어떤 자료형을 사용할것이라고 구체적으로 기술한 템플릿을 사용하면(구체화)

그때! 기술한 자료형을 토대로 함수의 정의가 생성된다 (생성되는 시기는 호출되는 런타임이 아니라 컴파일 타임이다)

 

이를 '구체화' 라 한다

 

구체화에는 명시적 구체화, 암시적 구체화가 있는데

 

명시적 구체화는 직접 자료형을 써 넣어 구체화 하라고 지시하는 의미를 가진다

두가지 방법이 있는데

 

호출하지 않는 방법과 호출하는 방법이 있는데

1이 호출하지 않는 방법이고,

2가 호출하는 방법이다

 

호출할시에 <> 이 꺽쇠모양은 템플릿함수를 사용한다는 의미도 있다

템플릿함수로 호출이되어 일반함수를 호출하지않는다

 

암시적 구체화

Test(1); 꺽쇠(<>)에 명시적인 자료형을 기술하지 않고 매개변수로 자료형을 추론하여

해당 자료형을 토대로 구체화하는 방법이다

명시적 구체화와 함께 정리했다

 

정리하면서 뭔가 구체화가 인스턴스화와 같다고 느꼈다

무언가 실체화 되는 느낌이라고 생각하면 될듯하다

 

 

템플릿 함수

컴파일 타임에 구체화 되어 만들어진 함수를 '템플릿 함수' 라 한다

 

 


  • 명시적 특수화

[템플릿 특수화는 두가지가 있다 명시적 특수화, 부분적 특수화 함수 템플릿에서는 명시적 특수화만 가능하다]

특수 特殊
어떤 종류 전체에 걸치지 아니하고 부분에 한정됨. 또는 그런 것.

 

템플릿에서 특수화는 저 사전적의미를 빌리면 템플릿을 여러 자료형에 속하게하지 않고 지정 해주는 뜻 이라 생각한다

(자료형을)지정하여 그 지정된 자료형이 매개변수로 들어오면 그에 맞게 실행하는 것이다

 

한마디로 int형으로 특수화를 해놨을 때

int형으로 매개변수가 들어온 함수 호출이 있으면

따로 구체화하지말고 특수화 해놓은걸 사용해라 이런 느낌이다 

 

이 명시적 특수화는 어느 부분에서 필요성을 느끼게 되냐면

특정 자료형이 매개변수로 들어올때 다른 코드로 실행이 되게 하고싶을때 나타난다

 

이 특수화 방법은

함수 매개변수 개수가 같아야하고 반환형도 동일해야 한다

 

매개변수가 45인 int형은 명시적 특수화된 함수로 실행이 되었고

매개변수가 2.5f 인 float은 원형으로 실행이 되었다

 

덧붙여서 일반함수, 함수템플릿, 명시적 특수화된 함수 템플릿 이 세가지가 같은 호출조건을 가지고 있을때

우선순위가 있다

 

1. 일반함수 ── 2. 명시적 특수화된 함수 템플릿 ── 3. 함수 템플릿 

 

순이다

 

명시적 특수화와 명시적 구체화의 차이는 졸라 헷갈렸는데

 

명시적 특수화는 특정 자료형에 따라 다른 코드의 예외를 작성할 수 있는 것이고

명시적 구체화는 원본 코드 그대로의 특정 자료형에 대한 함수 정의를 만들라는 것이다

 

그리고 문법적으로 특수화는 template<> ,구체화는 template 의 차이가 있다


  • 특수화

암시적 구체화, 명시적 구체화, 명시적 특수화 이 모두를 특수화라 칭한다

 

  • 배열참조형

참조형을 담는 배열은 생성할 수 없다

 

단 배열자료형의 참조형은 가능하다

 


  • 디폴트 매개변수

C++에서 새로 생겨났으며

 

매개변수에 기본으로 사용하는 값을 지정하여

함수 사용시 설정한 해당 매개변수를 기술하지 않으면 설정한 값으로 매개변수가 입력되는 기능

 

밑의 int b처럼 기본값을 설정해주면 된다

 

디폴트 매개변수은 규칙은 무조건 오른쪽에서 왼쪽으로 기술해야한다

 


  • 오버로딩

같은 함수의 이름으로 다른 매개변수, 다른 함수내용 을 정의 할 수 있는 기능

 

이 오버로딩은 객체프로그래밍의 다형성을 나타내는 기능중 하나이다

이 설명을 프로그래밍으로 나타내면

같은 종의 생물 = 같은 식별자

크기, 형태, 색깔 = 매개변수 리스트, 반환 자료형, 함수 내용  이라고 생각한다

 

식별자는 같지만 매개변수, 내용이 다르다

 

오버로딩을 할 때 주의 할 점은 매개변수 리스트는 필수로 무조건 달라야한다

 

반환 자료형이나 함수내용이 달라도 매개변수 리스트가 같으면 성립이 되지 않는다

 

이와 몇가지로 안되는 경우가 있는데

 

보통 함수에 이미 본문이 있을 때 이다

  • 매개변수의 const

코드상으로는 문제가 없지만 실행시 오류가 난다

 

이유는 같은 코드라고 컴파일러가 인식하기 때문

 

이는 int a나 const int a나 lvalue, rvalue모두 가능한 공통점 때문에 같은 코드라고 인식하는듯 하다

 

단 참조일 경우에는 다르다

참조일 경우에는 lvalue, rvalue 확실히 나누어지기 때문에 가능한 듯하다

 

 

※클래스의 멤버함수에서는 이런식으로 가능하다

 

  • * 와 [ ]

내가 생각하기로는 [ ]은 매개변수로 들어갈때 컴파일러가 포인터형으로 변환하는데

 

이때문에 같은 코드로 인식되어 실행이 불가능한 듯하다

 


  • 이름장식

c++은 오버로딩된 함수중 어떤것이 맞는지 어떻게 추적하냐면

이름장식(Name mangling)을 사용한다고 한다

 

함수 원형에 지정되어 있는 형식을 암호화 한다고 한다

 

예를들어

long Test(int) 를 암호화로 ?test@@YAXH@z

이런식으로 매개변수의 개수와 데이터형을 암호화한다고 한다

[컴파일러마다 암호 규칙이 다르다고한다]

 

이렇게 다른 암호화명으로 찾는듯 하다

+ Recent posts