Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

브래의 슬기로운 코딩 생활

C++프로그래밍 12주차 정리 본문

1-2/C++프로그래밍

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

김브래 2022. 11. 17. 17:24

오늘은 함수 중첩과 생성자 중첩 디폴트 인자에 대하여 공부 하였다.

 

일단 객체 지향 프로그래밍의 3가지 특징은

캡슐화, 상속성, 다형성이 있다.

 

오늘 배운 내용은 다형성에 관한 내용이다.

함수 중첩은 C언어에서는 안되지만 C++은 가능하다.

함수 중첩은 하나의 함수명으로 여러 개의 유사 목적으로 사용할 수 있다.

 

생성자도 여러개를 중첩 시킬 수가 있지만 소멸자는 중첩이 불가능 하다.

 

왜냐하면 함수를 중첩 하는 경우는

매개변수의 형이 다른 경우와

매개변수의 개수가 다른 경우인데

 

생성자는 매개변수의 개수를 다양하게 할 수 있지만

소멸자는 매개변수 없이 그냥 호출 되기 때문에

소멸자는 중첩 시킬 수 없다.

 

그리고 디폴트 인자는 말 그대로

호출할 때 매개변수값을 지정하지 않으면

기본값으로 들어갈 값이다.

 

디폴트 매게변수를 갖는 함수를 만들 때, 메인 함수 전에 함수 선언을 하고 뒤에 정의를 한다면

선언부에만 디폴트 인자를 표시하고 정의부에서는 디폴트 인자를 표시하지 않는다.

 

그리고 일단 디폴트 매게변수를 정의하기 시작하면 그 다음의 매개변수들도 다 디폴트 값을 정해 주어야 한다.

 

 

 

 

과제

 

#include <iostream>

 

int add(int i, int j)

{

return (i + j);

}

double add(double i, double j)

{

return (i + j);

}

//double add(int i, int j) 에러

//{

//return ((double)i + (double)j);

//}

 

int main()

{

std::cout << add(10, 20) << std::endl;

std::cout << add(10.5, 20.3) << std::endl;

return 0;

}

#include <iostream>

 

int Max(int i, int j)

{

return i > j ? i : j;

}

double Max(double i, double j)

{

return i > j ? i : j;

}

char Max(char i, char j)

{

return i > j ? i : j;

}

int main()

{

std::cout << Max(1, 2) << std::endl;

std::cout << Max(7.5, 3.6) << std::endl;

std::cout << Max('A', 'B');

return 0;

}

 

탬플릿

 

#include <iostream>

template <class T>

T Max(T i, T j)

{

return i > j ? i : j;

}

 

int main()

{

std::cout << Max(1, 2) << std::endl;

std::cout << Max(7.5, 3.6) << std::endl;

std::cout << Max('A', 'B');

return 0;

}

#include <iostream>

int add(int i, int j)

{

return (i + j);

}

float add(float i, float j)

{

return (i + j);

}

double add(double i, double j)

{

return (i + j);

}

int add(int i, int j, int k)

{

return (i + j + k);

}

int add(int i, int j, int k, int l)

{

return (i + j + k + l);

}

int main()

{

std::cout << add(1, 2) << std::endl;

std::cout << add(1.3f, 2.6f) << std::endl;

std::cout << add(6.5, 3.8) << std::endl;

std::cout << add(1, 2) << std::endl;

std::cout << add(1, 2, 3) << std::endl;

std::cout << add(1, 2, 3, 4) << std::endl;

return 0;

}

함수 중첩을 하는 두가지 경우

매개변수의 형이 다른 경우

매개변수의 개수가 다른 경우

 

 

 

생성자 중첩

 

4#include <iostream>

 

class Dog {

private:

int age;

public:

Dog() { age = 1; } // 매개변수가 없는 생성자, 자동 inline

Dog(int a) { age = a; } // 매개변수가 하나인 생성자

~Dog();

int getAge();

void setAge(int a);

};

Dog::~Dog()

{

std::cout << "소멸";

}

int Dog::getAge()

{

return age;

}

void Dog::setAge(int a)

{

age = a;

}

int main()

{

Dog happy(5), meri;

std::cout << happy.getAge() << "," << meri.getAge();

return 0;

}

 

배열

 

#include <iostream>

using std::cout;

using std::endl;

 

class Dog {

private:

int age;

public:

Dog() { age = 1; }

// 매개변수가 없는 생성자

Dog(int a) { age = a; }

// 매개변수가 하나인 생성자

~Dog();

int getAge();

void setAge(int a);

};

Dog::~Dog()

{

std::cout << "소멸\n";

}

int Dog::getAge()

{

return age;

}

void Dog::setAge(int a)

{

age = a;

}

 

int main()

