#include <iostream>
class UserData {
// 접근 제어 지시자(public / protected / private)
public:
// 멤버 변수 선언
int age;
char name[32];
// 멤버 함수 선언 및 정의
void print(void) {
printf("%d, %s\n", age, name);
}
}
int main(int argc, char* argv[]) {
UserData user = {24, "강민석"};
user.print();
return 0;
}
클래스의 멤버 변수는 '생성자(constructor)'를 통해 초기화 할 수 있다는 점이 구조체와의 큰 차이점이다.
멤버 변수를 초기화 하는 방법 세 가지
#include <iostream>
// 1. 생성자를 통한 초기화
class Example1 {
public:
Example1() {
std::cout << "생성자 함수를 호출하여 멤버변수를 초기화합니다." << std::endl;
data = 10;
}
int data;
void printData(void) {
std::cout << "data: " << data << std::endl;
}
}
// 2. 생성자 초기화 목록 사용
class Example2 {
public:
Example2
: data1(10), data2(20)
{ }
int data1;
int data2;
void printData(void) {
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
}
}
// 3. 선언과 동시에 초기화(C++11 이상)
class Example3 {
public:
Example3() {}
int data1 = 10;
int data2 = 20;
void printData(void) {
std::cout << "data1: " << data1 << std::endl;
std::cout << "data2: " << data2 << std::endl;
}
}
class Example {
public:
Example() {
data = 10;
}
int data;
// 멤버 함수 선언. 정의부는 클래스의 외부에 분리할 수 있다.
void printData(void);
}
void Example::printData(void) {
std::cout << "data: " << data << std::endl;
}
main()
함수보다 먼저 호출된다.#include <iostream>
using namespace std;
class Example {
int data;
public:
Example(int param): data(param) {
cout << "initial data: " << param << endl;
}
~Example() {
cout << "call destructor" << endl;
}
}
int main(int argc, char* argv[]) {
cout << "begin main" << endl;
Example a(1);
cout << "before b" << endl;
Example b(2);
cout << "end main" << endl;
}
// 출력
// begin main
// initial data: 1
// before be
// initial data: 2
// end main
// call destructor
// call destructor
new
연산을 통해 동적으로 선언할 수 있으며, 이 경우 delete
연산을 통해 삭제해야 한다.Example(int ¶m) { data = param } // data=param 구문은 초기화가 아닌 단순 대입이므로 오류 발생
Example(int param): data(param) { } // 함수의 매개변수는 반환과 동시에 소멸되므로, 쓰레기값만 남게 된다. 즉, 반드시 참조형으로 전달해줘야함.
class Example {
public:
// 디폴트 생성자 선언 및 정의
Example(void) = default;
int data = 5;
}
디폴트 생성자의 선언 및 정의를 명백히 분리한다는 말의 의미가 잘 와닿지 않는다...
당장은 이런 문법이 존재한다는것만 알아두라고 한다. '템플릿'에서 쓰인다고 하니 그때 자세히 알아보자.
Example(void) = delete;
this
포인터는 작성 중인 클래스의 실제 인스턴스에 대한 주소를 가리키는 포인터다.class Example {
public:
Example(int param): data(param) {}
int data;
void printData() {
cout << "data: " << this -> data << endl;
}
}
const
예약어만 붙이면 된다.mutable
로 선언함 멤버 변수의 값은 상수형 메서드에서도 쓰기가 허용된다.const_cast<>
를 사용하여 상수형 참조를 억지로 변경할 수 있다.delete
예약어를 통해 명시적으로 메서드를 삭제하여 원치않는 형식의 실인수가 넘어오는 것을 미연에 방지할 수 있다.this
포인터를 사용할 수 없으며, 정적 변수는 반드시 선언과 정의를 분리해야 한다. -> 그럼 참조형 정적 변수는 존재할 수 없다는건가?