C++

C++ 프로그래밍 10주차 정리

mJay8194 2022. 12. 22. 09:50

1. const 변수 예제

상수, const 변수는 값을 변경할 수 없다

 

#define IN 1      // 컴파일 전에 IN을 찾아서 1로 바꿈

#include <iostream>

int main()

{

             const int x = 2;  // 변수 x는 항상 1, 변경 불가, 초기값 지정 필수

             const int  z{ 4 };  // Uniform initialization, C++11, z{

             constexpr int a = 5; //C++11부터 가능, compile-time constant

           

             std::cout << IN << x << y << z << a;

             return 0;

}

 

2. 함수에 사용하는 const

함수 선언 시 함수, 매개변수, 리턴형에 const를 선언하여 이들이 읽기 전용임을 나타낸다

void func(const int);//매개변수가 const 변수

const double func(int);//리턴값이 const 변수, reference 리턴 시

void func(void) const;//함수가 const 속성, 멤버변수를 변경하지 않음

 

3. const 형 멤버함수

-const형 멤버함수는 const 함수만 호출 가능

-멤버변수의 값을 변경할 수 없다

-함수의 역할이 제한되기 때문에 소스의 분석에 용이

#include <iostream>

 

class Dog {

             int age;

public:

             int getAge() const;

             void setAge(int a) { age = a; }

             void view() const { std::cout << "나는 view"; }

};

int Dog::getAge() const

{

             view();             

             return age;

}

 

int main()

{

             Dog happy;

             happy.setAge(5);

             std::cout << happy.getAge();

             return 0;

}

 

4. 포인터 변수

-변수의 이름 앞에 *을 붙이면 포인터 변수가 되며, 주소 값만 저장할 수 있다

-포인터 변수 앞에 *을 붙이고 출력해보면 그 주소에 저장된 값이 나온다

-포인터 변수의 자료형은 자신의 자료형이 아닌 자신이 지시하는 곳의 자료형을 나타낸다

 

#include <iostream>

int  main() {

        int x = 10;

        int *px = &x;//포인터 변수 px에 x의 주소값 저장

        std::cout << x<<"\n" << px<< "\n"<<*px;

       

        return 0;

}

 

 

5. 포인터 연산

포인터를 1 증가시킨다는 것은 주소값을 1바이트 증가시키는 것이 아니라,

포인터가 지시하는 데이터형(char: 1바이트, int: 4바이트, double: 8바이트)만큼 증가시킨다

 

#include <iostream>

int main(void)

{

    char c;

    int i;

    double d;

    char* pc = &c;

    int* pi = &i;

    double* pd = &d;

 

    std::cout << (void*)pc << " " << (void*)(pc + 1) << std::endl;//주소값이 1 증가

    std::cout << pi << " " << pi + 1 << std::endl;//주소값이 4 증가

    std::cout << pd << " " << pd + 1 << std::endl;//주소값이 8 증가

 

    return 0;

}

 

6. 배열과 포인터

배열의 이름은 그 배열의 시작 주소이다,

따라서 int x[]라는 배열이 있을 때, x==&x[0]이므로, *x==x[0]이 된다.

또한 x[i]==*(x+i)이므로, 교환법칙에 의해 x[i]==*(i+x)가 성립하고,

최종적으로 i[x]==*(i+x)==x[i]가 성립한다.

 

#include <iostream>

int main(void)

{

        int x[5] = { 10,20,30,40,50 };

        for (int i = 0; i < 5; i++) {

               std::cout << *(x + i) << "  " << x[i] << std::endl;

               std::cout << *(i + x) << "  " << i[x] << std::endl;//x[i]==i[x]

        }      

}

 

7. 동적 메모리의 특징

-프로그램 종료 시까지 값 유지

-프로그램 실행 시 메모리 용량 결정 가능

-유동적인 크기 할당

-스택(stack) 방식보다 느린 속도

 

