const 명령어 용도(1)
아래 case(1)과 (2)의 차이점을 설명하시오.
case(1)
int n=10; const int* pN=&n; |
case(2)
int n=10; int* const pN=&n; |
case(1)은 'n'을 상수화함. case(2)는 'pN'을 상수화함.
예제(1)
const변수의 사용; 개선 전
#include<iostream> #include<cstring> using std::cout; using std::endl;
class student { const int id; int age; char name[20]; char major[30]; public: student(int _id, int _age, char* _name, char* _major) { id=_id; age=_age; strcpy(name, _name); strcpy(major, _major); } void ShowData() { cout<<"이름: "<<name<<endl; cout<<"나이: "<<age<<endl; cout<<"학번: "<<id<<endl; cout<<"학과: "<<major<<endl; } };
int main() { student Kim(200577065, 20, "Kim Gil Dong", "Computer Eng."); student Hong(200512065, 19, "Hong Gil Dong", "Electronics Eng."); Kim.ShowData(); cout<<endl; Hong.ShowData(); return 0; } |
맴버 변수의 상수화; 멤버 이니셜 라이져
#include<iostream> #include<cstring> using namespace std; class student { const int id; int age; char name[20]; char major[30]; public: student(int _id, int _age, char* _name, char* _major):id(_id) { // id=_id; age=_age; strcpy(name, _name); strcpy(major, _major); } void ShowData() { cout<<"이름: "<<name<<endl; cout<<"나이: "<<age<<endl; cout<<"학번: "<<id<<endl; cout<<"학과: "<<major<<endl; } }; int main() { student Kim(200577065, 20, "Kim Gil Dong", "Computer Eng."); student Hong(200512065, 19, "Hong Gil Dong", "Electronics Eng."); Kim.ShowData(); cout<<endl; Hong.ShowData(); return 0; } |
const 명령어 용도(2)
아래와 같이 함수를 선언하면 getArea() 함수는 const 멤버함수가 되며 다른 멤버의 값을 변경할 수 없게 됩니다. 즉, 클래스의 멤버함수가 멤버의 값을 사용하기만 하고 변경하지 못하게 할 때 const 멤버함수로 선언할 필요가 있습니다.
예제#include<iostream> #include<cstring> using std::cout; using std::endl; class Student { const int id; int age; char name[20]; char major[30]; public: Student(int _id, int _age, char* _name, char* _major):id(_id), age(_age) { strcpy(name, _name); strcpy(major, _major); } void ShowData() const//읽기 전용 선언 및 잘못된 코딩을 감지 { age=20; //잘못된 코딩 cout<<"이름: "<<name<<endl; cout<<"나이: "<<age<<endl; cout<<"학번: "<<id<<endl; cout<<"학과: "<<major<<endl; } };
int main() { Student Kim(200577065, 20, "Kim Gil Dong", "Computer Eng."); Student Hong(200512065, 19, "Hong Gil Dong", "Electonics Eng."); Kim.ShowData(); cout<<endl; Hong.ShowData(); return 0; } |
예제
#include<iostream> #include<cstring> using std::cout; using std::endl; class Count { int cnt; public : Count():cnt(0){} const int* GetPtr() const { return &cnt; } void increment() { cnt++; } void ShowData() const { ShowIntro(); cout<<cnt<<endl; } void ShowIntro() const { cout<<"현재 count의 값 : "<<endl; } }; int main() { Count count; count.increment(); count.ShowData(); } |
#include<iostream> #include<cstring> using std::cout; using std::endl; class Count { int cnt; //cnt를 정수로 정의한다. public : Count():cnt(0){} //cnt값= 0;. const int* GetPtr() const //GetPtr { return &cnt; } void increment() //increment 함수를 정의함. { cnt++; } void ShowData() const //ShowData 함수를 정의함. { ShowIntro(); //compile 에러가 발생할 수 있음. cout<<cnt<<endl; } void ShowIntro() const //ShowIntro 함수를 정의한다. { cout<<"현재 count의 값 : "<<endl; } };
int main() { Count count; count.ShowData(); count.increment(); count.ShowData(); } |
#include<iostream> using std::cout; using std::endl;
class AAA //AAA 클래스 정의 { int num; public : AAA(int _num):num(_num) {} //num을 _num으로 변경 void Add(int n) //num을 조작하는 함수, compile 에러가 예상됨 { num+=n; } void ShowData() { cout<<num<<endl; //num을 출력함 } }; int main() { const AAA aaa(10); aaa.Add(10); //compile 에러 aaa.ShowData(); //compile 에러 return 0; } |
위 코드에서 aaa.Add(10)과 ShowData()에서 compile에러가 발생하는 원인은 무엇인가?
#include<iostream> using std::cout; using std::endl;
class AAA //AAA 클래스 정의 { int num; public : AAA(int _num):num(_num) {} //num을 _num으로 변경 void Add(int n) //num을 조작하는 함수, compile 에러가 예상됨 { num+=n; } void ShowData() const { cout<<num<<endl; //num을 출력함 } }; int main() { const AAA aaa(10); // aaa.Add(10); //compile 에러 aaa.ShowData(); //compile 에러 return 0; } |
const 함수는 cosnt 함수 이외의 함수는 호출이 불가능하다.
#include<iostream> #include<cstring> using std::cout; using std::endl; class AAA { int num; public : AAA(int _num) : num(_num) { } void ShowData() { cout<<"void ShowData() 호출"<<endl; cout<<num<<endl; } void ShowData() const { cout<<"void ShowData() const 호출"<<endl; cout<<num<<endl; } }; int main() { const AAA aaa1(20); AAA aaa2(70); aaa1.ShowData(); aaa2.ShowData(); return 0; } |
위 코드를 통해서 오버로딩 되는 원리를 파악하라.