반응형

Programming Tools/C++ 15

[C++] 함수의 값, 참조, 주소 반환 (Returning values by value, reference and address)

값의 반환 Return by value 복사본이 호출자에게 반환된다. 리터럴, 변수, 표현식을 반환할 수 있다. 범위 지정 문제를 걱정할 필요가 없다. 함수가 반환되기 전에 지역 변수가 평가되고, 값의 복사본이 호출자에게 반환된다. 값으로 반환을 사용해야 하는 경우: 함수 내에서 선언된 (지역)변수를 반환할 때 값으로 전달된 매개 변수를 반환할 때 아래 예제를 통해서 복사본이 전달됨을 확인해보자. #include using namespace std; int doubleValue(int x){ int value = x * 2; cout

[C++] Const 총 정리 - 2

Const와 함수 함수에서 Const가 사용되는 위치는 세 군데 매개변수 자료형 함수선언 리턴 자료형 매개변수 자료형에 사용되는 경우 PrintAddress(int &IParam) add(const int a, const int b) 형태와 같이 매개변수의 자료형에 const가 사용된다. 함수의 파라미터를 함수 내에서 변경하면 안되므로 오류를 막기위해 사용한다. 즉, 함수내에서 파라미터를 읽기만 하고 변경을 하는일이 없다는 것이다. 함수에 전달되는 parameter를 in-parameter와 out-parameter 두가지로 구분할 수 있다. in-parameter는 함수가 데이터를 전달받아 사용하는 것을 의미하고 out-parameter는 함수가 데이터를 변경하는 것을 의미한다. 예를 들면 num은 여..

[C++] Const 총 정리 - 1

Pointer와 Const variable const(상수)값은 그 값을 변경할 수 없다. 변경할 수 있는 값은 non-const(비상수)라고 할 수 있겠다. #include void main(){ int value = 5; int* ptr = &value; *ptr = 6; printf("%d\n", *ptr); } 출력 : 6 하지만 value의 값이 상수인 경우에는 어떻게 될까? #include void main(){ const int value = 5; int* ptr = &value; *ptr = 6; printf("%d\n", *ptr); } 출력 : 컴파일 에러 위 코드는 컴파일되지 않는다. 상수 변수는 값을 변경할 수 없다. 만약 상수가 아닌 포인터가 상수 변수를 가리킨 다음에 역참조하여 ..

[코드 중심 C++] - STL(Standard Template Library)

STL Standard Template Library의 약어. C++에서 자체적으로 제공하는 자료구조 라이브러리이다. C++의 1/3이 문법이고, C++ 1/3이 탬플릿이고, 그 나머지가 STL일 것이라고... 누가 말했었는데 기억이 안난다. STL Container Adater 스택, 큐, 우선순위 큐 등의 기본적인 자료구조를 탬플릿형태로 제공한다. Stack stack 클래스의 멤버함수로 push, pop, top(조회), empty, size가 주어진다. #include #include // 이렇게 include해준다. using namespace std; int main(void){ stack s; // stack이 template로 구현되어있다. int형 데이터를 담는 stack이라 선언 s.p..

[코드 중심 C++] - 스마트 포인터(Smart Pointer : unique_ptr, share_ptr, weak_ptr)

스마트 포인터 C++의 스마트 포인터는 메모리 누수(Memory Leak)을 방어하기 위한 수단이고, 포인터처럼 동작하는 클래스 템플릿이다. C#이나 파이썬은 가비지 콜렉터와 같은 기술들로 사용하지 않는 메모리를 자동으로 수거해간다...만 C++은 그딴 거 없고 스마트 포인터로 스스로 해결해야만한다. 다만 C에서는 반드시 free()를 써서 처리해야하는 번거로움이 있었지만, C++에서는 스마트 포인터로 더 간편하게 해결할 수 있는 장점이 있다. 동적할당은 new, 해제는 delete. 동적할당은 힙영역의 메모리에서 수행한다. new로 할당 후 스마트 포인터에 넣어서 사용한다. 스마트 포인터는 다쓰고 소멸자에서 delete 키워드를 사용한다. 자동으로 해제하는 기능을 수행하게 된다. unique_ptr: ..

