일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- enumasByue
- moreeffectiveC++
- 언리얼가비지컬렉터
- 크리티컬섹션
- dataasset
- 프로그래머스
- 강참조
- C++최적화
- 약참조
- 비동기호출방법
- BFS
- tweakobjectptr
- 데이터애셋
- C++
- 람다
- 스마트포인터
- 애셋로드
- stl
- unorder_map
- UE_LOG
- 자료구조
- 델리게이트
- makeweakobjectptr
- map
- 정렬
- UML관련
- 선택정렬
- 알고리즘
- 정렬알고리즘
- 구조적 바인딩
- Today
- Total
목록C & CPP (89)
기억을 위한 기록들
캐릭터의 정보가 있는 캐릭터 클래스가 있고 객체를 사용자가 얻어내는 용도로 팩토리 함수만을 쓰도록 만들어져 있다고 가정해봅시다. class Character{ //... Character* CreateCharacter(); //... }; 함수를 통해 얻어낸 객체를 사용할 일이 없어질때, 해당 객체를 삭제해야 할 쪽은 이 함수의 호출장비니다. 아래 임시 함수에서 그렇게 만들었다고 합시다. void DoSomething() { //... Character* newCharacter= Character::CreateCharacter(); //.. delete newCharacter; } 문제가 없어보이지만, 중간의 주석 부분에서 중간 return이나 예외처리 등 delete까지 닿지 않게되면 메모리누수(mem..
객체지향 시스템 중 설계가 잘 된 것들을 보면, 객체를 복사하는 함수가 딱 둘만 있는 것을 알 수 있습니다. 그것은 바로 복사 생성자와 복사 대입 연산자입니다. 이 둘을 통틀어 복사함수라고 부른다. 이 둘은 컴파일러가 필요에 따라 만들어내기도 한다. 이렇게 컴파일러가 생성한 복사 함두는 비록 자동으로 만들어졌지만, 동작은 기본적인 요구에 아주 충실하다!. 빠짐없이 잘 복사한다. 그러나 기본적으로 만들어진것 말고 직접 선언한다는 것은, 기본 동작에 뭔가 마음에 안드는 것이 있다는 것인데, 직접 이런 복사함수들을 구현할 때 틀린 부분이 있더라도 컴파일러는 이런 부분들을 짚어 주지 않는다는 것이다. 예를 들어 어떤 객체를 대입하는데 직접 작성한 다음에 추후에 나중에 클래스에서 멤버변수라도 새로 추가하게 된다면..
자기대입(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..