8. 동적 메모리의 할당과 해제

-할당

자료형 *포인터변수 = new 자료형;

자료형 *포인터변수 = new 자료형(초기값);//초기값 할당 시

자료형 *포인터변수 = new 배열명[length];

ex)int *px = new int;

-해제

delete 포인터변수;//해제

delete []포인터변수;//배열 해제

ex)delete px;

 

9. 동적 메모리 할당을 이용한 배열 생성

#include <iostream>

#include <stdlib.h> 

int main()

{

    int i, n;

    int* num;

    std::cout << "몇 개의 숫자를 입력하시겠습니까==";

    std::cin >> i;

 

    num = new int[i];//입력받은 숫자만큼 배열 크기 지정

    if (num == NULL) exit(1); //입력받은 숫자가 null일 경우 프로그램 종료

    for (n = 0; n < i; n++)

    {

        std::cout << "숫자를 입력하십시오 : ";

        std::cin >> num[n];//입력받은 숫자를 배열에 저장

    }

    std::cout << "당신이 입력한 숫자는: ";

    for (n = 0; n < i; n++)

        std::cout << num[n] << ", ";

    delete[] num;//[]을 생략하면? 해제하지 않으면 메모리 누수(leak)가 발생하여 다른 프로그램에서도 해당 메모리는 사용하지 못한다.

 

    return 0;

} 

 

10. 배열 객체 동적 할당

#include <iostream>

 

class Dog {

private:

        int age;

public:

        int getAge();

        void setAge(int a);

};

int Dog::getAge()

{

        return age;

}

void Dog::setAge(int a)

{

        age = a;

}

int main()

{

        Dog* dp = new Dog[10];     // 객체배열 할당

        if (!dp) {

               std::cout << "메모리할당이 되지 않았습니다.";

               return 1;

        }

        for (int i = 0; i < 10; i++)   // C++에서는 가능

               dp[i].setAge(i);

        for (int i = 0; i < 10; i++)

               std::cout << i << "번째 객체의 나이는 " <<

               dp[i].getAge() << " 입니다. " << std::endl;

 

        delete[]dp;

        return 0;

}

 

 

 

9. 동적 메모리 할당을 이용한 배열 생성

#include <iostream>

#include <stdlib.h> //exit(1)

int main()

{

    int i, n;

    int* num;

    std::cout << "몇 개의 숫자를 입력하시겠습니까==";

    std::cin >> i;

 

    num = new int[i];

    if (num == NULL) exit(1); //종료

    for (n = 0; n < i; n++)

    {

        std::cout << "숫자를 입력하십시오 : ";

        std::cin >> num[n];

    }

    std::cout << "당신이 입력한 숫자는: ";

    for (n = 0; n < i; n++)

        std::cout << num[n] << ", ";

    delete[] num;  //[]을 생략하면? 해제하지 않으면 메모리 누수(leak)가 발생하여 다른 프로그램에서도 해당 메모리는 사용하지 못한다.

 

    return 0;

 

 

 

10. 배열 객체 동적 할당

#include <iostream>

 

class Dog {

private:

        int age;

public:

        int getAge();

        void setAge(int a);

};

int Dog::getAge()

{

        return age;

}

void Dog::setAge(int a)

{

        age = a;

}

int main()

{

        Dog* dp;

        dp = new Dog[10];     // 객체배열 할당

         // Dog *dp=new Dog[10];

        if (!dp) {

               std::cout << "메모리할당이 되지 않았습니다.";

               return 1;

        }

        for (int i = 0; i < 10; i++)   // C++에서는 가능

               dp[i].setAge(i);

        for (int i = 0; i < 10; i++)

               std::cout << i << "번째 객체의 나이는 " <<

               dp[i].getAge() << " 입니다. " << std::endl;

 

        delete[]dp;

        return 0;

}

 

출처 : https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA/playlists, C++ 프로그래밍 강의 - 한성현 교수님