업데이트:

태그: ,

카테고리:



REF : 윤성우의 열혈 C++

const 객체

변수를 상수화 하듯, 객체도 상수화할 수 있다.

const SoSimple obj(2);
  • 객체에 const선언이 붙으면 이 객체를 대상으로는 const 멤버함수만 호출할 수 있다.
  • 이 객체의 데이터를 수정하지 않겠다는 의미.
  • 객체의 멤버변수도, 수정하지 않을 값이라면 const로 명시적으로 선언해줘야한다.
  • 또한 객체의 멤버함수도 객체 멤버를 수정하지않는다면 const를 명시적으로 선언해줘야한다.


const 함수 오버로딩

  • 함수 오버로딩 -> 매개변수의 수나 자료형이 다름.
  • const 선언도 구분할 수 있다.

  • const 함수가 먼저 호출되는 조건은,
    • 함수를 호출한 객체가 const인지 아닌지에 따라 다르다.



클래스와 함수의 friend 선언

클래스의 friend 선언

  • friend선언은 private 멤버의 접근을 허용하는 선언이다.
    • A클래스가 B클래스에게 friend 선언을 하면 B는 A의 private 멤버에 접근할 수 있다.
    • 반대도 가능케하려면 B클래스가 A클래스에게 friend선언을 해줘야한다.
  • friend선언의 위치는 상관없다.
class A
{
	private:
		int member;
		friend class B;
};

class B
{
	public:
		void ShowFriendMember(A &friend)
		{
			std::cout<<friend.member<<std::endl;
		}
};


  • friend 선언 자체는 객체지향의 정보은닉을 무너뜨리기 때문에, 과도해선 안된다.
  • cpp과제들에서 friend선언을 금지하는 이유이기도하다.


함수의 friend 선언

  • 전역함수, 멤버함수를 대상으로 friend선언이 가능하다.
  • friend선언된 함수는 자신이 선언된 클래스의 private 영역에만 접근가능하다.



static

  • 멤버변수와 멤버함수에 static을 추가할 수 있다.
  • C에서 static
    • 전역변수에 선언된 static의 의미
      • 선언된 파일 내에서만 참조를 허용
    • 함수 내에 선언된 static의 의미
      • 한번만 초기화되고, 함수가 스택영역에서 해제되어도 static 변수는 소멸하지 않는다.


  • C++에서 static은 느낌이 다르다.
    • C++에서 static은 클래스를 위한 전역변수의 느낌이다.
    • C처럼 전역변수로 클래스가 공유하는 변수를 생성하면, 어느 클래스든 접근가능하기에 정보은닉과는 거리가 멀어진다.


static 멤버변수

  • static 멤버변수는 클래스 변수라고도 한다.
  • 멤버변수는 객체마다 생성되지만, 클래스변수는 클래스마다 생성되기 때문이다.
  • static 멤버변수는 생성, 소멸 시점이 전역변수와 동일하다.
  • 그리고 해당 클래스인 모든 객체가 공유한다.

  • 사용
      class SoSimple
      {
          private:
              static int num;
      };
      int SoSimple::num = 0;
    
    • 초기화는 클래스 외부에서 진행한다.
    • 생성자에서는 초기화해선 안된다. 객체 생성시마다 초기화된다.
      • 멤버함수처럼 이미 메모리에 할당되어있다고 생각해야한다.


  • public으로 선언된 static 멤버변수는 클래스이름이나 객체이름으로 접근이 가능하다.
    • 단, 이렇게 접근할때는 클래스 이름으로 접근하는게 명시적으로 접근하고자 하는 변수가 멤버변수인지, static 변수인지 표현할 수 있다.



static 멤버함수

  • 선언된 클래스의 모든 객체가 공유한다.
  • public으로 선언되면 클래스 이름으로 호출이 가능하다.
  • 객체의 멤버로 존재하는게 아니라 메모리상에 독자적으로 존재한다.
    1. 객체의 멤버가 아니므로 멤버변수에 접근할 수 없다.
    2. 객체 생성 이전에도 호출할 수 있으므로, 멤버변수에 접근이 불가능하다.
    3. 클래스로 멤버함수에 접근하면, 어느 객체를 선택해 멤버변수를 접근할 것인가에 대한 오류
  • static 멤버함수 내에선 static 멤버변수와 static 멤버함수만 호출할 수 있다.
class SoSimple
{
	private:
		int num1;
		static int num2;
	public:
		SoSimple(int n) : num1(n)
		{}
		static void Adder(int n)
		{
			num1 += n; //멤버변수 없음 에러
			num2 += n; //멤버변수 없음 에러
		}
};
int SoSimple::num2 = 0;


const static 멤버

const 멤버변수의 초기화는 이니셜라이저로만 가능한데,

  • const static 멤버변수는 선언과 동시에 초기화가 가능하다.
  • 클래스가 정의될때부터 값이 정해져 유지되므로, 선언과 동시에 초기화를 허용한다.


mutable

  • const 함수 내에서의 값의 변경을 예외적으로 허용한다.
  • mutable은 제한적으로, 예외적인 경우에만 사용한다.
    • const의 의미가 사라지기때문.


댓글남기기