반응형

프로그래밍/cpp 46

연산자 오버로딩 C++

일반적인 연산을 살펴보면 오버로딩과 비슷한 규칙을 살펴볼 수 있다. 피연산자의 타입이 달라지더라도 알아서 계산이 된다는 것이다. 예를들어 정수+정수 의 연산결과는 정수가 되고, 실수+실수 의 연산결과는 실수가 된다. 이렇게 피연산자의 타입을 알아서 체크하고 그에 맞는 +연산을 하는 것은 마치 함수가 인수의 타입에 따라서 작동하는 오버로딩과 비슷하다 볼 수 있다. 이렇게 살펴본 사실은 실제로 사실이다. 다시말해 '+'는 피연산자의 타입에 따라서 오버로딩 되어있다. 하지만 char*타입과 같은 문자나 클래스 타입에 대해서는 작동하지않는다. 그렇다면 사용자가 직접 이런 연산자들을 오버로딩하는 법이 있을까? 15~18라인은 연산자 오버로딩코드이다. 일반적인 함수의 선언과 비슷한데 눈여겨볼 점은 호출시의 모양이다..

프로그래밍/cpp 2014.03.19

복사 생성자 - 얕은복사 깊은복사 C++

C++에서 생성자의 주된 임무는 클래스 멤버 변수의 초기화 일 것이다. 이러한 생성자는 기본적으로 인수의 유무에 따라서 인수의 형태에 따라서 몇가지 이름을 붙인다. 기억해둘 생성자에는 디폴트 생성자, 복사 생성자가 있고 결국 생성자이고, 형태 또한 생성자의 형태에서 벗어나지 않는다. 그러면 왜 이렇게 구분해 놓은 것인가? 그러면 생성자의 형태를 살펴본 후 이야기하자. 아주 간단한 클래스와 생성자를 만들었다. 생성자의 기본적인 형태는 위 코드처럼 반환타입이 존재하지않고, 클래스의 이름과 똑같다. 그 외에는 일반적인 함수의 형태를 띠게된다. 생성자는 생성자라는 이름처럼 객체의 생성과 동시에 호출이 되게 되어있다. myClass A; 는 myClass A = myClass(); 와 동일한 구문이다. 해석하자면..

프로그래밍/cpp 2014.03.18

디폴트 복사 생성자(얕은복사,깊은복사)

디폴트 복사 생성자(얕은복사,깊은복사), gcc 4.8.1 버전 과연 얕은 복사가 되는걸까? 먼저 문제를 발견하기 위해서 얕은복사가 되는지 코드를 먼저 짜보았다. 참고는 예전에 듣던 유명한 c++강의의 소스를 참조를 했다. 오래전 강의라 그런가? deprecated 경고가 난다. 2014/01/10 - [프로그래밍/c++] - deprecated conversion from string constant to 'char*' 이경우 char * 를 const char *로 바꿔주면 된다. 아래처럼.. 전부다바꾸면 안되고 밑줄 친 부분만 바꿔준다. 그럼 아래처럼 성공적으로 컴파일된다. 그럼 과연 얕은 복사가 되었나? 아무런 조치도 취하지 않았는데 깊은 복사가 되었다. 새로운 컴파일러의 승리인가? 주소값을 체크..

프로그래밍/cpp 2014.01.10

가상함수(2)

가상함수(함수내 함수호출,함수내 가상함수호출),함수 전달인자 이번 포스팅은 가상함수의 동작을 조금 더 깊게 들어가보기로 하겠다. 2014/01/04 - [프로그래밍/c++] - 가상함수(virtual),vptr,vtable C++ 2013/06/04 - [프로그래밍/c++] - 가상함수 virtual 키워드 C++ 전시간에는 가상함수 테이블에 관련하여 내부적으로 가상함수가 어떻게 동작하는지 살펴보았다. 유연한 프로그래밍을 위해서는 이런 내부적인 동작을 머리속에 넣어 두고 있으면 많은 도움이 된다. 이번시간또한 내부적인 동작을 다뤄볼 텐데, 클래스내부의 함수로 (가상)함수를 호출하는 경우를 다뤄볼 것이다. 함수의 상속과 호출이 어떤식으로 이뤄나는지에대해서 살짝 깊게 들어가려한다. 사실 함수의 상속은 단순히..

프로그래밍/cpp 2014.01.07

가상함수(virtual),vptr,vtable C++

가상함수 그리고 vptr,vtable 가상함수란 클래스 타입의 포인터로 멤버함수를 호출할 경우 동작하는 함수를 말하는데 함수의 선언앞에 virtual 키워드가붙은 함수를 말합니다. 가상함수라는 언어적인 측면으로 이해하기에는 다소 무리가 있기때문에 가상함수란 뜻의 의미보다는 가상함수란 무엇인가를 알아야 하겠습니다. 관련링크 2013/06/04 - [프로그래밍/c++] - 가상함수 virtual 키워드 C++ 위 관련링크에 가상함수에 대한 기본적인 설명이 있습니다. 이번 포스팅은 vtable에 대해서 이야기를 해볼까합니다. vtable을 설명하기에 앞서 정적결합과 동적결합에 대해서 알아야하셔야하는데요. 위 링크에선 간략하게 설명했습니다. 정적바인딩은 클래스타입의 포인터에 따른 결합이고 동적바인딩은 클래스타입..

