[C++ 7_1. const, 포인터, 지역변수, 전역변수]

·2022년 7월 29일
0

C++_Study

목록 보기
13/25

#220729~
#220802~ 이어서

#7-1. const변수, const함수, const객체

  • const(constant)
    변수에 const라는 키워드를 사용하여 상수의 의미를 갖게하여 그 내용을 변경할 수 없게 함.
  • #define XX1
    '#' 붙은건 전처리기로 컴파일 전에 XX를 1로 변경
  • const int x=1;
    변수 x는 항상 초기값 1, 변경 불가
  • int const y=1; /비추, const 자료형 앞에 씀
  • const int z{1}; /Uniform initialization, c++11
    z{}라고 쓰면 자동으로 0으로 초기화
#define XX 1     //컴파일 전에 xx를 찾아서 1로 바꿈 
int main()
{
    const int x = 2;		//변수 x 는 항상 1, 변경불가 
    int const y = 3;		//비추, const는 항상 자료형 앞에 씀
    const int z{4};			//Uniform initialization 
    constexpr int a = 5;    //c++11부터 가능, compile-time constant 
    std::cout << XX << " " << x << " " << y << " " << z << " " << a  << "" << std::endl;   
    return 0;
}

// 결과값 => 1 2 3 4 5 
  • void fun(void) const;
    : 함수가 const, 멤버변수를 변경하지 않는 함수

  • const형 멤버함수는 멤버변수를 변경하는 치환을 연산할 수 없음.

  • const로 지정된 함수에서는 멤버변수의 값을 변경할 수 없다.

    • 멤버를 참조만 하는 읽기 전용 함수(get으로 시작하는 함수)가 됨
  • const 함수는 const 함수만 호출할 수 있으며 일반 멤버함수에는 접근할 수 없다.

  • 생성자와 소멸자에서는 const를 사용할 수 없다.

  • const형을 추가선언하고자 하면 멤버변수는 형 앞에 const를, 멤버함수는 함수의 괄호 다음에 const를 추가한다.

    • const int age; //멤버변수는 형 앞에
    • int getAge() const; //멤버함수는 괄호 다음에
    int getAge()const
    {
    	return age;
    } 
// const형 멤버함수 
class Dog{
    int age;
public:
    int getAge() const; 
    void setAge(int a){age=a;}
    // getAge()가 const라서 view()도 const여야 함수 호출 가능
    void view() const {std::cout << "나는 view" << std::endl;}
};
int Dog::getAge() const 
{   
    view();             //const 멤버함수는 const 함수만 호출할 수 있고, 일반함수를 호출할 수 없다. 여기서 view가 const라면 가능
    // return(++age);  //const 멤버함수에서는 멤버변수 age를 변경할 수 없다, age 그대로는 가능
    return age;        //값 변경없이 출력하는 것은 가능 
}

int main() 
{
    Dog happy;
    happy.setAge(5);
    std::cout << happy.getAge()<< std::endl; 
    return 0;
}

✓ const 객체

  • 객체가 const로 지정되면 해당 객체에 초기화된 데이터는 변경할 수 없고, const로 지정된 멤버함수만 호출할 수 있다.
  • 객체를 const로 지정하려면 객체 정의시 클래스 명 앞에 const를 추가한다.
  • const Dog happy;
    • const 객체 happy
    • happy의 초기화된 데이터를 변경할 수 없다!

#7-2. 포인터: c/c++ 언어를 다른 언어와 차별화 시키는 가장 큰 특징

  • 포인터를 이용하게 되면 기계어나 어셈블리 언어처럼 메모리의 '주소'를 이용해서 메모리의 내용을 직접 접근할 수 있음!
  • 포인터가 사용되는 경우
    • call by reference 로 함수로부터 한개 이상의 값을 리턴할 때
    • 함수들 간에 배열이나 문자열을 전달할 때
    • 배열 조작을 쉽게 할 떄
    • 연결리스트나 이진트리 등 복잡한 구조를 만들 때
    • 메모리를 동적으로 할당할 때
  • int sum=0;
    • 변수를 초기화하여 선언하면 int형이므로 4바이트 메모리 공간이 확보되고 초기값으로 0이 할당됨
    • sum 변수가 실제로 할당된 메모리의 주소를 알고싶다면 &연산자를 사용하여 &sum이라고 하면 변수가 기억되어 있는 메모리 번지를 알 수있음!
    • 메모리의 주소를 저장하려면 일반변수가 아닌 포인터 사용
  • 참조 연산자 *
int main(void)
{
    int x = 10, y;
    int* px;            //선언문, 포인터 px 선언 

    px = &x;            //포인터 px에 x의 주소 대입
    y = *px;            //실행문, px의 주소로 가서 값을 가져옴 

    std::cout << x << " " << std::endl; 
    std::cout << sizeof(x) << std::endl;                            // x의 사이즈는 4바이트 (int형)
    std::cout << px << " " << &px << " " << *px << std::endl;       // x의 주소값, &px의 주소값, y의값
    std::cout << y << " " <<  &y << " " << std::endl;               // y의 값, y의 주소값
    return 0;               
}

#7-3. 지역(local)변수와 전역(global)변수

-- 지역/전역 변수는 변수의 '선언 위치'에 따라서 결정됨
함수(main()) 안에서 선언하면 지역, 함수 밖에서 선언하면 전역

  • 전역변수: 메인함수 바깥쪽에 있는 변수, 소스 전체에서 사용할 수 있음
  • 지역변수: 해당 함수나 블록({}) 안에서만 사용할 수 있음
void show(void);
int x; 			 //전역 변수
//데이터 영역에 저장 
int main(void)
{
	int y; 		//지역변수 
    //스택에 저장
}
void show(void)
{
	int z;		//지역변수
}

✭ 전역 변수는 함수 밖에서 선언하며, 프로그램의 모든 부분에서 사용 가능
✭ 데이터 영역을 사용하며 프로그램 실행이 종료될 떄까지 값 유지
✭ 지역변수와 중복해서 선언되어 있으면 지역변수값이 우선임

void show1(void);
void show2(void);
//전역변수 (실행시 한번만 초기화하고 초깃값이 주어지지 않으면 0으로 자동 초기화)
int x;                              

int main(void)
{
// main()에서 x:0
std::cout << "main()에서 x:" << x << std::endl;
// show1()에서 x:1
show1();
// show1()호출 후 x:1
std::cout << "show1()호출 후 x:" << x << std::endl;
//show2()에서 x:10
show2();
//show2()호출 후 x:1
std::cout << "show2()호출 후 x:" << x << std::endl;
//show2()에서 x:10
show2();
return 0;
}

void show1(void)
{
    std::cout << "show1()에서 x: " << ++x <<  std::endl;
}
v
void show2(void)
{
    int x =10;                      //지역변수
    std::cout << "show2()에서 x:" << x << std::endl;
}
profile
Hakuna Matata

0개의 댓글

관련 채용 정보