구조체 생성자란?
구조체를 생성과 동시에 내부 변수들의 값을 초기화 시키는 함수.
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 |