(C++) 9장 friend, static, this포인터
1. 클래스의 friend 선언
#include<iostream>
using namespace std;
class Chulsoo;
class Younghee
{
private:
int age;
public:
Younghee(int age): age(age)
{
cout<<"Younghee::Younghee(age)생성자 완료"<<endl;
}
void introduce()
{
cout<<"영희 나이: "<<age<<endl;
}
void whoIsOlder(const Chulsoo& chulsoo); //여기서 Chulsoo클래스를 식별하기 위해 2번째 줄에서 선언해줌
};
class Chulsoo
{
private:
int age;
public:
Chulsoo(int age):age(age)
{
cout<<"생성자완료"<<endl;
}
//friend class Younghee;
}
void Younghee::whoIsOlder(const Chulsoo& chulsoo){
cout<<"영희는 철수보다"<<((age>chulsooObj.age)?"나이가 많다.":"나이가 같거나 적다"<<endl;
}
///오류가 발생한다.
그 이유는 Chulsoo클래스의 age는 private으로 은닉되어있다. 그러므로 friend class Younhee를 선언해주면 접근 가능해진다.
friend는 클래스 뿐만 아니라 함수에도 선언 가능하다.
ex) friend Younghee::whoIsOlder(const Chulsoo& chulsoo);
또한, 일반 전역함수에도 가능하다.
friend void howOldAreYou(const Chulsoo& chulsooObj,const Younghee& youngheeObj);
2. Static 변수
C++에서의 전역변수는 클래스 범주에서의 전역변수이다.
즉, A라는 클래스가 있고 A클래스의 파생 객체 a1,a2,a3객체를 만들었다면 오직 하나의 전역변수만 공유한다.
예제)
#include<iostream>
using namespace std;
class Chulsoo
{
private:
int age;
static int chulsooPriateCounter;
protected:
static int chulsooProtectedCounter;
public:
static int chulsooPublicCounter;
Chulsoo(int age):age(age)
{
chulsooPrivateCounter++;
chulsooProtectedCounter++;
chulsooPublicCounter++;
}
};
int Chulsoo::chulsooPrivateCounter=0;
int Chulsoo::chulsooProtectedCounter=0;
int Chulsoo::chulsooPublicCounter=0;
class Younghee
{
private:
int age;
public:
Younghee(int age):age(age)
{
//Chulsoo::chulsooPrivateCounter++;
//Chulsoo::chulsooProtectedCounter++;
Chulsoo::chulsooPublicCounter++;
}
};
//영희 클래스의 생성자를 생성하게 되면 Chulsoo클래스의 public으로 선언된 static변수만 올라가는 것을 볼 수 있다. private과 protected는 다른클래스에 접근 할 수 없다.
3. this포인터
Chulsoo* returnThisPointer()
{
return this;
}
//this자체를 반환한다.
Chulsoo returnThisPointer()
{
return* this;
}
//함수가 종료되면서 사라지므로 반환값이 없다
Chulsoo& returnThisPointer()
{
return *this;
}
//함수가 종료되며 this포인터가 사라지지만 반환값이 참조자이므로 참조하는 객체는 계속 사용 할 수 있다.
#include<iostream>
using namespace std;
class Chulsoo;
class Younghee
{
private:
int age;
public:
Younghee(int age): age(age)
{
cout<<"Younghee::Younghee(age)생성자 완료"<<endl;
}
void introduce()
{
cout<<"영희 나이: "<<age<<endl;
}
void whoIsOlder(const Chulsoo& chulsoo); //여기서 Chulsoo클래스를 식별하기 위해 2번째 줄에서 선언해줌
};
class Chulsoo
{
private:
int age;
public:
Chulsoo(int age):age(age)
{
cout<<"생성자완료"<<endl;
}
//friend class Younghee;
}
void Younghee::whoIsOlder(const Chulsoo& chulsoo){
cout<<"영희는 철수보다"<<((age>chulsooObj.age)?"나이가 많다.":"나이가 같거나 적다"<<endl;
}
///오류가 발생한다.
그 이유는 Chulsoo클래스의 age는 private으로 은닉되어있다. 그러므로 friend class Younhee를 선언해주면 접근 가능해진다.
friend는 클래스 뿐만 아니라 함수에도 선언 가능하다.
ex) friend Younghee::whoIsOlder(const Chulsoo& chulsoo);
또한, 일반 전역함수에도 가능하다.
friend void howOldAreYou(const Chulsoo& chulsooObj,const Younghee& youngheeObj);
2. Static 변수
C++에서의 전역변수는 클래스 범주에서의 전역변수이다.
즉, A라는 클래스가 있고 A클래스의 파생 객체 a1,a2,a3객체를 만들었다면 오직 하나의 전역변수만 공유한다.
예제)
#include<iostream>
using namespace std;
class Chulsoo
{
private:
int age;
static int chulsooPriateCounter;
protected:
static int chulsooProtectedCounter;
public:
static int chulsooPublicCounter;
Chulsoo(int age):age(age)
{
chulsooPrivateCounter++;
chulsooProtectedCounter++;
chulsooPublicCounter++;
}
};
int Chulsoo::chulsooPrivateCounter=0;
int Chulsoo::chulsooProtectedCounter=0;
int Chulsoo::chulsooPublicCounter=0;
class Younghee
{
private:
int age;
public:
Younghee(int age):age(age)
{
//Chulsoo::chulsooPrivateCounter++;
//Chulsoo::chulsooProtectedCounter++;
Chulsoo::chulsooPublicCounter++;
}
};
//영희 클래스의 생성자를 생성하게 되면 Chulsoo클래스의 public으로 선언된 static변수만 올라가는 것을 볼 수 있다. private과 protected는 다른클래스에 접근 할 수 없다.
3. this포인터
Chulsoo* returnThisPointer()
{
return this;
}
//this자체를 반환한다.
Chulsoo returnThisPointer()
{
return* this;
}
//함수가 종료되면서 사라지므로 반환값이 없다
Chulsoo& returnThisPointer()
{
return *this;
}
//함수가 종료되며 this포인터가 사라지지만 반환값이 참조자이므로 참조하는 객체는 계속 사용 할 수 있다.
댓글
댓글 쓰기