분류 전체보기 (236) 썸네일형 리스트형 C++ 배우기 27(함수포인터) 함수 포인터(function pointer) 기본적으로 포인터는 어떠한 변수의 주소를 저장하고 가리키는 역할을 한다. 즉, 함수 포인터 또한 함수의 주소를 저장하여 가리키는 변수라는 뜻이다. int foo() // foo 함수의 메모리 주소가 0x002717f0라고 가정 { return 5; } int main() { foo(); // 주소 0x002717f0로 점프한다. return 0; } 위의 예시에서 foo는 함수의 이름이고, int(정수)를 반환하며 매개 변수가 없는 함수 타입이다. 여기서 변수와 마찬가지로 함수에도 메모리에 할당된 주소가 존재한다. main에서 () 연산자를 통해 foo함수를 호출하면, 호출되는 함수의 주소로 점프하여 실행하는 방식이다. 따라서 cout으로 foo함수를 출력하면.. C++ 배우기 26(LValue / RValue) C++ 이전에 C에서의 LValue와 RValue는 코드 연산 중에 대입 연산자(=)를 기준으로 왼쪽으로 올 수 있는 값이 LValue, 오른쪽에 존재하는 값이 RValue로 구분했다. 말 그대로 LeftValue / RightValue의 뜻을 가지고 있었다는 것이다. 하지만 지금 배우고있는 C++에서는 다른 관점으로 사용이 되고 있으므로 주의해야 한다고 한다. LValue와 RValue C++에서의 모든 표현식은 전부 Lvalue와 Rvalue로 나타낸다. LValue는 단일 표현식 이후에도 사라지지 않고 지속되는 객체를 말한다. 한마디로 이름을 가지고 있는 객체를 뜻한다. 때문에 const 타입, 그리고 모든 변수들이 바로 LValue라고 할 수 있다. RValue는 표현식이 종료된 후에 사라져서 더.. 상점_인벤토리(복사생성자 추가) 앞서 만들었던 상점_인벤토리에서 복사생성자를 이용한 깊은 복사를 추가했습니다. //item.h #pragma once class Item { public: string name; int price; public: Item(); //추상화로 생성했다면 가상함수로 소멸 virtual ~Item(); Item(string _name, int _price); //복사생성자 Item(const Item& src); //가상함수 : 자식클래스에서 재정의가 이루어질거라고 예상될 때 virtual void Print(); virtual Item* Create(const Item* src); }; class Weapon : public Item //상속 { public: int att; Weapon(); ~Weapon(.. C++ 배우기 25(복사생성자, 팩토리 패턴) 복사 생성자(copy constructor) 복사 생성자는 자신과 같은 클래스 타입의 객체의 복사본을 생성할 때 다른 객체의 참조(reference)를 매개변수로 받아서, 그 참조를 통해 자신(객체)을 초기화하는 방법이다. 보통의 복사와는 다르게 복사생성자는 복사된 객체가 원본 객체와 같으면서 완전한 독립성을 띄고 있다. 바로 깊은 복사(deep copy)를 통한 복사이기 때문인데, 밑의 사진을 보자. 우선 얕은 복사(Shallow Copy)란, 대입 연산자(=)를 통한 변수에 다른 변수의 값을 대입하는 방식을 말한다. //Shallow Copy(앝은 복사) int x = 10; int y = x; x= 21; cout Make(); } }; 팩토리는 생성자를 대신해서 객체를 생성해주는 디자인 패턴이었다.. 상점_인벤토리 추가(가상함수, 추상화) 가상 함수, 추상화를 사용해서 바꾸어 봤다. 몇가지 예외처리 및 보관함에서 판매기능까지 추가해봤다. //item.h #pragma once class Item { public: string name; int price; public: Item(); virtual ~Item(); //가상소멸자 Item(string _name, int _price); virtual void Print(); //가상함수 Print() }; class Weapon : public Item //상속 { public: int att; Weapon(); ~Weapon(); Weapon(string _name, int _price, int _att); void Print() override; }; class Armor : public.. C++ 배우기 24(가상함수, 재정의) 가상 함수(virtual function) 가상 함수는 부모 클래스에게 상속받은 자식 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미한다. class A { virtual void Print(); }; class B : public A { virtual void Print(); }; 위의 예시처럼 virtual을 멤버함수의 원형 앞에 붙여주면 된다. 이런 가상함수를 왜 쓰는 걸까? 우선 바인딩이란 함수를 호출하는 코드에서 어디에 있는 함수를 실행하라는 의미이다. 그리고 여기서 바인딩은 정적 바인딩, 동적 바인딩으로 나눌 수 있다. 우선 정적 바인딩(초기 바인딩)은 컴파일러가 함수를 호출할 때 컴파일 타임에 고정된 메모리 주소로 변환시키는 것을 말한다. 일반적인 함수들은 모두 이런 정적 바인딩을 따르.. C++ 배우기 23(생성자, 소멸자) 생성자 우리가 평소에 사용하던 class에서 사용할 수 있는 것으로, 해당 클래스를 가지고 객체를 생성됨과 동시에 자동으로 호출되는 함수라고 할 수 있다. 보통 class의 멤버 변수는 private의 접근 제한을 기본으로 두고 있어서 외부에서 직접 접근하여 초기화하기 힘들다. 만약 초기화를 하려면 getter와 setter를 이용해 하는 방법을 배웠었는데, 또 다른 방법으로 바로 이 생성자를 사용하는 것이다. class Exam { private : int a; int b; public: Exam(); //생성자 }; int main() { //exam 객체 생성과 동시에 Exam()생성자 호출 Exam exam; return 0; } 지금까지 class를 사용하면서 생성자를 사용하지 않았었지만, 사실.. C++ 배우기 22(static) 변수에 총 3가지의 주기가 존재한다. 여기서 주기란, 생성과 소멸이 되는 부분들을 말한다. 자동 주기 : 일반 지역 변수 등등 생성과 소멸을 사용자 맘대로 할 수 없다. 동적 주기 : 동적 할당된 변수(new) 등등 생성과 소멸(delete)을 사용자 맘대로 할 수 있다. 정적 주기 : 전역 변수, 정적 변수 등등 프로그램이 시작과 동시에 생성이 되고, 프로그램 종료 시에 소멸이 된다. 여기서 우리가 볼 것은 정적 주기이다. 우리가 앞서 메모리 구조에서 데이터 영역은 자세히 알아보기 않았었다. 데이터 영역은 프로그램 시작 시 생성되고, 종료 시 소멸되는 메모리로, 정적 / 전역 변수들이 저장되는 곳이다. 이러한 데이터 영역의 특징 덕분에 메모리 누수의 걱정없이 사용할 수도 있지만, 프로그램이 종료되기 전.. 이전 1 ··· 20 21 22 23 24 25 26 ··· 30 다음