[코드 중심 C++] - 일반화, 탬플릿, 명시적 특수화, 암시적 구체화 (Generic Programming, Template, Explicit Specialization, Implicit instantiation)

일반화 : generic programming template를 이용해서 generic programming을 할 수 있다. template는 parameter의 별도의 함수/클래스를 만들지 않고 단 하나의 객체로 사용가능하게 해준다. 이는 곧 재사용성 극대화로 이어진다. 탬플릿 Template 탬플릿 template란, 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 틀. function template을 이용해서 이렇게 다양한 자료형에 대응할 수 있다. 다만 배열이나 구조체는 에러가 잘 발생한다. 구조체 연산 . ->을 연산자오버로딩을 통해 다시 정의해야한다고는 하는데 뭐 명확히 알려주진 않는다... 이렇게 함수에 대해서 탬플릿을 사용하면 함수 ..

[코드 중심 C++] - Polymorphism(다형성), 추상 클래스(Abstract Class), virtual, 순수 가상 함수(Pure Virtual Function)

1 여러 개의 서로 다른 객체가 동일한 기능을 서로 다른 방법으로 처리할 수 있는 기능을 다형성이라고한다. 예를 들면 필기구 역할을 하는 다양한 도구들 - 볼펜, 만년필, 연필- 은 서로다른 객체지만, 문서 작성이라는 동일한 기능을 수행한다. 간단히 말하면, 같은 클래스에서 나온 서로다른 객체가, 같은 메소드 호출에 대해서 서로 다른 출력을 내놓는다는 얘기다. 그런데 메소드는 기본적으로 단 하나의 메모리에서 모든 객체가 공유하게되는데, 이게 어떻게 가능한가? 그래서 우린 추상 클래스와 가상함수의 개념을 사용한다. 객체 포인터 자료형의 변수로 포인터에 접근할 때에는 아래와같은 문제가 발생할 가능성이 높다. (& 자료형으로 정의해도 마찬가지다.) 아래의 예시의 경우, C++ 컴파일러는 가리키고 있는 변수의 ..

[코드 중심 C++] - 접근제한자 private, protected, public, Friend 키워드, Static 키워드

1 클래스와 구조체의 근본적인 차이가 무엇일까. 은닉 기능의 차이다. C++의 접근제한자 3가지 private, protected, public이 있다. private로 선언하면 클래스 내부의 멤버 함수 또는 friend 함수만 클래스의 private 멤버에 접근할 수 있다. protected로 선언하면 클래스 외부에서는 protected 멤버에 접근할 수 없다. 해당 클래스의 하위 클래스(상속)에서는 접근할 수 있다. public으로 선언된 데이터 멤버와 메서드는 다른 클래스에서도 접근이 가능하다. public 멤버는 . 연산자를 사용하여 접근한다. 2 friend 키워드를 통해 특정한 객체의 모든 멤버에 접근할 수 있다. friend를 통해서 함수를 작성하면 그 함수는 클래스의 메서드로 인식되지 않는..

[코드 중심 C++] - 멤버 이니셜라이저 컴파일 에러 문제 (Member Initializer)

knowledgeforengineers.tistory.com/75 [코드 중심 C++] - 상속, 멤버 이니셜라이저(Inheretence, Member Initializer) 1 클래스를 상속시키려면 상속받을 클래스의 이름 옆에 :와 접근 제한자, 클래스의 이름을 붙여주면 된다. 2 생성자 : 부모 먼저 자식 나중 소멸자 : 자식 먼저 부모 나중 3 멤버 이니셜라이저( knowledgeforengineers.tistory.com 전에 올린 포스팅에 추가 설명을 하고자 한다. Student 생성자를 아래와 같이 적었을 때 왜 컴파일 에러가 발생할까? // Case1 Student(int studentID, string name){ this->name = name; this->studentID = stude..

반응형