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 |