Cpp (35) 썸네일형 리스트형 템플릿(template) 템플릿은 C++ 언어의 특징 중 하나인 일반화 프로그래밍이 지원하는 대표적인 기능 중 하나이다. 일반화 프로그래밍은 데이터를 중시하는 객체 지향 프로그래밍과는 달리 프로그램의 알고리즘에 중점을 둔다. 템플릿 템플릿은 매개변수의 타입에 따라 함수나 클래스를 생성하는 메커니즘이다. 템플릿은 타입이 매개변수에 의해 표현되므로, 매개변수화 타입이라고 불린다. 템플릿을 이용하여 타입별 함수나 클래스를 만들지 않고, 여러 타입에서 동작할 수 있는 하나의 함수 혹은 클래스를 작성 가능하다. 함수 템플릿 // 문법 template 함수 원형 { // 정의 } typename 키워드 이전에는 class 키워드를 사용하였고, 현재도 typename 과 class 를 같은 것으로 간주한다. // 함수 템플릿 template.. 콜백 함수 기본적인 함수들은 어느 때에 맞춰 불려진다. 그런데 때때로 어떠한 신호에 의해 정해놓지 않은 시기에 함수가 호출되는데, 이를 콜백 함수라고 하며, 프로그래밍에서는 인수로 함수 포인터를 받아서 사용할 수 있는데 이때 함수 포인터가 가리키는 함수가 callback 이다. int Sum(int a, int b) { return a+b; } int Cal(int a, int b) { return a*b; } int Func(int a, int(*pf)(int,int)) { return pf(a,a+5); } int main() { cout 허상 포인터(댕글링 포인터) 댕글링 포인터? 해제된 메모리 영역을 가리기는 포인터를 댕글링 포인터라고 한다. int *a = new int(10); int *b = a; cout L-value, R-value L-value, R-value 는 c++11 이전과 이후로 개념을 다르게 잡는다. c++11 이전에는 연산에서 왼쪽에 존재 할 수 있는 값, 오른쪽에 존재해야하는 값으로 L-value, R-value를 나눌 수 있다. c++11 이후에도 맞는 말이지만 좀 더 추가된 개념이 있다. lvaue 등호의 왼쪽과 오른쪽 전부 존재 가능 식별자를 가지고 있다. 해당 문장을 벗어난 후 사용 가능하다. 주소 연산자로 주소를 구할 수 있다. 참조를 리턴하는 함수. rvalue 등호의 오른쪽에만 존재 가능. 식별자가 없다 해당 문장에서만 사용 주소 연산자로 주소를 구하는게 불가능하다. value 를 리턴하는 함수, 임시객체 등등 int a = 0; int b = 25; // a,b 는 Lvalue로 식별자를 가지는 변수로.. 스마트 포인터 포인터 변수를 통해 동적할당 했을 때에는 항상 해제를 해주어야한다. 그래서 c++ 에서 new를 배울 때는 delete 키워드를 같이 공부한다. 그런데 여러 경우에서 할당한 메모리를 해제하지 못하는 경우가 생긴다. 실수로 delete 를 넣지 않았을 때도 있고, 예외처리 과정에서의 delete 선언을 부분적으로하여 메모리 누수가 생기는 경우 등이 있다. void remodel(std::string& str) { std::string * ps = new std::string(str); str = *ps; // delete ps; // 실수로 주석처리를 해버렸다! return; } void remodel2(std::string& str) { std::string* ps = new std::string(str.. 얕은 복사 깊은 복사 얕은 복사 값, 주소만 복사한다. 깊은 복사 복사 시 메모리를 새로 할당한 후 포인터가 가리키는 주소의 값을 넘겨준다. 모든 클래스는 디폴트 복사 생성자를 가지고 있다. #include #include #include #include using namespace std; class A { public: int* numP = nullptr; int num = 5; // 얕은 복사 /*A(const A& a) { this->numP = a.numP; this->num = a.num; }*/ A(int& c) { numP = &c; } // 깊은 복사 A(const A& a) { this->num = a.num; // 매개변수 a의 numP가 널값이 아닐 때 if (a.numP != nullptr) { thi.. 함수 포인터 변수와 같이 함수도 선언한 후 실행하면 CPU에서 메모리에 주소가 할당된다. 함수의 이름은 함수의 주소를 담고 있다. int Add(int a, int b) { return a + b; } int main(void) { cout 포인터 변수를 초기화한 뒤 실행하면 CPU에서 RMA의 메모리의 어느 위치 해당 변수가 설정된다. 그리고 변수에 사용할 때마다 설정된 메모리의 주소를 접근한다. 포인터는 메모리의 주소를 저장하는 변수이다. 포인터 변수는 변수 선언에서 자료형과 식별자 사이에 *를 넣는다. 이때, *는 곱셈과는 다르게 단항연산이다. (곱셈의 * 는 이항 연산이다.) 포인터의 *를 역참조 연산자라고 부른다. 포인터 변수가 주소를 저장하기 위해서는 넘겨줄 주소를 설정해줘야하는데 주소연산자 &를 사용한다. // 일반적인 변수 선언 int num = 0; // int 형 자료의 주소를 받는 포인터 선언이다. int *p = # // 여기서 *는 역참조 연산자로 곱셈과는 다르다. // &는 주소 연산자로 비트 연산과는 다르다. 참고.. 이전 1 2 3 4 5 다음