c++ 15

C++ 개인 필기(15완) 복사

클래스 객체 생성시에 Warrior W -> 기본생성자 호출 Warrior W1=W ->만듦과 동시에 복사 (복사 생성자) Warrior W2 ->기본 W2=W -> 복사대입연산자 복사 생성자 + 복사 대입 연산자 -> 컴파일러가 암시적으로 만들어줌 (메모리에 있는 데이터 그대로 복사) class Warrior{ public: Sword SW; ->포인터로 하지 않을시 워리어와 검이 서로 일치하여 생성, 소멸이 같이됨. } 생명 주기 관리가 어려워진다. (클래스 내에 다른 클래스를 가질땐 포인터나, 참조 값 추천) 복사 생성자, 복사 대입 연산자 -> 주소값 즉 메모리 자체를 그대로 복사 (얕은 복사) 멤버 데이터를 비트열 단위로 복사 (메모리영역 그대로 복사) 포인터 주소값 -> 주소값을 복사 -> 동..

c++ 2024.03.04

C++ 개인 필기(14) 변환

타입 변환 유형(비트열 재구성 여부) 1. 값 타입 변환 (의미를 유지하기 위해, 원본 객체와 다른 비트열 재구성) int a=123456789 //2의 보수 float b= (float)a //부동소수점 ->1.234567e ... -> 메모리에 다른 값 구성 (비트열 재구성) 2. 참조 타입 변환 (비트열을 재구성 하지 않고 관점만 바꾸는것) int a= 123456789 ->메모리의 데이터는 같지만 (관점만 바뀌어) float b= (float)a ->엉뚱한 값 구성 ->참조 타입 변환은 포인터 타입 변환과 동일한 룰을 같는다. 안전도 분류 (1) 안전한 변환 특징) 의미가 항상 100프로 완전히 일치하는 경우 같은 타입이면서 크지만 더 큰 가방으로 이동 작은 가방 -> 큰 가방 good (업캐스팅..

c++ 2024.02.26

C++ 개인 필기(13) 동적 할당

HEAP -> 필요할대만 사용, 필요없으면 반낪 생성, 소멸시점 관리 동적 할당 : malloc, free / new, delete, /new[], delete[] //유저 영역 (메모장 or 게임)(독립적 실행) //커널영역 (운영체제의 핵심코드 실행) //유저 영역 [ ] malloc(sizeof(void ))를 통해 메모리 낭비 해결 ->메모리 할당 후 시작 주소를 가리키는 포인터를 반환 (메모리 부족시 NULL) void * ->포인터는 포인터, 포인터를 타고가면 뭐가 있는지 모르니깐 너가 적당히 변환해서 사용해라 -> Warrior *w1=(Warrior)ptr; w1->xx 처럼 할당 malloc/free 세트 ->free(ptr) 하지 않을 시에 메모리 누수 힙 오버 플로우->유효한 힙 범위..

c++ 2024.02.14

C++ 개인 필기(12) static

struct vs class c++ 에서 struct, class 는 종이 한장 차이 struct는 기본 접근 지정자= public, class 는 private 왜? c++은 c언어에서 파생되어 발전해서 호환성을 지키기 위해서.. struct는 그냥 구조체(데이터 묶음) 표현 class 객체 지향 프로그래밍의 특징 static 변수 -> 정적=고정된, 공통적으로 모든 객체가 같은 값을 가지면.. warrior, attack=1 static int attack; ->클래스 밖에 빼는 느낌 (전역 변수) AActor::attack=1; -> 외부선언 누구나 동일한 공격을 가진다. -> warrior 클래스의 종속적 함수에 static일때 초기화 하면 .data, 안하면 .bss 영역 static -> 생명..

c++ 2024.02.13

C++ 개인 필기(11) 클래스의 연산자

