(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포인터가 사라지지만 반환값이 참조자이므로 참조하는 객체는 계속 사용 할 수 있다.

댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기