▷ using을 이용한 이름공간의 명시
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
//이후부터 cin, cout, endl은 std::cin, std::cout, std::endl을 의미하는 선언
//using namespace std;
int main(void)
{
int num = 20;
cout<<"Hello World"<<endl;
cout<<"Hello "<<"World!"<<endl;
cout<<num<<' '<<'A';
cout<<' '<<3.14<<endl;
return 0;
}
▷ 이름 공간의 별칭 지정 전역변수의 접근
#include <iostream>
namespace AAA
{
namespace BBB
{
namespace CCC{
int num1;
int num2;
}
}
}
namespace ABC=AAA::BBB::CCC;
int val = 100;
int SimpleFunc(void)
{
int val=20;
val+=3;
::val+=7;//전역 변수 val의 값 증가
return val;
}
int main(void)
{
ABC::num1=10;
ABC::num2=20;
std::cout<<ABC::num1<<" "<<ABC::num2<<std::endl;
std::cout<<SimpleFunc()<<" "<<val<<std::endl;
}
ch02 c언어 기반의 c++ 2
02-1
▷ c언어에서 const의 의미
const int num = 10; //변수 num 상수화
const int * ptr1 = &val1; //포인터 ptr1을 이용해 val1의 값 변경 불가
int * const ptr2 = &val2; //포인터 ptr2가 상수화
const int * const ptr3 = &val3; //포인터 ptr3가 상수화, ptr3 이용해 val3의 값 변경 불가
02-2 새로운 자료형 bool
▷ true, false
int num1 = true; //1
int num2 = false; //0
int num3 = true+false; //1+0
sizeof(true) //1
▷ 자료형 bool
//true와 false => bool형 데이터
//true와 false 정보를 저장할 수 있는 변수는 bool형 변수
#include <iostream>
using namespace std;
bool IsPositive(int num)
{
if(num<0)
return false;
else
return true;
}
int main(void)
{
bool isPos;
int num;
cout<<"Input number: ";
cin>>num;
isPos=IsPositive(num);
if(isPos)
cout<<"Positive numer"<<endl;
else
cout<<"Negative number"<<endl;
return 0;
}
02-3 참조자의 이해
int num = 2024;
int &num2 = num1;
참조자의 선언으로 num1의 메모리 공간에 num2라는 이름이 추가로 붙게 됨
참조자==기존에 선언된 변수에 붙이는 별칭
▷ 참조자 예제, 참조자 선언
#include <iostream>
using namespace std;
int main(void)
{
int num1 = 1020;
int &num2 = num1; //num2는 num1의 참조자
//num1으로 하는 모든 연산은 num2로 하는 것과 동일한 결과
num2 = 3047;
cout<<"VAL: "<<num1<<endl;
cout<<"REF: "<<num2<<endl;
cout<<"VAL: "<<&num1<<endl;
cout<<"REF: "<<&num2<<endl;
return 0;
}
참조자의 수 제한 X
▷ 참조자의 선언 가능 범위
int &ref = 20; //상수 대상으로 참조자 선언 불가능
int &ref; //생성과 동시에 누군가를 참조해야 함
int &ref=NULL; //포인터처럼 NULL 초기화도 불가능
#include <iostream>
using namespace std;
int main(void)
{
int arr[3] = {1,3,5};
int &ref1 = arr[0]; //배열의 요소는 변수의 성향 지니기 때문에 참조자 선언 가능
int &ref2 = arr[1];
int &ref3 = arr[2];
cout<<ref1<<endl;
cout<<ref2<<endl;
cout<<ref3<<endl;
return 0;
}
▷ 포인터 변수 대상의 참조자 선언
#include <iostream>
using namespace std;
int main(void)
{
int num=12;
int *ptr=#
int **dptr = &ptr;
int &ref=num;
int *(&pref)=ptr;
int **(&dpref)=dptr;
cout<<ref<<endl;
cout<<*pref<<endl;
cout<<**dpref<<endl;
return 0;
}
02-4 참조자와 함수
▷ 참조자를 이용한 call-by-value
#include <iostream>
using namespace std;
void SwapByRef2(int &ref1,int &ref2)
{
int temp=ref1;
ref1=ref2;
ref2=temp;
} //Call-by-reference
int main(void)
{
int val1=10;
int val2=20;
SwapByRef2(val1,val2);
cout<<"val1: "<<val1<<endl;
cout<<"val2: "<<val2<<endl;
return 0;
}
▷ const 참조자
void HappyFunc(const int &ref){...} // 함수 내에서 ref를 이용한 값의 변경 허용 X
▷ 반환형이 참조이고 반환도 참조로 받는 경우
#include <iostream>
int& RefRetFuncOne(int &ref)
{
ref++;
return ref;
}
int main(void){
int num1 = 1;
int &num2 = RefRetFuncOne(num1);
num1++;
std::cout<<"num1: "<<num1<<std::endl;
std::cout<<"num2: "<<num2<<std::endl;
return 0;
}
▷ 반환형이 참조이되 반환은 변수로 받는 경우
#include <iostream>
int& RefRetFuncOne(int &ref)
{
ref++;
return ref;
}
int main(void){
int num1 = 1;
int num2 = RefRetFuncOne(num1);
num1++;
num2+=100;
std::cout<<"num1: "<<num1<<std::endl;
std::cout<<"num2: "<<num2<<std::endl;
return 0;
}
▷ 참조를 대상으로 값을 반환하는 경우
int num2 = RefRetFuncOne(num1);
int &num2 = RefRetFuncOne(num1);
반환형이 참조형인 경우 → 반환되는 대상을 참조자 또는 변수로 받을 수 있음
반환형이 값의 형태 → 참조자로 그 값을 받을 수 없음
▷ 잘못된 참조의 반환
int& RetuRefFunc(int n)
{
int num=20;
num+=n;
return num;
}
int &ref = RetuRefFunc(10);//error의 원인, ref가 참조하는 대상이 소멸
▷ const 참조자의 또 다른 특징
const int num = 20;
int &ref=num; //error의 원인, 이를 허용한다는 것은 ref를 통한 값의 변경 허용한다는 뜻, const로 선언하는 이유가 ...
ref+=10;
cout<<num<<endl;
↓
const int num=20;
const int &ref=num;
const int &ref=50;
//const 사용을 빈번히 하는 것은 좋음
▷ 어떻게 참조자가 상수를 참조?
const int &ref=30;
상수를 메모리에 임시적으로 저장하기 때문에 행을 바꿔도 소멸하지 않음
int Adder(const int& num1, const int& num2)
{
return num1+num2;
}
매개변수 형이 참조자인 경우에 상수를 전달할 수 있도록 하기 위함임
02-5 malloc&free 를 대신하는 new&delete
▷ new&delete
int * ptr1 = new int;
double * ptr2 = new double;
int * arr1 = ne wint[3];
double * arr2 = new double[7];
malloc 대신 메모리의 동적 할당 방법임. 크기를 바이트 단위로 계산하는 일을 거치지 않아도 됨.
delete ptr1;
delete ptr2;
delete []arr1;
delete []arr2;
free를 대신하는 메모리의 해제 방법
▷ 포인터를 사용하지 않고 힙에 접근하기
int *ptr = new int;
int &ref=*ptr; //힙 영역에 할당된 변수에 대한 참조자 선언
ref=20;
cout<<*ptr<<endl; //20
변수의 성향을 지니는(값 변경 가능) 대상에 대해 참조자의 선언이 가능
02-6 c++에서 c언어의 표준 함수 호출하기
▷ c++ 표준헤더: c를 더하고 .h 빼기
#include <stdio.h> -> #include <cstdio>
#include <stdlib.h> -> #include <cstdlib>
#include <math.h> -> #include <cmath>
#include <string.h> -> #include <cstring>
ch03 클래스의 기본
03-1 c++에서의 구조체
구조체 - 연관 있는 데이터를 하나로 묶는 문법적 장치
▷ c++에서의 구조체 변수 선언
struct Car
{
char gamerID[ID_LEN];
int fuelGauge;
int curSpeed;
};
void ShowCarState(const Car &car){...}
void Accel(Car &car){...}
void Break(Car &car){...}
c++에서는 구조체 변수 선언시 struct 키워드의 생략을 위한 typedef 선언 불필요
▷ 구조체 안에 함수 삽입하기
struct Car
{
char gamerID[ID_LEN];
int fuelGauge;
int curSpeed;
void ShowCarState(const Car &car)
{
cout<<gamerID<<endl;
cout<<fuelGauge<<"%"<<endl;
cout<<curSpeed<<"km/s"<<endl<<endl;
}
void Accel(Car &car){...}
void Break(Car &car)
{
if(curSpeed<BRK_STEP)
{
curSpeed=0;
return;
}
curSpeed -= BRK_STEP;
}
};
c++에서는 구조체 안에 함수를 삽입하는 것이 가능. 따라서 c++에서는 구조체가 아닌 클래스라고 한다.
▷ c++에서의 구조체 변수 선언
Car run99 = {"run99",100,0};
Car Sped77={"sped77",100,0};
▷ 구조체 안에 enum 상수의 선언
struct Car
{
enum
{
ID_LEN=20;
MAX_SPD=200;
FUEL_STEP=2;
ACC_STEP=10;
BRK_STEP=10;
};
char gamerID[ID_LEN];
int fuelGauge;
int curSpeed;
void ShowCarState(const Car &car){...}
void Accel(Car &car){...}
void Break(Car &car){...}
};
구조체 안에 enum 선언을 함으로써 잘못된 외부의 접근 제한
▷ 함수는 외부로 뺄 수 있음
struct Car
{
...
void ShowCarState(); //구조체 안에 삽입된 함수의 선언
void Accel();
...
};
void Car::ShowCatState() // 구조체 밖에 선언된 함수의 정의
{
...
}
void Car::Accel()
{
...
}
03-2 클래스와 객체
▷ 클래스와 구조체의 유일한 차이점
class Car{...}
struct 대신해 class 사용한 것이 유일한 외형적 차이점
int main(void)
{
Car run99;
strcpy(run99.gamerID,"run99");
run99.fuelGauge=100;
run99.curSpeed=0;
....
}
위와 같이 단순히 키워드만 class로 바꾸면 선언된 멤버에 접근 불가능.
별도의 접근 제어와 관련된 선언 추가해야 함.
▷ 접근제어 지시자
public 어디서든 접근 허용
protected 상속 관계에 놓였을 때, 유도 클래스에서의 접근 허용
private 클래스 내에서만 접근 허용
class Car
{
private:
char gamerID[CAR_CONST::ID_LEN];
int fuelGauge;
int curSpeed;
public:
void InitMembers(char*ID,int fuel);
void ShowCarState();
void Accel();
void Break();
};
int main(void)
{
Car run99
run99.InitMembers("run99",100);
run99.Accel();
run99.Accel();
run99.Accel();
run99.ShowCarState();
return 0;
}
'2024하계모각코' 카테고리의 다른 글
모각코 4회차 결과 (5) | 2024.07.24 |
---|---|
모각코 4회차 목표 (0) | 2024.07.24 |
모각코 3회차 목표 (0) | 2024.07.15 |
모각코 2회차 결과 (0) | 2024.07.08 |
모각코 2회차 목표 (0) | 2024.07.08 |