반응형

프로그래밍/cpp 46

우측값 참조 [C++11]

우측값 참조는 C++11에서 생긴 개념이다. 좌측값 참조는 우리가 흔히 알고 있는 참조를 말한다. 흔히 수식에서 Rvalue, Lvalue로 데이터의 상태를 나타내는데 일반적인 변수는 Lvalue, 상수나 임시객체(값)은 Rvalue가 된다. 예를 들어 int a = 3; int b = 4; int c = a+b; int d = 3;// 여기에서 a, b c, d는 Lvalue가 되고, a+b, 3은 Rvalue가 된다. Lvalue는 수식의 계산이 끝난 후에도 지속적으로 존재하는 변수들이고, 3이란 값이나 a+b는 Rvalue로 임시 객체내에서 존재하다가 식의 계산이 끝난 후 임시객체는 파괴된다. 우측값 참조 우리가 흔이 알고 있는 참조는 좌측값 참조다. 이런 일반적인 참조의 경우는 우측값을 참조할 수..

프로그래밍/cpp 2015.10.24

explicit 키워드와 변환 생성자

변환 생성자의 조건은 생성자의 인수가 1개다. 기본 자료형들 간의 대입과 암시적인 형변환을 생각하면 쉽게 이해된다. 변환생성자의 역할이 바로 이런 형 변환인데, 변환 생성자의 경우는 명시적으로 사용할 것은 권고 한다. 명시적으로 사용하기 위해서는 explicit 키워드를 생성자에 붙이면 된다. 왜 명시적으로 사용해야 되는지는 몇 가지 예를 보면 쉽게 이해할 수 있다. 변환 생성자 Test(int a)는 변환 생성자다. 이 녀석의 역할은 int형 자료형을 Test형 객체로 변환한다. Test(char s) 또한 변환 생성자다. 마찬가지로 char형 자료형을 Test형 객체로 변환해 준다. 위 코드는 문제가 없이 잘 실행 된다. 그러면 여기서 클래스 내부의 생성자 Test(char s)를 없애면 결과가 어떻..

프로그래밍/cpp 2015.10.08

복사 생성자의 인수는 왜 레퍼런스를 사용하나?

복사 생성자는 클래스의 객체를 생성할 때 이미 존재하는 동일 클래스의 다른 객체를 그대로 복사하기 위해 필요하다. 클래스는 일종의 데이터 집합이다. 이 데이터를 다루는 도구인 멤버함수는 동일 클래스의 객체라면 공유를 하는 개념이기 때문에 객체의 복사에 있어서는 데이터(멤버변수)의 복사만 생각하면 된다. 왜냐면 데이터의 경우는 객체마다 고유하기 때문이고, 이를 공유하면 문제가 발생하기 때문이다.(예를 들어 특정 객체의 파괴 시 데이터를 공유할 경우 문제 발생). 따라서 C++문법에서 복사 생성자를 다룰 때 항상 따라다니는 문제인 얕은 복사와 깊은 복사에 관한 이야기가 중요한 문법적 주제가 된다. 초심자에게는 포인터와 메모리에 대한 개념이 확실히 이해되고 난 후에 이해할 수 있는 난코스라고 생각하면 된다. ..

프로그래밍/cpp 2015.10.05

friend 키워드-연산자 오버로딩을 위한 사용 [C++]

드물게 사용되는 키워드 중 하나인 friend 키워드는 클래스의 멤버변수에 대한 접근 권한을 주는 키워드인데, 사실 캡슐화 측면에서 바람직하지 않게 보이기도 한다. friend키워드를 꼭 사용하지 않아도 getter함수나 setter 함수를 제공함으로써 충분히 멤버변수에 접근할 수 있다. 그래도 가끔은 friend 키워드를 사용할 때가 더 깔끔하고 가독성이 좋다. friend 키워드의 사용방식 friend는 접근에 관한 키워드므로 상식적으로 주체가 되는 클래스가 외부 클래스나 외부 함수에 허용해주는 형태가 되어야 한다. friend로 지정된 클래스나 함수는 제한 없이 멤버변수에 접근할 수 있다. Class간 사용 예> extern 과 비슷하게 사용된다. 외부의 클래스가 자신의 멤버변수에 접근 가능하도록 ..

프로그래밍/cpp 2015.07.22

C++11 람다 표현식(lamda expression)

C++11에 등장한 람다 표현식은 함수를 별도 선언 없이(이름 없이) 인라인으로 사용하게 해준다. 람다 표현식은 기본적으로 함수의 내부에서 사용할 수 있는데, 사용 방법은 다음과 같다. 람다의 기본 문법 예 캡쳐 블록 외부 변수를 사용(캡쳐)한다 사용 예) [], [=], [&], [&x, y], [=,&y] … [] - 캡쳐블록이며 생략할 수 없다. 외부 변수를 사용하지 않는다는 뜻이다. 기본적으로 []로 시작하면 람다식임을 나타낸다. [=] - 는 값을 복사하여 사용 [&]는 참조하여 사용, 특정 변수를 쓰지 않으면 전체를 참조 또는 복사한다는 뜻이다. [&x, y] - x는 참조하여 사용 y는 복사하여 사용한다는 뜻이다. [=, &y] - 모두 복사하여 사용하는데, y만 참조하여 사용한다는 뜻이다...

프로그래밍/cpp 2015.07.14