프로그래밍/cpp 2014.01.04

함수포인터(1)

일반적으로말하는 변수포인터의 개념을 어느정도 파악했다면, 함수포인터 또한 같은 맥락으로 이해하면 어렵지 않다. 2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1) 함수명은 함수의 시작번지를 나타내는 포인터역할을 한다. 여기서 func는 포인터인 것이다. 우리는 func라는 함수명과 동등한 포인터를 선언을 할 것이고 그것이 pf 이다. *구두점을 통해 pf라는 포인터 변수를 선언하였고, pf의 타입은 위 선언처럼 반환값이 int이고, 두개의 int인수를 가지는 함수타입이 된다. 느낌이오면 함수포인터의 선언도 일반적이 변수포인터의 선언과 다르지 않다는걸 알 수 있다. 타입을 명시하고 포인터 선언을 한 것이다. 이중포인터를 선언하고싶다면 구두점**를 붙이면되고, 배열을 선언하고싶다..

프로그래밍/cpp 2014.01.02

MinGw을 사용해보자

MinGw은 GCC를 윈도우에서 사용할수있게 해주는 도구모음입니다. 뭐 그밖에 여러가지 도구들이 있죠 MSYS같은. 어쨋은 GCC를 사용하기위해 MinGw를 설치하는데요. 에디트플러스에 맞물려 사용해보려합니다. 우선 MinGw홈페이지에가서 다운로드를 합시다. 실행을 하게되면 필요에 맞는 도구를 선택하고 설치하면됩니다. http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download 에디티 플러스도 설치를 해주시구요. 윈도우 실행창에서 시스템 환경 변수 편집을 쳐서 찾습니다. 환경변수(N)...에 가셔서 시스템 변수(S) 중 path 항목에가서 아래 추가를 해줍니다. 추가값은 자신의 MinGw 설치위치에따라 달라집니다. 여..

프로그래밍/cpp 2013.11.28

3항연산자

A?B:C; 위 식은 3항연산자의 기본형태다. A가 참이면 B 거짓이면 C로 가라는 의미다. 특징을 좀더 살펴보면 ? 뒤의 문장과 :뒤의 문장은 if esle 문과 비슷하다. else문이 스위치형식으로 거짓인경우 실행되고 참인경우 실행안되는 것 처럼 말이다. 그럼아래식을 보고 이야기하자. A?B,B':C:C'; 여기서 B'와 C'는 조건에 대한 결과와는 상관없다. 여기서 if else문과 좀 다른 특징이 눈에 뛰는데 A가 참인경우 B와 B'가 실행된다. 그리고 C'가 실행된다. 하지만 A가 거짓인경우? B' 가 실행되는가? 그렇지않다 이경우 C와 C'가 실행된다. 이는 if else문의 성격을 띠지만 ,연산자가 쓰이게되면 goto문의 특징을 갖게된다는것이다. 결국 A가 참인경우 C는 실행이 안되므로 결론..

프로그래밍/cpp 2013.06.17

클래스 내부의 static 에 관한 고찰

static 멤버함수는 this객체를 받지않는다.(static은 사용범위가 지정되어 있기때문이다. static멤버함수의 경우 사용범위는 클래스가 생성한 객체가아닌 클래스 전반적으로 사용하는 함수, 다시말하면 클래스의 static 멤버를 다루는 함수라 봐도 좋다) 때문에 static 멤버함수는 클래스형에 의해서 호출되는 함수다. 객체를 통해 호출하려고해도 그 객체의 클래스형만 살펴본 후 맞다면 호출한다. static이 아닌 멤버의 경우 함수내에서 this의 호출을 통해 이루어진다. 기본적으로 this가 전달된후 컴파일러상에서 this로 접근한다. 그렇기때문에 static 멤버변수가 아닌 변수를 접근하는건 불가능하다. 또산 static 선언은 목적파일 링크시에 알리지않는다는 뜻이다.(선언된 파일 내부에서만 ..

프로그래밍/cpp 2013.06.13

객체지향의 시작 첫번째글

객체지향은 왜 시작되었을까.. 그리고 왜 필요한것일까. C언어를 공부하다 C++을 접하게되면 객체지향의 필요성에대해서 의문을 가지게된다. C언어의 순차적이고 직관적인 문법에비해, 이론만으론 추상적인 개념들에 왜 필요한지 적용하는방법에대해서도 서툴기만하다. 프로그래밍을하면 크게 변수, 함수, 그리고 제어구문 이렇게 큰틀의 반복이다. 전부 변수를 다루기위한것이다. 이런변수를 다루면서 코드의 길이가 길어지면 변수도 많아지고 함수도많아지고 지역변수도많아지고 점점 헷갈리게된다. 또한 전역적으로필요한 변수도 동류끼리 구분지어질 필요가 있을경우가있다. 객체지향은 이런 변수와 함수를 잘사용하기위해 필요하지않을까 생각한다. 객체지향의 이점중 한가지가 계통정리를 통해 동류의 변수들을 묶을 수 있다는 것이다. 또한 이런 동..

프로그래밍/cpp 2013.06.12
반응형