[C++] const, static, friend
        
        
      
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 변수는 소멸하지 않는다.
 
 
 - 전역변수에 선언된 static의 의미
        
 
- C++에서 static은 느낌이 다르다.
    
- C++에서 static은 
클래스를 위한 전역변수의 느낌이다. - C처럼 전역변수로 클래스가 공유하는 변수를 생성하면, 어느 클래스든 접근가능하기에 정보은닉과는 거리가 멀어진다.
 
 - C++에서 static은 
 
static 멤버변수
- static 멤버변수는 
클래스 변수라고도 한다. - 멤버변수는 
객체마다생성되지만, 클래스변수는클래스마다생성되기 때문이다. - static 멤버변수는 
생성, 소멸 시점이 전역변수와 동일하다. - 
    
그리고
해당 클래스인 모든 객체가 공유한다. - 사용
    
class SoSimple { private: static int num; }; int SoSimple::num = 0;- 초기화는 클래스 외부에서 진행한다.
 - 생성자에서는 초기화해선 안된다. 객체 생성시마다 초기화된다.
        
- 멤버함수처럼 이미 메모리에 할당되어있다고 생각해야한다.
 
 
 
- public으로 선언된 static 멤버변수는 클래스이름이나 객체이름으로 접근이 가능하다.
    
- 단, 이렇게 접근할때는 클래스 이름으로 접근하는게 명시적으로 접근하고자 하는 변수가 
멤버변수인지,static 변수인지 표현할 수 있다. 
 - 단, 이렇게 접근할때는 클래스 이름으로 접근하는게 명시적으로 접근하고자 하는 변수가 
 
static 멤버함수
- 선언된 클래스의 모든 객체가 공유한다.
 - public으로 선언되면 클래스 이름으로 호출이 가능하다.
 - 객체의 멤버로 존재하는게 아니라 메모리상에 독자적으로 존재한다.
    
- 객체의 멤버가 아니므로 멤버변수에 접근할 수 없다.
 - 객체 생성 이전에도 호출할 수 있으므로, 멤버변수에 접근이 불가능하다.
 - 클래스로 멤버함수에 접근하면, 어느 객체를 선택해 멤버변수를 접근할 것인가에 대한 오류
 
 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의 의미가 사라지기때문.
 
 
댓글남기기