private으로 설정된 멤버는 변수, 함수 모두 class밖에서는 '.' 또는 '->'연산자를 사용해 바로 접근할 수 없다.
private 멤버 변수에 바로 접근을 하지 못해 매개체 역할의 멤버 함수가 필요하다.
#include <iostream>
using namespace std;
class myclass
{
private:
int m, n;
public:
void setM(int);
void setN(int);
int sum();
void print();
};
int main()
{
myclass A, B;
A.setM(3);
A.setN(7);
B.setM(5);
B.setN(-12);
cout << "A의 합:" << A.sum() << endl;
cout << "B의 합:" << B.sum() << endl;
A.print();
B.print();
return 0;
}
void myclass::setM(int m1)
{
m = m1;
}
void myclass::setN(int n1)
{
n = n1;
}
int myclass::sum()
{
return m + n;
}
void myclass::print()
{
cout << "m:" << m << ",n:" << n << endl;
}
private한 "멤버 함수"를 사용하는 경우, 해당 class 함수 안에서만 반복적으로 쓰일 때 private으로 만든다.
함수 선언 시 맨 앞에 써주면 "inline function" 이 된다. 정의부에는 쓰지 않아야 하며, 선언과 정의를 몰아서 코딩했으면 맨 앞에 한 번 써 주면 된다.
함수의 내용에 영향을 주지는 않고, 컴파일 방식에 영향을 준다. 컴파일 도중 원래 함수를 부르면 매개변수를 가지고 그 함수가 있는 구문을 찾아가야 하는데, inline function은 이를 생략하기 위해 함수 내용을 부른 부분에 그대로 복사붙여넣기 하는 식으로 끼원허어 컴파일 시간을 단축시킨다. 단, 많이 사용 시 프로그램의 용량이 늘어나 내용이 짧으면서 많이 사용되는 함수에 사용한다. class의 멤버 함수도 인라인 함수일 수 있다.
#include <iostream>
using namespace std;
inline int sum(int, int);
int main()
{
cout << sum(3, 5) << endl;
return 0;
}
int sum(int a, int b)
{
return a + b;
}
해당 개체를 정적으로 만든다. static 변수는 scope를 나가도 접근이 어려워질 뿐, 값이 사라지지는 않는다.
class안의 static 멤버 변수, 함수.
- static 멤버 변수는 해당 class 모두가 값을 공유하게 되는 개념.
main() 함수 시작 전 한 번 이상의 초기화가 필요하다.- static 멤버 함수는 자신과 같은 class의 멤버 변수라도 접근할 수 있는 변수가 static 멤버 변수로 한정.
public일 경우 변수, 함수 상관없이 object 없이 불러낼 수 있다.
#include <iostream>
using namespace std;
class testStatic{
private:
static int static_n;
int auto_n;
public:
static void set_static(int);
static int get_static();
void set_auto(int);
int get_auto();
};
int testStatic::static_n = 0;
int main(){
testStatic A, B;
A.set_static(5);
A.set_auto(3);
cout << "A.static_n: " << A.get_static() << endl;
cout << "A.auto_n : " << A.get_auto() << endl;
B.set_auto(-2);
cout << "B.static_n: " << B.get_static() << endl;
cout << "B.auto_n : " << B.get_auto() << endl;
testStatic::set_static(10);
cout << "static_n : " << testStatic::get_static() << endl;
return 0;
}
void testStatic::set_static(int n){
static_n = n;
}
int testStatic::get_static(){
return static_n;
}
void testStatic::set_auto(int n){
auto_n = n;
}
int testStatic::get_auto(){
return auto_n;
}