[250106 TIL] 정적/동적 배열과 벡터, 생성자와 소멸자에서 놓쳤던 부분
1️⃣ 알고리즘 코드카타
▪ 반복문 증감 조건식에는 하나 이상이 올 수 있음
for(int i = 0; i < 10; i++, j++){
//반복 내용
}
string s = Hello;
s[i] = " "; // 에러
s[i] = ' '; //작은 따옴표를 써줘야 함
▪ int형 사용할 땐 항상 숫자 범위 생각하기
▪ 일부 문자열 → A.substr(begin, end)
▪ 원소 반복문 쓸 때
for(auto &size : sizes){ //원소 반복문의 변수도 복사 전달
if(size[0]<size[1]){
swap(size[0], size[1]);
}
}
▪ 반복과 최대/최소 비교를 사용할 땐 -> min/max 함수
int w=0, h=0;
for(int i=0; i<sizes.size(); i++)
{
w=max(w,min(sizes[i][0],sizes[i][1]));
h=max(h,max(sizes[i][0],sizes[i][1]));
}
2️⃣ C++ 복습
▪ 배열은 size()함수(STL 컨테이너만 사용 가능_std::Array는 있음) 사용 불가능
sizeof(arr)/sizeof(arr[0])으로 원소의 개수 알아냄
sizeof(arr) : 배열 전체의 메모리 크기, sizeof(arr[0]) : 배열 하나의 메모리 크기
단 배열이 함수로 전달되면 sizeof(arr)은 배열 전체가 아닌 포인터 크기(4/8바이트)를 반환
▪ max({value1, value2, value3})
여러 숫자 중 가장 큰 값을 구할 수 있음
중괄호를 사용하면 내부적으로 initializer_list 생성(자료형 혼합은 불가능)
▪ max_element(numbers.begin(), numbers.end());
범위 내에서 가장 큰 원소의 반복자 반환(인덱스 알 수 있음)
범위가 비어 있으면 last(numbers.end()) 반환
▪ 배열 생성
정적 배열 : 컴파일 전 배열의 크기가 정해져야 함
동적 배열 : 런타임 중 배열의 크기 설정 가능
(단, 변경 시 새 배열 생성→ 기존 배열 내용 복사 → 기존 배열 메모리 해제 과정 필요)
벡터 : 런타임 중 크기 조절 가능
int* arr[5]; //포인터 변수 정적 배열 생성(컴파일 전 크기가 정해져야 함)
int* arr = new int[5]; //일반 변수 동적 배열 생성(런타임 중 크기 설정 가능)
int arr[5]; //일반 변수 정적 배열 생성(컴파일 전 크기가 정해져야 함)
3️⃣ 추가 공부
🔹생성자/소멸자
생성 : 부모→자식
1. 부모클래스에 매개변수 생성자만 존재하는 경우
자식 클래스에서 명시적으로 호출 필요
(기본 생성자 자동 생성 안되고 기본 생성자가 없으니 매개변수 생성자도 꼭 호출해야 함)
2. 생성자가 없을 경우
컴파일러가 자동으로 기본 생성자를 만들어줌
(하나라도 생성자를 정의했을 경우 컴파일러는 기본 생성자 자동 생성 안 함)
3. 상수 또는 참조형 멤버를 정의하지 않고 선언만 했을 경우
이를 가지고만 있어도 컴파일러는 기본생성자 자동 생성 안 함
소멸 : 자식→부모
1. 부모클래스의 포인터로 자식 객체 관리할 경우
부모 소멸자에 virtual 안 붙여주면 자식 소멸자 호출 안됨
#include <iostream>
using namespace std;
class Employee{
public:
Employee() {
cout << "Employee 기본 생성자 호출!" << endl;
}
virtual void work() {
cout << "Employee is working." << endl;
}
~Employee() { //virtual 없음
cout << "Employee 소멸자 호출!" << endl;
}
};
class Developer : public Employee {
public:
Developer() {
cout << "Developer 기본 생성자 호출!" << endl;
}
void work() override {
cout << "Developer is working." << endl;
}
~Developer() {
cout << "Developer 소멸 생성자 호출!" << endl;
}
};
class Manager :public Employee {
public:
Manager() {
cout << "Manager 기본 생성자 호출!" << endl;
}
void work() override {
cout << "Manager is planning." << endl;
}
~Manager() {
cout << "Manager 소멸 생성자 호출!" << endl;
}
};
int main() {
Employee* team_dynamic[2];
team_dynamic[0] = new Developer();
team_dynamic[1] = new Manager();
for (int i = 0; i < 2; i++) {
team_dynamic[i]->work();
delete team_dynamic[i]; //자식 소멸자는 호출 안됨
}
return 0;
}