Class Position 이 있을때 Position pos3 = pos1 + pos2 -> 어떻게 해야할까? 연산자 vs 함수 -> 연산자는 피연산자의 개수/타입 고정 연산자 오버로딩 이란? 우리만의 클래스에 pos1+pos2 와 같은 연산자를 지원하게 만들고 싶을때 사용 1. 연산자 함수 정의 ->함수도 멤버함수와 전역함수가 있는 것처럼 연산자 함수도 2가지 방식 존재 pos1+pos2 만들기 Postion operator+() { Position pos , x=x1+x2, y=y1+y2, return pos;} pos3= pos1+pos2 == pos3=pos.operator+(pos2) 멤버 연산자 함수 a op b 형태에서 왼쪽을 기준으로 실행 (a가 클래스여야 가능 , a 를 기준 피연산자라함..

c++ 2024.02.07

C++ 개인 필기(10) 초기화 리스트

변수 초기화를 해야하는 이유 -> 초기화를 안하면 쓰레기값이 들어가기 때문 초기화 방법 1. 생성자 내에서 2. c++11 방법 -> 선언과 동시에 초기화 3. 초기화 리스트 ->선처리 영역에서 초기화 클래스 생성시 Warrior() 1순서 Warrior(AActor) 2순서 ~Warrior() 포함관계 -> 초기화 리스트를 사용해야 기타 생성자만 실행된다. 즉 초기화 리스트가 더 좋다. 정의함과 동시에 초기화가 필요한 경우 (참조, const) ->초기화 리스트에서 실행

c++ 2024.02.06

C++ 개인 필기(9) 은닉성 다형성

은닉성: 캡슐화 숨기는 이유 -> 위험하고 건드리면 안되는 경우, 다른 경료로 접근하길 원하는 경우 public, protected, private -> 멤버 접근 지정자 private -> class 내부에서만 class Warrior : public Player -> 상속 접근 지정자 protected -> class에 상속된 class에서만 사용이 가능하다. 상속 접근 지정자 -> 자식 class에 꼭 모든걸 물려줘야하는 것이 아니다. Warrior : protected Player -> public -> protected로 변환 부모는 public 자식은 protected // : priavte Player -> 부모만 public, 자식은 private-> 자식의 자식은 사용 불가능 다형성 ->..

c++ 2024.02.01

C++ 개인 필기(8) 객체지향 생성자

Player p=p1 -> 복사 생성자, const Player& p / 복사와 생성이 한번에 이루어짐 Player p2 -> 기본 생성자 p2=p1 -> 기본 생성자 *인자즐 한개만 받는 기타 생성자를 타입 변환 생성자라고도 한다. float f=(float)num -> 명시적 형변환 float f = num ->암시적 형변환 Player p; / Player(int id) p=1 -> 타입 변환 생성자로 인해 가능하다. (암시적 형변환) -> 암시적 부분은 오류 발생 가능 객체지향 (OOP , Object Orited Programming) -상속성 -은닉성 -다형성 -- 3대 속성-- 상속: Warrior : public Player Player 멤버 변수 -> id 4바이트 Warrior 멤버 변..

c++ 2024.01.31

C++ 개인 필기(7) 생성자 소멸자

멤버 변수 표기법(필수 아님) 예) UStaticmeshcomponent m_staticmesh this-> 사용 언리얼엔진5에서도 자기 자신을 가리킬때 특히 키 바인딩의 경우 BindAxis(FName("바인드이름"),this 시작을 알리는 특별한 함수 , 반환 타입이 없음, 오버로딩 가능 언리얼엔진에서는 기본생성자가 기본적으로 코드 생성시 생성됨. 생성자에 초기화를 할경우 에디터 상에서 게임이 실행되기전에 생성자가 실행됨. 소멸자(destructor) ->끝을 알리는 특별한 함수 소멸자는 오직 한개만 존제. (1) 기본 생성자 (인자가 없음) 예 ACHARACTER :: ACHARACTER() 일반 생성자 (2) 복사 생성자 : 자기자신의 참조값을 인자로 받음 예) speed=character.spe..

c++ 2024.01.26

C++ 개인 필기(6) 다중 포인터 및 배열

HelloWorld(const char* a) , const char* msg="Hello" { a="BYE"} 왜 수정이 안될까? -> 다중포인터 사용하면 가능하다. **PP -> PP[주소1] -> 8바이트 , 주소1[주소2] -> 주소2[] -> 1바이트 가방(const char) const char **pp=&a -> pp[&a], a[주소] -> 주소2[수정] -> *pp=BYE 이런식으로 수정 가능. 배열 -> 데이터의 묶음 포인터 -> 주소를 담는 가방 배열의 이름은 배열의 시작주소값을 가리키는 TYPE*포인터로 변환가능 [TYPE형 1차원 배열]과 [TYPE형 * 포인트]는 완전히 호환가능 int arr[2][2]={(1,2),(3,4)} int **pp=arr -> 에러 만약 int **..

c++ 2024.01.25

C++ 개인 필기(5) 포인터 및 참조

