본문 바로가기
C++

C++프로그래밍 10주차

by asd135 2023. 11. 8.
728x90
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using std::cout;
class Cat {
private: //생략가능
	int age;
	char name[20];
	// const char* name; //A
public:
	Cat(int age, const char* n) {
		this->age = age;
		strcpy(name, n); // name=n; //A
		cout << name << "고양이 객체가 만들어졌어요.\n";
	}
	~Cat() { cout << name << "객체 바이\n"; };
	int getAge();
	const char* getName();
	void setAge(int age);
	void setName(const char* pName);
	void meow();
};
int Cat::getAge() {
	return age;
}
void Cat::setAge(int age) {
	this->age = age;
}
void Cat::setName(const char* pName) {
	strcpy(name, pName);
	//strcpy(대상주소, 원본주소);
	//strcpy_s(대상주소, 대상의길이, 원본주소);
	//name=pName; //A
}
const char* Cat::getName() {
	return name;
}
void Cat::meow() {
	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;
}

 

배열대신 std::string 사용

#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();
	std::string getName();
	void setAge(int age);
	void setName(std::string pName);
	void meow();
};
int Cat::getAge() {
	return age;
}
void Cat::setAge(int age) {
	this->age = age;
}
void Cat::setName(std::string pName) {
	name = pName;
}
std::string Cat::getName() {
	return name;
}
void Cat::meow() {
	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;
}

 

실행결과

객체의 소멸은 늦게 만들어진 순으로 소멸

 


변수 앞에 const를 쓰면 초기값 변경 불가

#define IN 1 // 컴파일 전에 IN을 찾아서 1로 바꿈
#include <iostream>
int main()
{
	const int x = 2; // 변수 x는 항상 1, 변경 불가, 초기값 지정해야
	int const y = 3; // 비추, const는 자료형 앞에 씀
	const int z{ 4 }; // Uniform initialization, C++11, z{}
	constexpr int a = 5; //C++11부터 가능, compile-time constant
	//x = 2; //변경 불가
	//y = 10; 
	//z = 20;
	std::cout << IN << x << y << z << a;
	return 0;
}

 

 

#include <iostream>
class Dog {
	int age; //private 생략함
public:
	int getAge() const;
	void setAge(int a) { age = a; }
	void view() const { std::cout << "나는 view"; }
};
int Dog::getAge() const
{
	view(); // const함수에서는 const함수만 호출가능 
	return age; // 멤버변수 age를 변경할 수 없다
}
int main()
{
	Dog happy;
	happy.setAge(5);
	std::cout << happy.getAge();
	return 0;
}

 

const함수에서는 const함수만 호출가능 함수가 간접적으로 변경하는 것을 방지하기 위함

const는 무조건 써야 하는 것은 아니지만 const를 써주면 가독성이 좋아진다.

 

객체 const

#include <iostream>
class Dog {
	int age;
public:
	Dog(int a) { age = a; }
	int getAge() const;
	void setAge(int a) { age = a; }
	void view() const
	{
		std::cout << "나는 view\n";
	}
};
int Dog::getAge() const
{
	view();
	return (age);
}
int main()
{
	const Dog happy(5); //const 객체
	// happy.setAge(7); // 오류
	std::cout << happy.getAge();
	return 0;
}

 

 


 

 

동적 메모리 할당을 하는 이유

1. 프로그램이 끝날 때 까지 값을 유지하고 싶은 경우

2. 프로그램을 실행할 때 메모리의 양을 결정해야 하는 이유

3. 지역 변수가 저장되는 스택이 한정되어 있어서 큰 크기는 할당이 어려움

 

#include <iostream>
int main()
{
	int* pi = new int; // 동적 메모리 할당
	int x; // 정적 메모리 할당

	if (!pi) { // pi==0, 널 포인터인지 확인
		std::cout << "메모리할당이 되지 않았습니다.";
		return 1; //비정상 종료시 리턴값
	}
	*pi = 100; //주소의 값으로 100을 할당
	x = 10;
	std::cout << "동적메모리=" << *pi << ", x=" << x;
	delete pi; // 메모리 해제
	return 0; // 정상 종료시 리턴값
}

 

C++에서 new 연산자를 사용하면 주소가 리턴돼서 참조변수를 포인터 변수로 받아야 한다.

 

 

 

delete를 사용해서 해제하지 않으면 다른 프로그램에서 할당된 메모리만큼 못쓰기 때문에 반드시 해제해 줘야 한다.

 

 

#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; //[]을 생략하면?
	return 0;
}

 

배열의 이름은 배열의 시작주소이다.

예시

int x[3] = {1, 2, 3}

x[0] == x

x[1] == x+1

x[2] == x+2

 

강의 요약

#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;
}

 

#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;
}

 

const 값을 변경할 수 없다.

배열의 이름은 배열의 시작주소이다.

 

 

이 소스는 한성현 교수님 강의자료를 활용하여 작성되었습니다,

'C++' 카테고리의 다른 글

C++프로그래밍 12주차  (2) 2023.11.22
C+프로그래밍 11주차  (0) 2023.11.15
C++ 프로그래밍 9주차  (0) 2023.11.01
C++ 프로그래밍 6주차  (1) 2023.10.18
C++ 프로그래밍 5주차  (1) 2023.10.11