서로 다른 번역 단위에 정의된 전역 객체들의 초기화 순서 [C++]

이 문제는 스캇 마이어 저 ' effective c++' 에서 언급된 내용으로 제 4항 객체를 사용하기 전에 반드시 그 객체를 초기화하자. 라는 문항의 내용을 참조하길 바랍니다. 책에서 깊게 논의된 내용은 아니라 직접 실험을 통한 검증과 그 예를 정리함에 의의를 둔다. 이 문제를 바라보는 바람직한 시각은 추상적인 생각보다는 물리적인 컴파일 과정을 떠올리는 것이 중요하다. 컴파일과 링크 과정에 벌어지는 객체의 초기화와 참조 과정은 분명 물리적 순서가 있기 때문이다. 하지만 여러 모듈 사이에서 물리적 순서를 결정하여 컴파일 하는 것은 쉬운 일이 아니다. 또한, 이런 물리적 순서로 인해 발생하는 문제도 생길 수 있다. 이런 문제로 전역객체의 사용은 꼭 필요한 경우가 아니면 권장하지 않는다. 다음은 전역변수의 ..

프로그래밍/cpp 2015.07.11

타입 세이프한 열거 타입 enum class <c++11>

데이터의 집합을 읽어 들일 때 인간은 문자를 컴퓨터는 숫자를 선호한다. 이를 위한 형태가 enum이라는 열거 타입인데, C언어 문법이고, 타입 세이프하지는 않다. 이에 반해 c++11에 등장한 enum class는 타입 세이프한 녀석이다. enum enum은 내부에 열거된 변수에 0부터 차례대로 숫자를 입힌다. 물론 도중에 값을 변경시켜도 된다. 변경된 수 다음 수는 변경된 수를 기준으로 1식 증가된다. enum 활용 예 컴파일은 되지만 문제가 되는 부분은 if(mine==yours)를 비교하는 부분이다. 서로 다른 종류의 값들을 다루지만 서로 비교가 가능하다. 이는 타입 세이프 하지 않다는 것을 반증한다. myType과 yourType은 의도대로 라면 다른 종류의 값들이어야 한다. 하지만 enum은 내..

프로그래밍/cpp 2015.07.07

부모클래스의 멤버변수 초기화

자식 클래스에서 부모의 멤버변수를 초기화하여 사용하고 싶을 경우는 멤버 초기화리스트(멤버이니셜라이져)의 사용이 필수다. 초기화하는 방법에 앞서, 상속에 관한 이해가 필요하다. 클래스는 그 클래스의 속성을 표현하는 데이터들의 집합이다. 함수는 그 데이타에 대한 작업을 하는 도구다. 클래스의 객체를 생성하여 객체가 차지하는 메모리 공간의 크기를 재보면 멤버변수의 사이즈의 합과 같다. 함수가 얼마나 많든지 간에 객체의 크기는 멤버변수만의 총 사이즈다. 2015/04/28 - [프로그래밍/c++] - [C++]멤버이니셜라이져(멤버초기화리스트) 다음은 부모클래스와 상속관계에 있는 클래스의 객체를 생성하여 그 크기를 출력하는 코드다. 너무 당연한 결과다. circle의 멤버변수는 int형 num 하나로 4byte,..

프로그래밍/cpp 2015.04.29

[C++]멤버이니셜라이져(멤버초기화리스트)

멤버 초기화 리스트(Mmber Initialization List)라고한다. 생성자의 역할인 멤버변수의 초기화를 대신할 수 있다. 보통 멤버 이니셜라이져라고 부르는데 꼭 사용해야 하는 경우는 4가지가 있다. 1. 상수 멤버의 초기화 (C++11의 경우는 상수멤버변수 선언과 동시에 그냥 초기할 수 있음.) 2. 레퍼런스 멤버 초기화 3. 객체멤버의 초기화 4. 부모클래스의 멤버변수초기화 1, 2, 3번은 비슷한 맥락에서 이해될 수 있다. 4번의 경우는 상속과 객체생성 메커니즘에 대해 잘 이해해야 이해할 수 있다. 2015/04/29 - [프로그래밍/c++] - 부모클래스의 멤버변수 초기화 멤버이니셜라이져 문법 아래는 일반적인 멤버 초기화 방법이다. 아래는 멤버 이니셜라이저 문법을 사용하였다. 두 경우 결과..

프로그래밍/cpp 2015.04.28

[C++11]바인더, std::bind, std::function, std::spaceholder::_1, bind1st, bind2st

바인더는 STL 함수 어댑터다. std::bind는 C++11에서 표준으로 제공하는 바인더로 기존의 bind1st, bind2st 보다 다양한 활용을 할 수 있는 어댑터다. 기존의 bind1st, bind2st는 두 개의 파라미터를 갖는 객체함수의 파라미터를 고정시켜 주는데, bind1st는 첫 번째 파라미터를 bind2st는 두 번째 파라미터에 고정값을 준다. 일반적으로 bind1st와 bind2st는 STL 이항 함수자(함수객체)를 단항으로 바꾸는데 쓰인다. 다시말해 들어 비교를 하는 STL 함수 객체(함수자) equal_to, not_equal_to, less, greater,.....등을 단항함수로 만든다. 위 코드를 분석해보자. bind1st는 이항함수자를 단항함수자로 만들어 반환한다. bind..

프로그래밍/cpp 2015.04.25
반응형