포인터 * 참조 & 성능은 같다. 편의성 : 참조>포인터 포인터를 주소를 넘긴다는게 티가 나지만 참조는 아니다. CONST를 사용해서 수정을 안한다는것 꼭 표기 (참조에서) , 읽기 전용일 때 포인터의 CONST는 const int* ptr -> ptr이 가리키고 있는 가방의 내용물을 바꾸지 못함 int* const info -> 주소값을 고치지못함 (주소값 고정) 참조 -> 별칭 -> 참조하는 대상이 없으면 초기화안됨 참조 사용시 -> define OUT -> func(OUT int& ref) 포인터로 사용하던걸 참조로 넘길려면? -> ByRef(*ptr) 참조를 포인터로 -> BYPTR(&REF) 배열 비주얼 스튜디오 기준 -> 배열은 상수여야한다. gcc는 아니다. 배열의 이름은 배열의 시작주소(시..

c++ 2024.01.24

C++ 개인 필기(4) 포인터

포인터 int n=1; -> 스택 메모리에 있는 특정 주소에 우리가 원하는 값을 넣은 코드, 메모리에 이름을 붙인 것 포인터 -> 주소를 저장하는 가방 -> 4바이트(32비트) or 8바이트(64비트) 고정ㅇ크기 int a= *pt; -> 주소를 저장하는 가방이 가리키는 주소로 가서 값을 넣는다. 앞 TYPE는 자료크기에 영향을 주지 않지만 자료형이라는 추가 정보를 알리기 위해 type를 사용함. 타입이 일치하지 않는다면 메모리를 덮어써서 위험하다. (범위 초과) 1) 주소 연산자 & 해당 변수의 주소 2) 산술 연산자 +- 포인터 ++시 바이트 단위로 증가 3) 간접 연산자 * 변수의 해당 주소로 간다. 4) 간접 멤버 연산자 -> 구조체는 . 를 쓰지만 포인터는 ->를 사용한다. 언리얼엔진에서 자주 ..

c++ 2024.01.22

C++ 개인 필기(3) 반복문 및 스택

for(초기식; (1) 조건식; (2) 증감식(4)){ 본문 (3) } break -> for or while 에서 나갈때 continue -> continue 밑에 부분을 스킵하고 다시 반복문 실행 enum -> 상수 처리라 메모리에 올라가지 않음. const int 1)전처리 -> 2)컴파일 -> 3) 링크 #define -> 코드를 바꿔치기 하는 용도 디버깅 디버그 f11 -> 함수 안까지 , f10 -> 함수 내용 건너뜀, f5 -> 통채로 건너띰 코드 영역 데이터 영역 -> 전역, 정적 힙 영역 -> 동적 할당 스택 영역 -> 지역변수, 매개변수 스택 메모리 -> 높은 주소에서 낮은 주소로 스택 프레임 구성요소 매개변수 / 리턴 / 지역변수 예) int a 함수 이름..

c++ 2024.01.19

C++ 개인 필기(2) 비트 및 캐스트

비트 단위 -> 비트단위의 조작이 필요할 때 대표적으로 Bitflag ~bitwise not -> 단일 숫자의 모든 비트들 대상으로 0->1 1->0 예) 1011 -> 0100 & bitwise and -> 1011 0111 -> 0011 (같으면 1 다르면 0) 두 숫자의 모든 비트쌍을 대상으로 and한다. | bitwise or -> 1011 0111 ->1111 (둘중 하나가 1이면 1 아니면 0) 두 숫자의 모든 비트쌍을 대상으로 or한다. ^ bitwise xor -> 1011 0111 -> 1100 두 번 xor 하면 원본이됨 (암호화) 비트열을 N만큼 왼쪽으로 이동 -> 왼쪽에 넘치는 N개의 비트는 버림, 새로 생성되는 N개는 0으로 채움 -> *2를 할때 자주보이는 패턴 >> 비트 우측이..

c++ 2024.01.17

C++ 개인 필기(1) 데이터

프로그래밍 이란? 적절한 데이터를 저장하고 가공 / 데이터 + 로직 데이터에는 rodata 영역 -> readonly data data 영역 -> 0이 아닌 초기화 값이 있을 경우 bss 영역 -> 초기 값이 0이거나 초기값이 없는 변수일 경우 char -> 1바이트, short -> 2바이트 int -> 4바이트 , __int64 -> 8바이트 1Bit -- 최소 단위 , 8비트 -> 1바이트 자료형별 숫자 범위 char (-128 ~ 127) , short(-32768 ~ 32767) , int (-21.4억 ~ 21.4억) 콘솔/모바일 게임 메모리가 늘 부족하여 바이트 단위로 관리가 필수 예) 온라인 게임 4만명이 플레이 할시에 4바이트 * 4만명 데이터 정수 오버 플로우, 정수 언더 플로우 -> ..

c++ 2024.01.16