Programming/C++ STL2014. 4. 16. 17:14
펑터
c++의 객체중 컨스트럭터를 이용하여 마치 함수처럼 사용할 수 있는 객체를 의미하는데..
kdlp문서를 참고하여 고민을 해보니
동적 타입 바인딩일 통해(템플릿?) 타입에 특화되어 더욱 빠르게 타입별 inline으로 변환될 수 있는
특수한 형태의 클래스라고 생각이 되어진다.

[링크 : https://kldp.org/node/58727]
[링크 : http://printf.egloos.com/1807595]
[링크 : http://frompt.egloos.com/2415603]
[링크 : http://en.wikipedia.org/wiki/Function_object]
[링크 : http://en.wikipedia.org/wiki/Functor_(C++)]



람다
원래 함수언어에서 사용하던 녀석인데.. 여전히 멀하는 녀석인지 모르겠지만..
C++에서는 펑터로 사용하는게 귀찮아서 이를 더욱 간편하게 사용하는 용도로
이름이 없는 객체 식으로 운영되는걸로 들었는데... 써보질 않으니 알수가 없다. ㅠㅠ

[링크 : http://frompt.egloos.com/2767144

'Programming > C++ STL' 카테고리의 다른 글

std::endl  (0) 2015.06.24
c++ 현변환 연산자(cast operator in c++)  (0) 2015.01.26
cpp static 변수 및 메소드  (0) 2014.03.18
cpp scope 연산자  (0) 2014.03.18
cpp class에서 변수값을 미리 선언 못하는 이유  (0) 2014.03.15
Posted by 구차니
Programming/C++ STL2014. 3. 18. 13:05
static 멤버 변수는 클래스 공용변수로 적용되며(global shared variable scope on class)
static 멤버 메소드는
객체로 생성하지 않아도(new) 실행이 가능한 함수이다.

일단.. static 멤버 변수는
아무래도... 공용데이터로 인해서 동기화나 데이터 의존성이 문제가 될 수 있으므로 되도록이면 안쓰는게 좋을것 같고
static 멤버 메소드는 instance 로 만들지 않고 객체 단위로 함수들을 정리할때 유용할 것으로 생각된다.

They cannot access nonstatic class member data using the member-selection operators (. or –>).
They cannot be declared as virtual.
They cannot have the same name as a nonstatic function that has the same argument types.

[링크 : http://msdn.microsoft.com/ko-kr/library/yyh8hetw.aspx] 멤버 메소드
[링크 : http://msdn.microsoft.com/ko-kr/library/s1sb61xd.aspx] 멤버 변수

함수 인자나 지역변수는 스택에 생성되고
static 변수는 data 영역에 선언되므로
data 영역에는 프로그램이 실행중에는 스택과 같이 임시로 사용되는게 아니기에 데이터가 유지되는 특징을 지닌다.

[링크 : http://sfixer.tistory.com/30

'Programming > C++ STL' 카테고리의 다른 글

c++ 현변환 연산자(cast operator in c++)  (0) 2015.01.26
functor / 펑터  (0) 2014.04.16
cpp scope 연산자  (0) 2014.03.18
cpp class에서 변수값을 미리 선언 못하는 이유  (0) 2014.03.15
cpp 와 java의 차이점(문법)  (0) 2014.03.14
Posted by 구차니
Programming/C++ STL2014. 3. 18. 10:11
cpp에 scope 연산자를 이용하면
클래스 내의 변수에 접근하는데 사용할 수 있으나 (class::variable 혹은 class::memberfunc)
클래스가 아닌 곳에서 그냥 ::만 사용할 경우 글로벌 변수를 접근할 수 있다.

int error;
void Error(int error)
{
    if(::error != 0) ; // global error
}
[링크 : http://www.pragsoft.com/books/CppEssentials.pdf] 62쪽

'Programming > C++ STL' 카테고리의 다른 글

functor / 펑터  (0) 2014.04.16
cpp static 변수 및 메소드  (0) 2014.03.18
cpp class에서 변수값을 미리 선언 못하는 이유  (0) 2014.03.15
cpp 와 java의 차이점(문법)  (0) 2014.03.14
cpp 디폴트 매개변수  (0) 2014.03.12
Posted by 구차니
Programming/C++ STL2014. 3. 15. 17:04
struct에서 변수값 주던가?
즉, class 역시 struct로 구현되기에 class 에 실제 값을 넣어줄 수 없다.

cpp는 c의 확장형이기에
멀 하던 c를 잊을수가 없네 ㅠㅠ 

아무튼 이렇기에
cpp class는 생성자에서 값을 초기화 하고
const형의 경우에는 member initialize list를 통해서 초기화 해주도록 한다. 

'Programming > C++ STL' 카테고리의 다른 글

cpp static 변수 및 메소드  (0) 2014.03.18
cpp scope 연산자  (0) 2014.03.18
cpp 와 java의 차이점(문법)  (0) 2014.03.14
cpp 디폴트 매개변수  (0) 2014.03.12
c -> cpp 추가사항  (0) 2014.03.10
Posted by 구차니
Programming/C++ STL2014. 3. 14. 00:11
이런거 비교가 의미가 있나 싶긴 하지만..


클래스 멤버 변수
cpp - const static 외에는 class 멤버 변수에 값을 주고 클래스를 생성할 수 없다. 
error C2864: 정적 상수인 정수 계열 데이터 멤버만 클래스 내부에서 초기화될 수 있습니다.
[링크 : http://msdn.microsoft.com/ko-kr/library/acxkb76w.aspx ] 

동적 바인딩
cpp - 자바처럼 작동 시키려면 오버로딩시 virtual로 선언하여야 함
java - 오리지널 객체의 형을 추적함

클래스 메소드와 클래스 멤버 변수명의 중복
cpp - 식별자로서 변수와 메소드의 중복 허용하지 않음
java - 동적 바인딩(?)으로 인해 구분이 가능하므로 멤버 변수와 멤버 메소드가 동일한 명칭이 가능함 

가변인자 
cpp - 타입에 민감하지 않아 ... 로 선언되는 가변인자에 다양한 타입을 받을 수 있음
java - JDK1.5 이후 지원하며 타입대로만 입력을 받아야 함

Abstract, interface(implement) vs virtual
cpp - virtual 키워드를 통해 상속받는 쪽에서 오버라이드를 강요하도록 사용함
java  - 다중상속의 잇점을 누리기 위해 java에서는 interface를 제공함

'Programming > C++ STL' 카테고리의 다른 글

cpp scope 연산자  (0) 2014.03.18
cpp class에서 변수값을 미리 선언 못하는 이유  (0) 2014.03.15
cpp 디폴트 매개변수  (0) 2014.03.12
c -> cpp 추가사항  (0) 2014.03.10
오버로딩 / 오버라이딩  (0) 2014.03.10
Posted by 구차니
Programming/C++ STL2014. 3. 12. 17:28
cpp에서 제공하는 디폴트 매개변수는 가변인자와 묘하게 섞여있는 느낌이다.

void test(int a = 1, int b = 2, int c = 3);

test();
test(1);
test(1,2);
test(1,2,3); 

인자 갯수보다 적게 입력이 가능하면서
생략된 인자에 대해서는 기본값으로 초기화를 수행한다.

[링크 : http://printf.egloos.com/1770599]

'Programming > C++ STL' 카테고리의 다른 글

cpp class에서 변수값을 미리 선언 못하는 이유  (0) 2014.03.15
cpp 와 java의 차이점(문법)  (0) 2014.03.14
c -> cpp 추가사항  (0) 2014.03.10
오버로딩 / 오버라이딩  (0) 2014.03.10
try - throw - catch  (0) 2014.03.05
Posted by 구차니
Programming/C++ STL2014. 3. 10. 13:00
변수형
bool - true / false

함수 확장
class - class / friend / virtual / overriding
template - template / overloading

상속/객체
const 키워드 확장 (컴파일러 레벨에서의 함수내 값변경 방지)
static 키워드 확장 (java의 private?)

포인터 확장
this
& (reference) 

예외처리
try
catch
throw 


constructor (create triggered action) / destructor (remove triggered action) 를 통해 자동화를 지원
기존의 static 을 통한 파일 단위의 접근 제어에서 클래스 단위 접근 제어 확장
try-catch-throw를 통한 goto 문의 사형선언
overloading과 template을 통한 개발의 용의함(overloading을 통한 타입의 identifier화) 

이런게 c와 cpp을 구분짓는 가장 큰 요소인것 같다. 

'Programming > C++ STL' 카테고리의 다른 글

cpp 와 java의 차이점(문법)  (0) 2014.03.14
cpp 디폴트 매개변수  (0) 2014.03.12
오버로딩 / 오버라이딩  (0) 2014.03.10
try - throw - catch  (0) 2014.03.05
연산자 오버로딩  (0) 2014.03.04
Posted by 구차니
Programming/C++ STL2014. 3. 10. 12:49
오버로딩은 동일 이름의 함수에
인자의 갯수나 타입에 따라서 다르게 작동하도록
함수를 중첩/중복 시킨다.

over load + ing에 걸맞게
함수명 중복정의 이런식으로 했으면 좀 쉬웠으려나?

2013/03/04 - [Programming/C++ / STL] - c++ function overloading


그리고 오버라이딩은
상속관계에서 이전에 정의된 함수를 갈아 엎고
함수 이름과 인자가 동일하지만 작동을 전혀 다르게 할 경우 사용한다.

over ride + ing 을 함수 재정의 라고 하기도 한다.

일단.. overloading은 능동형이고 짐을 더 올려주는 느낌이라면
overriding은 피동형(올라타버림) 이고 주도권을 빼앗겨지는 느낌

load와 ride의 느낌이 비슷해서 였을까..
왜 예전에는 두개가 이렇게 헷갈렸을까 ㅠㅠ 

'Programming > C++ STL' 카테고리의 다른 글

cpp 디폴트 매개변수  (0) 2014.03.12
c -> cpp 추가사항  (0) 2014.03.10
try - throw - catch  (0) 2014.03.05
연산자 오버로딩  (0) 2014.03.04
c++ explicit  (0) 2014.02.28
Posted by 구차니
Programming/C++ STL2014. 3. 5. 22:49
java와 같은 그런 정교한 예외처리는 아닌거 같아서 조금 실망
물론..cpp가 java보다 거의 20년 전 꺼라는걸 감안하면...

아무튼.. try{} 안에 문제점이 될 부분에서
문제점에 대한 if문을 하고 throw를 통해 (물론 타입별로 catch 문을 중첩가능함) 제어의 흐름을 통일 시킨다.
과거에는 수 많은 return문으로 구현하거나
에러발생시 끝부분으로 goto 하는걸 문법적으로 깔끔하게 구현한 셈

#include < iostream >
using namespace std;
int main(int argc, char **argv)
{
		int a = 12;
		int b = 1;
		double c = 0;

		try
		{
			if(b == 0) throw(b);
			else throw(c);
		}
		catch(int e)
		{
			cout << "divide by zero. throw " << e << endl;
		}
		catch(double e)
		{
			cout << "good job. throw " << e << endl;
		}

        return 0;
}

스탠다드 라이브러리로 존재한다.
#include <exception>
[링크 : http://www.cplusplus.com/reference/exception/exception/ ] 

'Programming > C++ STL' 카테고리의 다른 글

c -> cpp 추가사항  (0) 2014.03.10
오버로딩 / 오버라이딩  (0) 2014.03.10
연산자 오버로딩  (0) 2014.03.04
c++ explicit  (0) 2014.02.28
c++ class / const member variable & function  (0) 2014.02.28
Posted by 구차니
Programming/C++ STL2014. 3. 4. 23:10
연산자 오버로딩은 2가지 방법으로 사용이 가능한데
1. 외부함수를 friend로 허용 (2항)
2. 내부함수로 구현(1항)


외부 함수의 경우 2개의 값이 있어야 연산이 가능하기에 인자가 두가지 들어가지만
내부 함수로 구현할 경우 자기 자신을 기준으로 다른 값을 연산하기에 하나의 값만 받게 된다.

#include < iostream >

using namespace std;

class temp
{
public:
        int a;

        temp(int b) : a(b) {}
        int operator+(int b, int c) { a += b; return a; }
};

int main(int argc, char **argv)
{
        temp tt(1);
        cout << tt + 3;

        return 0;
}

위 소스는 의도적으로 내부함수에 대해서 2개의 인자를 주고 생성한 것이라 에러가 발생한다.
VS2008
 error C2804: 이항 'operator +'에 매개 변수가 너무 많습니다.

G++
 error: ‘int temp::operator+(int, int)’ must take either zero or one argument 


정상작동하는 소스, int operator+는 멤버함수로 구현 friend int operator+는 외부함수/friend 로 구현
#include < iostream >

using namespace std;

class temp
{
public:
        int a;

        temp(int b) : a(b) {}
//      int operator+(int b) { a += b; return a; }
        friend int operator+(temp t, int b)
        {
                t.a = t.a + b;
                return t.a;
        }
};

int main(int argc, char **argv)
{
        temp tt(1);
        cout << tt + 3;

        return 0;
}

'Programming > C++ STL' 카테고리의 다른 글

오버로딩 / 오버라이딩  (0) 2014.03.10
try - throw - catch  (0) 2014.03.05
c++ explicit  (0) 2014.02.28
c++ class / const member variable & function  (0) 2014.02.28
deep copy / shallow copy < object copy  (0) 2014.02.27
Posted by 구차니