{

Dog happy[5];

Dog meri[5] = { 1,2,3,4,5 };

 

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

std::cout << happy[i].getAge() <<

"," << meri[i].getAge() << std::endl;

return 0;

}

 

sscanf사용

 

#define _CRT_SECURE_NO_WARNINGS // sscanf()함수 오류 제거

#include <stdio.h> // sscanf()함수 선언

#include <iostream>

 

class Date {

int day, month, year;

public:

Date(const char* s) { sscanf(s, "%d%*c%d%*c%d", &month, &day, &year); }

Date(int m, int d, int y) { day = d; month = m; year = y; }

void print() { std::cout << year << "" << month << "" << day << "" << std::endl; }

};

 

int main()

{

Date d1("10/29/2021");

Date d2(10, 30, 2021);

d1.print();

d2.print();

return 0;

}

 

디폴트 인자

 

#include <iostream>

 

int add(int i=0, int j=0) // 형식매개변수

{

return(i + j);

}

int main()

{

std::cout << add() << ","; // 실매개변수 없음,

std::cout << add(10) << ","; // 실매개변수 한 개,

std::cout << add(10, 20); // 실매개변수 두개,

return 0;

}

 

디폴트 매개변수를 갖는 함수를 만들 때, main()함수 전에 함수 선언을 하면 선언부에만 디폴트 인자를 지정해야 한다.

int add(int i = 1, int j = 2);// 선언부에 디폴트 인자 작성

 

일단 디폴트 매개변수를 정의하기 시작하면 그 다음(오른쪽)의 매개변수들은 모두 디폴트 매개변수를 가져야 한다.

int add(int i = 1, int j);//오류

 

디폴트 인자의 사용은 함수 중첩의 축약형이다.

Dog(int a = 1) { age = a; }

// 디폴트 매개변수를 갖는 생성자

= Dog() { age = 1; }

Dog(int a) { age = a; }

함수 중첩과 디폴트 인자를 같이 사용하면 안된다

#include <iostream>

 

class Dog {

private:

int age;

public:

Dog(int a = 1);

// 디폴트 매개변수를 갖는 생성자

~Dog();

int getAge();

void setAge(int a);

};

Dog::Dog(int a) { age = a; }

Dog::~Dog()

{

std::cout << "소멸\n";

}

int Dog::getAge()

{

return age;

}

void Dog::setAge(int a)

{

age = a;

}

int main()

{

Dog meri, happy(5);

std::cout << happy.getAge() << "," <<

meri.getAge() << std::endl;

return 0;

}

#include <iostream>

 

int Gop(int i, int j, int k = 1, int l = 1)

{

return(i * j * k * l);

}

int main()

{

std::cout << Gop(1, 2) << std::endl; // 1*2*1*1

std::cout << Gop(1, 2, 3) << std::endl; // 1*2*3*1

std::cout << Gop(1, 2, 3, 4) << std::endl;// 1*2*3*4

return 0;

}

#include <iostream>

 

int Hap(int i, int j, int k = 0, int l = 0)

{

return(i + j + k + l);

}

int main()

{

std::cout << Hap(1, 2) << std::endl; // 1*2*1*1

std::cout << Hap(1, 2, 3) << std::endl; // 1*2*3*1

std::cout << Hap(1, 2, 3, 4) << std::endl;// 1*2*3*4

return 0;

}

 

1단계 소스

 

class Cat {

 

};

int main() {

 

return 0;

}

 

class Cat {

 

};

int main() {

Cat n; //인스턴스 생성

return 0;

}

 

class Cat {

private:

 

public:

 

};

int main() {

Cat n; //인스턴스 생성

return 0;

}

 

최종소스

 

#include <iostream>

using namespace std;

class Cat {

private:

int age;

string name;

public:

//Cat() { //생성자는 맴버변수를 초기화

// age = 1;

// name = "Brain";

//}

Cat(int age = 1, string name = "Brain") { //생성자 중첩, 디폴트 인자

this->age = age;

this->name = name;

}

~Cat() { cout << name << "객체 바이\n"; }//소멸자

int getAge() const {

return age;

}

void setAge(int age) {

this->age = age;

}

string getName() const {

return name;

}

void setName(string name) {

this->name = name;

}

void cry() const {

cout << "키아아아아아악~~!!" << endl;

}

};

int main() {

Cat n, b(2, "브래"); //인스턴스 생성

Cat* pc = new Cat[10];

Cat* ac = new Cat;

ac->setAge(2);

pc[0].setAge(3);

n.setAge(1);

n.setName("김브래");

n.cry();

cout << n.getAge() << endl << n.getName() << endl << b.getAge() << endl << b.getName()

<< endl << pc[0].getAge() << endl << ac->getAge() << endl;

delete ac; delete[]pc;

 

return 0;

}