일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 데이터애셋
- 델리게이트
- UE4 커스텀로그
- 자료구조
- BFS
- 애셋로드
- dataasset
- enumasByue
- 강참조
- 정렬알고리즘
- UE_LOG
- 언리얼엔진구조체
- UELOG
- 언리얼가비지컬렉터
- 람다
- 정렬
- map
- 스마트포인터
- 람다사용정렬
- 선택정렬
- C++최적화
- UML관련
- moreeffectiveC++
- 크리티컬섹션
- 약참조
- stl
- unorder_map
- 알고리즘
- 프로그래머스
- C++
- Today
- Total
목록C & CPP (88)
기억을 위한 기록들
객체지향 시스템 중 설계가 잘 된 것들을 보면, 객체를 복사하는 함수가 딱 둘만 있는 것을 알 수 있습니다. 그것은 바로 복사 생성자와 복사 대입 연산자입니다. 이 둘을 통틀어 복사함수라고 부른다. 이 둘은 컴파일러가 필요에 따라 만들어내기도 한다. 이렇게 컴파일러가 생성한 복사 함두는 비록 자동으로 만들어졌지만, 동작은 기본적인 요구에 아주 충실하다!. 빠짐없이 잘 복사한다. 그러나 기본적으로 만들어진것 말고 직접 선언한다는 것은, 기본 동작에 뭔가 마음에 안드는 것이 있다는 것인데, 직접 이런 복사함수들을 구현할 때 틀린 부분이 있더라도 컴파일러는 이런 부분들을 짚어 주지 않는다는 것이다. 예를 들어 어떤 객체를 대입하는데 직접 작성한 다음에 추후에 나중에 클래스에서 멤버변수라도 새로 추가하게 된다면..
자기대입(self assignment)란, 어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것을 말합니다. class Widget{...}; Widget myWidget; myWidget=myWidget; 보통 위와같은 식을 말하는데 이외에도 a[i]=a[j]; //i와 j가 같을수도 있다. *px=*py; //자기대입 가능성이 아주 높다, px와 py가 가리키는 대상이 같아지면 여러곳에서 하나의 객체를 참조하는상태 즉 중복참조(aliasing)이라고 불린다. 이외에도 자식부모 클래스의 상속관계 있는 클래스 사이에서도 중복 참조는 일어 날수도 있다. class Base{..}; class Player : public Base {...}; void DoSomething(const Base& rb, P..
lvalue 란? 단일 식을 넘어 지속되는 개체 - 주소가 있다. - 이름이 있는 변수 - const 변수 - 배열 변수 - 비트 필드(bit-fileds) - 공용 구조체(unions) - 클래스 멤버 - 좌측 값 참조(&)로 반환하는 함수 호출 - 문자열 리터럴 등 그냥 많이 자주 나오는 것들 int number = 10; //number는 lvalue const int NAME_MAX = 20; //NAME_MAX는 lvalue; 저장해서 꺼내쓸수 있는 것들 정도로? rvalue 란? - lvalue가 아닌것들 - 사용되는 단일 식을 넘어 지속되지 않는 일시적인 값 - 주소가 없는 개체 - 리터얼(문자열 리터럴 제외) - 참조로 반환하지 않는 함수 호출 - i++와 --i - 기본으로 지원되는 산술..
C++의 대입연산은 재미있는 성질이 있다. int x,y,z; x=y=z=15; //사실처럼 연결된다. 또 하나의 재미있는 특성으로 우측 연관(right-associative)연산 이라는 점이다. 즉, 위의 대입 연산 사슬을 분석하게 되면 x = ( y = ( z = 15)); 위와 같이 된다. 이렇게 대입 연삱이 사슬처럼 엮이려면 대입연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어 있을 것이다. 이런 구현은 일종의 관례로 클래스에서 대입연산자를 만들게 된다면 class Player{ pulbic: Player& operator=(const Player& rhs) { //..내용 return *this; } }; "좌변 객체의 참조자를 반환하게 만들자"라는 규악은 위에서 단순 대입형 말고도 모든 ..
이유는 2가지로 첫 번째는 호출 결과가 원하는 대로 돌아가지 않고, 두 번째로는 원하는 대로 돌아간다고 해도 뭔가 굉장히 이상할 것이다. 예를 들어 class Player { public: Player() { log(); } virtual void log() { cout
* 소멸자에서는 예외가 빠져나가면 안된다. 만약 소멸자 안에서 호출된 함수가 예외를 던질 가능성이 있다면, 어떤 예외이든지 소멸자에서 모두 받아낸 후에 삼켜버리든지 프로그램을 끝내든지 해야한다. * 어떤 클래스의 연산이 진행되다가 던진 예외에 대해 사용자가 반응해야 할 필요가 있다면, 해당 연산을 제공하는 함수는 반드시는 보통의 함수(즉, 소멸자가 아닌 함수)이어야 한다.
다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. class Character { public: Character() { cout
- 가상함수는 vtable 혹은 가상 테이블에 의존한다. - 어떤 클래스의 함수가 virtual로 선언되어 있으면, 해당 클래스의 가상 함수주로를 보관하는 vtable이 만들어진다. - 컴파일러는 또한 해당 클래스의 vtable을 가리키는 vptr이라는 숨겨진 변수를 해당 클래스에 추가한다. - 하위 클래스가 상위 클래스의 함수를 오버라이드하지 않으면, 하위 클래스의 vtable은 상위 클래스의 가상 함수주소를 보관한다. - 이 vtable을 사용하여 가상함수가 호출될때 어느 주소에 있는 함수가 호출되어야 하는지를 결정한다. - C++의 동적바인딩(dynamic binding)은 이 가상 테이블 매커니즘을 사용하여 실행된다. - 비가상함수에 대한 호출은 컴파일시간에 정적 바인딩을 통해 처리.
일부 멤버 함수들은 C++에서 클래스 안에 직접 선언해 넣지 않으면 컴파일러가 자동으로 선언해주도록 되어 있습니다. 바로. 1. 복사 생성자(copy constructor) 2. 복사 대입 연산자(copy assignment operator) 3. 소멸자(destructor) 4. 기본 생성자 (선언 해놓지 않았다면) 가 있습니다. 컴파일러가 만드는 함수의 형태는 모두 기본형이다. 모두 public 멤버이며 inline 함수입니다. class Player {}; 이렇게 선언한 클래스와 아래와 같이 선언한 클래스가 대동소이하다는 것입니다. class Player { public: Player() // 기본생성자 {} Player(const Player& rhs) //복사 생성자 {} ~Player() //..
docs.popekim.com/ko/coding-standards/cpp C++ 코딩 표준 | 포프의 문서창고 마지막 수정일: 2021-02-24 docs.popekim.com
초기화되지 않은 값을 읽도록 내버려 두면 정의되지 않은 동작이 그대로 흘러나오게 된다. 어떤 플랫폼의 경우 미초기화 객체를 읽기만 해도 프로그램이 서버리기도 한다. 기본 제공 타입으로 만들어진 비멤버 객체에 대해서 직접 초기화 int x = 0; //int의 직접 초기화 const char* text="Hello"; //포인터의 직접 초기화 double num; std::cin>>num; //입력스트림에서 읽음으로써 "초기화" 수행 이런 부분을 제외하면 나머지는 생성자로 귀결된다. 여기서 대입(assignment)과 초기화(initialization)를 헷갈리면 안 된다. 아래와 같이 해주고 있는 건 대입이다. class A { public: A(); private; int a; int b; } A::A..
템플릿은 형판으로 뭔가를 찍어낼수 있는(?) 뜻이 된다. 마찬가지로 템플릿 프로그래밍이란 정해진 자료형 타입으로만 하기엔 중복코드가 남발하게 됨으로, 여러 타입을 찍어낼수 있도록 도와준다. 특징을 정리하자면, - 코드를 자료형마다 중복으로 작성하지 않아도 됨. (컴파일 도중에 자료형에 맞게 만들어줌) - 템플릿을 인스턴스화할 때마다 컴파일러가 내부적으로 자료형에 맞게 코드를 생성 ( 템플릿에 넣는 자료형 가짓수에 비례해서 exe파일 크기 증가...! / 컴파일 타임에 어느정도 다형성을 부여할 수 있음) - 컴파일 시간 느려진다.(템플릿 매개변수를 다양하게 할수록 더욱 ) 그러나 런타임 속도는 빠를수도... 실행파일 크기가 커지기때문에 항상 그런것은 아님. 1. 함수 템플릿 template T Add(T ..