C++ 프로그래밍 10주차 정리
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++ 프로그래밍 강의 - 한성현 교수님