분류 전체보기 (308) 썸네일형 리스트형 [C++] 클래스명 객체명();는 디폴트 생성자를 호출하지 않는다. 클래스명 객체명(인수)는 클래스에서 매개변수 하나를 인자로 받는 생성자를 호출한다. 두개도 세개도 마찬가지이다. 그렇다면 인수를 넣지 않고 빈괄호만 쓰면 디폴트 생성자를 호출할까? A a; // A의 디폴트 생성자 호출 A a(); // A의 디폴트 생성자 호출 X ① Position Here; ② Position Here=Position(); ③ Position *pPos=new Position; ④ Position *pPos=new Position(); ⑤ Position Here(); 1~5번중 5번만이 디폴트 생성자를 호출하지 않는다. 5번은 Position 타입을 반환하는 Here이라는 이름의 함수 원형을 선언한 것이다. int형으로 바꿔 생각하면 이해하기 쉽다. int func; // 변수 i.. 23.02.14 - 클래스 내 static, 복사 생성자 클래스 내 static class CObj { public: CObj() //: m_iA(100) (x) { //m_iA = 100; (x) } public: static intm_iA; // 클래스 변수(정적 멤버 변수) 클래스 내 static 변수는 어떻게 초기화할까? 생성자로도 이니셜라이저로도 초기화가 불가능하다. intCObj::m_iA = 0; 초기화하려면 클래스 위 코드처럼 네임스페이스를 이용해서 초기화 해야 한다. 이렇게 초기화하기 어려운데 왜 쓰는 걸까? 정적 멤버는 아무리 객체가 많아도 클래스에 하나만 생성되고 모든 객체에서 접근이 가능하다. 또한 전역변수인데 은닉성을 통해 숨기고 싶을 때 클래스 내부에 static으로 선언하기도 한다. // 클래스 함수(정적 함수) static void.. [알고리즘] BFS, DFS 언제 사용할까? 그래프 탐색 문제는 대부분 BFS, DFS를 둘 다 사용할 수 있다. 하지만 그럼에도 불구하고 상황에 따라 효율적인 알고리즘이 있다. BFS - 최단 경로 https://www.acmicpc.net/problem/16236 16236번: 아기 상어 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가 www.acmicpc.net 가중치가 1인 최단 경로를 구할 때는 BFS가 효율적이다. DFS로 최단 경로를 구하면 그래프가 아닌 트리라는 확증이 있어야 한다. 아니면 내가 최종적으로 방문한 경로가 최단 경로인지 확신할 수 없기 때문이다. 반면 BFS는 도착 정점에.. 23.02.13 - 이니셜라이저, const 함수 class A { public: A(int a) { m_iA = a; } const int m_iA; }; 클래스 A는 멤버 상수 m_iA를 가지고 있는데, 이것을 초기화하려면 컴파일 단계에서 에러가 발생한다. 당연히 상수이기 때문에 생성자에서도 값을 변경할 수 없기 때문이다. 그렇다면 어떻게 해야 할까? 물론 const int m_iA = 3; 처럼 선언할 때 초기화를 해도 된다. 하지만 이것은 나중에 나온 문법이고 이니셜라이저를 사용하면 멤버 상수를 초기화 할 수 있다. class A { public: A(int a) : m_iA(a) { } const int m_iA; }; const는 함수 뒤에도 붙일 수 있다. 함수 뒤에 const를 붙이면 읽기 전용 함수가 된다. void ReduceHp(in.. 23.02.06 ~ 23.02.10 - 객체, 생성자, explicit, 전방선언 객체는 무엇일까? 객체는 기능과 속성을 포함하는 실체이다. 객체 지향 프로그래밍(OOP)는 객체에 중점을 두고 객체들간의 의사소통 방식으로 설계하는 프로그래밍이다. 클래스는 자료형이고 객체는 메모리에 할당된 클래스이다. 클래스 멤버 변수는 클래스 내에서 전역 변수처럼 사용 가능하고 멤버 변수는 객체가 할당되는 메모리에 할당되지만 명명권이 데이터 영역에 등록된다. 구조체는 함수를 가질 수 없지만 클래스는 멤버 변수와 멤버 함수를 가질 수 있다. 하지만 클래스는 구조체와 달리 중괄호식으로 초기화 할 수 없으며 생성자를 통해서만 초기화가 가능하다. 객체 생성시 먼저 메모리를 할당하고 생성자가 호출된다. 객체가 소멸될 때는 먼저 소멸자가 호출되고 메모리를 반환한다. 구조체 역시 생성자를 만들 수 있고 생성자가 .. [알고리즘] 그래프와 트리 (트리는 방향 그래프인가?) 1197번을 풀다가 최소 스패닝 트리는 무방향 그래프라는 것을 알았다. 그런데 트리는 유방향 그래프 아닌가? 그래프와 트리에 대해 헷갈려서 정리한다. 그래프 그래프는 정점과 정점 사이를 잇는 간선으로 이루어져있다. 유방향 그래프와 무방향 그래프로 나뉜다. 유방향 그래프는 간선으로 이어진 두 정점 중 시작 정점만 인접정점으로 도착 정점을 가지고 있고 무방향 그래프는 시작정점 도착정점 둘 다 서로를 인접정점으로 가지고 있으니 꽤 큰 차이다. 트리 트리는 그래프의 일종이다. 그리고 순환(사이클)을 허용하지 않는다. 부모 - 자식 관계가 존재하며, 루트 노드가 존재한다. 그런데 여기서 헷갈렸던게 한글로 검색하면 대부분 트리에 대해서 방향 그래프만 존재한다고 나와있다. 하지만 최소 스패닝 트리는 무방향 그래프였다.. [알고리즘] 최소 스패닝 트리 - 프림(Prim) 알고리즘 스패닝 트리 간선의 수를 최소화 해서 모든 정점을 이용하는 트리이다. N개의 정점이면 최소 N-1개의 간선으로 이루어져 있고 사이클이 발생하면 안된다. 간선의 수 뿐만 아니라 비용까지 계산해서 최단거리를 구하는 것이 최소 스패닝 트리이다. 프림(Prim) 알고리즘 프림 알고리즘도 크루스칼 알고리즘처럼 그리디 알고리즘으로 진행한다. 임의의 정점을 선택하고 T에 포함시킨 후 T에 포함된 노드와 포함되지 않은 노드 사이 간선 중 가중치가 최소인 간선을 선택하고 도착 정점을 T에 포함시킨다. https://www.weeklyps.com/entry/%ED%94%84%EB%A6%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Prims-algorithm 프림 알고리즘 ( Prim's algo.. [C++] memset으로 배열 초기화 시 0,-1으로만 초기화 가능 memset은 배열을 초기화할 때 자주 사용하는 함수이다. 그런데 0이나 -1이 아닌 다른 숫자로 초기화를 하면 엉뚱한 값으로 채워진다. 왜냐하면 memset은 value값을 unsigned char로 바꿔서 다루기 때문에 우리가 의도했던 것과 달라진다. memset(arr,1,sizeof(arr))로 1로 초기화하려 했지만 int가 아닌 unsigend char로 바꿔서 1바이트마다 1이 들어가기 때문에 전혀 다른 값으로 채워진다. 0,-1이 아닌 특정 값으로 배열을 채우고 싶다면 std::fill이나 std::fill_n을 사용하자. 이전 1 ··· 11 12 13 14 15 16 17 ··· 39 다음