#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { cout << "생성자 호출!" << endl; }
~MyClass() { cout << "소멸자 호출!" << endl; }
};
int main() {
MyClass obj; // 객체 생성
return 0; // 객체가 스코프를 벗어나면서 소멸자 호출
}
출력 예)
생성자 호출!
소멸자 호출!
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { cout << "생성자 호출!" << endl; }
~MyClass() { cout << "소멸자 호출!" << endl; }
};
int main() {
MyClass* obj = new MyClass(); // 동적 할당
delete obj; // 명시적으로 delete 해야 소멸자가 호출됨
return 0;
}
출력 예)
생성자 호출!
소멸자 호출!
#include <iostream>
using namespace std;
class Base {
public:
Base() { cout << "Base 생성자 호출" << endl; }
~Base() { cout << "Base 소멸자 호출" << endl; } // 가상 소멸자가 아님
};
class Derived : public Base {
public:
Derived() { cout << "Derived 생성자 호출" << endl; }
~Derived() { cout << "Derived 소멸자 호출" << endl; }
};
int main() {
Base* obj = new Derived(); // 업캐스팅
delete obj; // Base의 소멸자만 호출됨!
return 0;
}
출력 예) - Derived 클래스의 소멸자가 호출되지 않아 메모리 누수를 일으킬 수 있다
Base 생성자 호출
Derived 생성자 호출
Base 소멸자 호출
#include <iostream>
using namespace std;
class Base {
public:
Base() { cout << "Base 생성자 호출" << endl; }
virtual ~Base() { cout << "Base 소멸자 호출" << endl; } // 가상 소멸자
};
class Derived : public Base {
public:
Derived() { cout << "Derived 생성자 호출" << endl; }
~Derived() { cout << "Derived 소멸자 호출" << endl; }
};
int main() {
Base* obj = new Derived(); // 업캐스팅
delete obj; // 모든 소멸자가 올바르게 호출됨
return 0;
}
출력 예)
Base 생성자 호출
Derived 생성자 호출
Derived 소멸자 호출
Base 소멸자 호출
class AbstractBase {
public:
virtual ~AbstractBase() = 0; // 순수 가상 소멸자
};
AbstractBase::~AbstractBase() { // 정의 필수!
cout << "AbstractBase 소멸자 호출" << endl;
}
#include <iostream>
using namespace std;
int main() {
string name;
cout << "이름을 입력하세요: ";
cin >> name;
cout << "안녕하세요, " << name << "!" << endl;
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream file("example.txt"); // 파일 열기
if (file.is_open()) {
file << "Hello, World!\n";
file << "C++ File Writing Example.";
file.close(); // 파일 닫기
cout << "파일이 성공적으로 작성되었습니다." << endl;
} else {
cout << "파일을 열 수 없습니다." << endl;
}
return 0;
}
ios::out : 기본 쓰기 모드 (기존 내용 덮어쓰기)
ios::app : 기존 파일 끝에 데이터 추가 (Append)
ios::trunc : 파일 내용을 지우고 새로 작성
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream file("example.txt"); // 파일 열기
if (file.is_open()) {
string line;
while (getline(file, line)) { // 한 줄씩 읽기
cout << line << endl;
}
file.close(); // 파일 닫기
} else {
cout << "파일을 열 수 없습니다." << endl;
}
return 0;
}
ifstream file("example.txt");
string word;
while (file >> word) { // 공백을 기준으로 단어 읽기
cout << word << endl;
}
#include <iostream>
#include <fstream>
using namespace std;
class Person {
public:
string name;
int age;
void saveToFile() {
ofstream file("person.dat", ios::binary);
file.write(reinterpret_cast<char*>(this), sizeof(Person));
file.close();
}
};
int main() {
Person p = {"Alice", 25};
p.saveToFile();
cout << "객체가 파일에 저장되었습니다." << endl;
return 0;
}
Person p;
ifstream file("person.dat", ios::binary);
file.read(reinterpret_cast<char*>(&p), sizeof(Person));
file.close();
ofstream file("data.bin", ios::binary);
int number = 123;
file.write(reinterpret_cast<char*>(&number), sizeof(int));
file.close();
setw(n) : 출력 폭 설정
setprecision(n) : 소수점 자리수 설정
fixed : 고정 소수점 형식
scientific : 지수 표기법 사용
left / right : 정렬 방식 설정
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double pi = 3.1415926535;
cout << "기본 출력: " << pi << endl;
cout << "소수점 3자리: " << fixed << setprecision(3) << pi << endl;
cout << "과학적 표기법: " << scientific << pi << endl;
return 0;
}
출력 예)
기본 출력: 3.14159
소수점 3자리: 3.142
과학적 표기법: 3.142e+00