C++에서 기본적으로 멤버 변수에 접근하기 위해 public 멤버 함수를 이용한다. 하지만 friend 키워드를 사용하면 특정한 객체의 모든 멤버에 접근 가능하다.
#include<iostream>
#include<string>
using namespace std;
class Student {
private:
int studentId;
string name;
public:
Student(int studentId, string name) : studentId(studentId), name(name) { }
friend Student operator +(const Student& student, const Student& other) {
return Student(student.studentId, student.name + " & " + other.name);
}
void show() { cout << "이름: " << name << '\n'; }
void showName() { cout << "학생 이름 : " << name << '\n';}
};
int main(void) {
Student student(1, "나동빈");
Student result = student + student;
result.showName();
system("pause");
}
프렌드 멤버 함수 외 프렌드 클래스 형태로 사용 가능하며 클래스 자체를 프렌드로 선언하여 private 멤버에 접근 할 수 있도록 한다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
class Time{
friend class Date; // Date 클래스에서Time 클래스를이용할수있음.
private:
int hour, min, sec;
public:
void setCurrentTime() {
time_t currentTime = time(NULL);
struct tm* p = localtime(¤tTime);
hour = p->tm_hour;
min = p->tm_min;
sec = p->tm_sec;
}
};
class Date{
private:
int year, month, day;
public:
Date(int year, int month, int day) : year(year), month(month), day(day) { }
void show(const Time& t) {
cout << "지정된날짜: " << year << "년" << month << "월" << day << "일" << '\n';
cout << "현재시간: " << t.hour << ":" << t.min << ":" << t.sec << '\n';
}
};
int main(void) {
Time time;
time.setCurrentTime();
Date date = Date(2019, 12, 22);
date.show(time);
system("pause");
}
friend 키워드를 사용함으로 public 멤버함수를 통해 간접적으로 접근하지 않아도 되는 장점이 생김
Static Member는 클래스에 포함되어 있는 멤버지만 모든 객체가 공유하는 멤버이다. 정적으로 선언된 멤버는 메모리 상에 오직 하나만 할당되어 관리된다.
#include <iostream>
#include <string>
using namespace std;
class Person{
private:
string name;
public:
static int count;
Person(string name) : name(name) {
count++;
}
};
// static 변수 초기화
int Person::count = 0;
int main(void) {
Person p1("나동빈");
Person p2("홍길동");
Person p3("이순신");
cout << "사람의수: " << Person::count << '\n';
system("pause");
}
Constant Member는 호출된 객체의 데이터를 변경할 수 없는 멤버를 의미한다. 일반적으로 클래스에서 사용되는 중요한 상수는 상수 멤버 변수로 정의해서 사용하는 관행이 있다.
#include <iostream>
#include <string>
using namespace std;
class Person{
private:
const int id;
string name;
public:
static int count;
Person(int id, string name) : id(id), name(name) {
count++;
}
/*
void setId(int id) {
this->id = id; // 오류발생[수정불가능]
}
*/
};
int Person::count = 0;
int main(void) {
Person p1(1, "나동빈");
Person p2(2, "홍길동");
Person p3(3, "이순신");
cout << "사람의수: " << Person::count << '\n';
system("pause");
}