구조체 생성자란?
구조체를 생성과 동시에 내부 변수들의 값을 초기화 시키는 함수.
C++에는 구조체와 비슷한 클래스가 존재하기 때문에 OOP(Object Oriented Programming)를 위해선 보통 클래스를 사용합니다. 하지만 프로젝트가 아닌 일반적인 알고리즘 문제를 풀 때는 구조체를 많이 사용하는데, 이를 위한 기능들을 소개해드리겠습니다.
일반적인 생성자를 따로 선언하지 않는 경우에는 아래와 같이 사용합니다. 하지만 알고리즘 문제를 풀다보면 vector, queue, stack 등 여러가지 자료구조에 구조체 템플릿을 선언해야할 때가 있습니다. 위와 같은 방법을 사용하게 되면 구조체 임시 변수를 하나 선언해놓고 값을 넣은 후, 자료구조에 다시 넣어줘야하는 번거러운 작업이 필요합니다.
#include <iostream> #include <string> #include <vector> using namespace std; typedef struct S{ int x, y, z; }; int main() { vector<S> v; // **** Example 1 **** // 구조체 객체 생성 S struct_var; // 구조체 변수 값 대입 struct_var.x = 1; struct_var.y = 3; struct_var.z = 5; // vector에 push v.push_back(struct_var); // **** Example 2 **** // 구조체 객체 생성 및 변수 값 대입 S struct_var2 = {10, 30, 50}; // vector에 push v.push_back(struct_var2); cout << "v[0] : " << v[0].x << " " << v[0].y << " " << v[0].z << endl; cout << "v[1] : " << v[1].x << " " << v[1].y << " " << v[1].z << endl; // v[0] : 1 3 5 // v[1] : 10 30 50 }
이와 같은 번거러운 작업은 아래처럼 구조체 생성자를 선언해서 해결할 수 있습니다. 아래의 예시를 보면 위의 예시와 같은 작업이지만 코드 길이가 확연하게 줄어든 것을 확인할 수 있습니다.
#include <iostream> #include <string> #include <vector> using namespace std; typedef struct S{ int x, y, z; S(int X, int Y, int Z) : x(X), y(Y), z(Z) {} }; int main() { vector<S> v; // 구조체 값 대입 및 vector에 push v.push_back(S(1,3,5)); v.push_back(S(10,30,50)); cout << "v[0] : " << v[0].x << " " << v[0].y << " " << v[0].z << endl; cout << "v[1] : " << v[1].x << " " << v[1].y << " " << v[1].z << endl; // v[0] : 1 3 5 // v[1] : 10 30 50 }
구조체 생성자 또한 다른 함수들과 같이 오버로딩 적용이 가능합니다. 상황에 따라 구조체 초기화를 다르게 하고싶을 때는 아래와 같이 원하는 생성자를 이용할 수 있습니다.
#include <iostream> #include <string> #include <vector> using namespace std; typedef struct S{ int x, y, z; // Overloadinng S() { x = 100; y = 300; z = 500; } S(int X, int Y, int Z) : x(X), y(Y), z(Z) {} }; int main() { vector<S> v; v.push_back(S(1,3,5)); v.push_back(S(10,30,50)); v.push_back(S()); cout << "v[0] : " << v[0].x << " " << v[0].y << " " << v[0].z << endl; cout << "v[1] : " << v[1].x << " " << v[1].y << " " << v[1].z << endl; cout << "v[2] : " << v[2].x << " " << v[2].y << " " << v[2].z << endl; // v[0] : 1 3 5 // v[1] : 10 30 50 // v[2] : 100 300 500 }
'Computer Science > C++' 카테고리의 다른 글
[C++] Split #2 - multiple delimiter split 함수 구현 (0) | 2021.02.02 |
---|---|
[C++] Split #1 - String delimiter split 함수 구현 (0) | 2021.01.28 |
[C++] 2차원 배열 행렬 바꾸기 (0) | 2021.01.25 |
[C++] 2차원 배열 90도 회전 (2) | 2021.01.23 |
[C++] 2차원 배열 특정 값 초기화 (0) | 2021.01.17 |