이 내용의 모든 ppt는 Smail.han의 ppt를 인용한 것입니다.
New라는 연산자에 대해 물었을때의 답이다.



const char*를 std::string으로 일괄 변경을 진행 했다.

변수를 상수화하는 법

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

const 멤버에서는 멤버변수를 변경하는 치환연산이 불가능하고, const로 지정된 함수에서는 멤버변수의 값을 변경할 수 없다. 즉 get으로 시작하는 읽기전용 함수가 된다.


포인터변수의 자료형을 비유한다면 집주소에 int형으로 저장하고 옆 창고에 int,char형 데이터를 저장하는것
포인터 자체는 *을 달면 언제든 경찰처럼 집에 들이닥칠 수 있는 압수수색영장같은 것
#include <iostream>
int main()
{
int x=1;
std::cout << x << " " << &x;
return 0;
}

위 소스의 결과값이고, 이 결과는 매번 달라진다.


32bit 와 64bit의 차이다.
#include <iostream>
int main()
{
int x=1;
int *px = &x; //x의 주소는 포인터 변수로 선언하기 위해 *를 써야한다.
std::cout << x << " " << &x;
return 0;
}

포인터 변수는 x의 주소를 가지고 있어 *만 붙인다면 언제든 찾아가서 값을 가져올 수 있다.



동적 메모리를 사용하는 이유는 프로그램이 끝날 때까지 값을 유지하고싶은 경우거나 프로그램을 실행 할 때 메모리의 양을 결정해야하는 경우다.

메모리를 할당할 때 new를 사용
할당된 메모리를 해제할 때 delete를 사용

동적메모리 할당을 보여주는 좋은 예시가 된다.

배열을 삭제하기위해 delete를 쓸 때는 대괄호를 넣어 삭제해주는것이 좋다.
배열의 이름은 배열의 시작주소 ★★★ (시험에 나오는 중요한 부분)
#include <iostream>
class Dog {
private:
int age;
public:
int getAge() const;
void setAge(int a);
};
int Dog::getAge() const { return age; }
void Dog::setAge(int a) { age = a; }
int main()
{
Dog* dp;
dp = new Dog; // Dog *dp=new Dog
if (!dp) {
std::cout << "메모리할당 불가!";
return 1;
}
dp->setAge(5);
std::cout << "메모리에 할당된 값은 "
<< dp->getAge() << "입니다.";
delete dp;
return 0;
}
getAge부분에 const를 써 고정시킬 수 있다.
#include <iostream>
class Dog {
private:
int age;
public:
int getAge() const;
void setAge(int a);
};
int Dog::getAge() const { 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;
}
배열객체 동적 할당을 보여준 코드다.


이런 식으로 표시가 되고 마지막에는 delete []dp가 된다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using std::cout;
class Cat {
private: //생략가능
int age;
std::string name;
public:
Cat(int age, std::string n) {
this->age = age;
name = n;
cout << name << "고양이 객체가 만들어졌어요.\n";
}
~Cat() { cout << name << "객체 바이\n"; };
int getAge() const;
std::string getName() const;
void setAge(int age);
void setName(std::string pName);
void meow() const;
};
int Cat::getAge() const { return age; }
void Cat::setAge(int age) { this->age = age; }
void Cat::setName(std::string pName) { name = pName; }
std::string Cat::getName() const { return name; }
void Cat::meow() const { cout << name << "고양이가 울어요\n"; }
int main() {
Cat nabi(1, "나비"), yaong(1, "야옹"), * pNabi;
cout << nabi.getName() << " 출생 나이는 " << nabi.getAge() << "살이다.\n";
cout << yaong.getName() << " 출생 나이는 " << yaong.getAge() << "살이다.\n";
pNabi = &nabi;
cout << pNabi->getName() << " 출생 나이는 " << pNabi->getAge() << "살이다.\n";
nabi.setName("Nabi");
nabi.setAge(3);
cout << nabi.getName() << " 나이는 " << nabi.getAge() << "살이다.\n";
yaong.meow();
nabi.meow();
return 0;
}
배열객체 동적 할당을 했다. 아래는 결과값.
