#include <iostream> //전처리 지시자
#include <climits> //드래그 후 f12누르면 함수 설명되어 있음. 최대값 정의를 위한 라이브러리
#include <cstring> //strlen() 함수 이용
#define SIZE 20
/*
c++에서 함수를 사용하고자 한다면..?
반드시 그 함수의 원형을 미리 정의하여야 한다.
c++ .h 파일을 안쓰게 됨
*/
void swapA(int&, int&);
void swapB(int*, int*);
void swapC(int, int);
using namespace std;
// std::cout << ""<< std::endl;
// std 생략하게 함
int main() {
//cout 문자열 출력, endl은 줄 바꿈
// << 꺽세는 데이터의 방향을 나타냄
cout << "Hello, World!" << endl;
// short, int, long, long long
// short -32768 ~ 0 32767
// unsigned short 0 65534
short maxshort = SHRT_MAX;
int maxint = INT_MAX;
// 큰 문자형은 "" 사용할 수 없음.
//null문자 때문이다. 어디까지 문자의 끝인지 확인하기 위해서
// '\0' 이것이 끝인 의미
// '\0' 만날 때까지 탐색
// ""은 명시적으로 null 문자 표현 -> string
char a[5] = {'H', 'E', 'L', 'L', '\O'};
char b[] = "hell";
cout << a << endl;
//char형 bool형 float형
cout << maxint << endl;
const float PIE = 3.1415926535;
//const 상수 선언, #defien PIE 3.141582
//const는 값 변경 불가
//(int) 형 변환
//static_cast<typeName>() only c++ 타입 캐스팅
//static_cast<int>(ch)
// >> 두 개의 피연산자가 모두 정수이면 결과값은 몫이다.
// auto n = 100 자동으로 추론해서 int로 타입 선언됨
// 근데 잘안씀
// 입력
int input;
//cin은 입력 받는 >> 변수에 저장
cin >> input;
char input2[15];
//cin 입력을 하는 중에 space 나 엔터를 만나면 문자열이 끝났다고 인식
// 공백을 포함하여 문자를 받는 법
cin.getline(input2, 15); //cin.getline(변수, size크기) char형만 가능
//c++에서 문자열을 다루는 방법
//string 에서는 배열을 다른 배열에 통째로 대입할 수 있다.
char char1[20];
char char2[20] = "jauar";
string str1;
string str2 = "panda";
//char1 = char2; 틀리다
str1 = str2;
cout << str1[0] << endl;
typedef struct major{
int name;
int number;
float score;
}TEST;
TEST major2;
cout << major2.name << endl;
struct major major3;
cout << major3.name << endl;
major major4;
major4.name;
//c++ : 객체지향 프로그래밍
//컴파일 시간이 아닌 실행시간에 어떠한 결정을 내릴 수 있다.
//동적 할당 의미
//new 연산자 동적
/*
* 어떤 데이터형을 원하는지 new 연산자에 알려주면,
* new연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고
* 그 불록의 주소를 찾아낸다
*/
//데이터 객체를 지정하고 있다.
int* pointer = new int; // 4바이트를 저장할 수 있는 메모리 블록을 찾아 반환함
//delete 연산자
/*
사용한 메모리를 다시 메모리 풀로 환수
환수된 메모리는 프로그램의 다른 부분이 다시 사용
*/
int* p2s = new int;
delete p2s;
/*
delete를 사용하는 4자기 규칙
1. new로 대입하지 않은 메모리는 delete로 헤제할 수 없다.
2. 같은 메모리 블록을 연달아 두번 delete로 헤제할 수 없다.
3. new[]로 메모리를 대입할 경우 delete[]로 해제한다.
4. 대괄호를 사용하지 않았다면 delete도 대괄호를 사용하지 않아야한다.*/
double* p3 = new double[3]; // double 형 데이터 3개를 저장할 수 있는 공간을 대입
p3[0] = 0.2;
p3[1] = 0.5;
p3[2] = 0.8;
cout << "p3[1] is" << p3[1] << ".\n";
p3 = p3 + 1; //포인트 주소 1만큼 다음 인덱스로 이동 4바이트 이동 내부적으로는
cout << "Now p3[0] is " << p3[0] << "and ";
delete[] p3;
char animal[SIZE];
char* ps;
cout << "동물 이름을 입력하십시오.\n";
cin >> animal;
ps = new char[strlen(animal) + 1];
strcpy(ps, animal);
cout << "입력하신 동물 이름을 복사하였습니다." << endl;
cout << "입력하신 동물 이름은 " << animal << "이고, 그 주소는 " << (int*)animal << " 입니다." << endl;
cout << "복사된 동물 이름은 " << ps << "이고, 그 주소는 " << (int*)ps << " 입니다." << endl;
//함수를 지시하는 포인터가 함수 포인터
// 어떠한 함수에 함수의 주소를 매개변수로 넘겨주는 경우 유용하게 사용할 수 있따.
int (*pf)(int);
//pf =func;
//(*pf)(3)
//인라인 함수
/*
일반적으로 함수의 호출은 함수의 주소로 점프하는 과정
인라인 함수는 컴파일된 함수 코드가 프로그램의 다른 코드에 삽입
컴파일러의 인라인 함수 호출 = 점프가 아닌 그에 대응하는 함수 코드로 대체*/
//함수의 원형 부분 앞에 inline float square(float x) {return x *x } 람다식 같네
//디폴트 매개 변수
// 함수의 원형 부분에서 정의
/*
int sumArr(int *, int n = 1) 이렇게 하면 n 값이 없으면 n = 1이 들어감
int sum = sumArr(arr) n=1이 들어가서 작동 함
버그 예방 유리 인자 위치는 가장 오른쪽에 선언/
*/
//참조(reference)란?
// 미리 정의된 변수의 실제 이름 대신 사용할 수 있는 대용 이름
// 함수의 매개변수에 사용
// 즉 복사본이 아닌 원본 데이터를 제공
//참조 연산자 선언
//int a;
// int& b = a;
int wallet1 = 100;
int wallet2 = 200;
cout << "최초 상태" << endl;
cout << "wallet1 = " << wallet1 << ", wallet2 = " << wallet2 << endl;
cout << "참조를 이용한 값의 교환\n";
swapA(&wallet1, &wallet2);
cout << "참조 교환 이후 상태\n";
cout << "wallet1 = " << wallet1 << ", wallet2 = " << wallet2 << endl;
cout << "포인터를 이용한 값의 교환\n";
swapB(&wallet1, &wallet2);
cout << "포인터를 이용한 교환 이후 상태\n";
cout << "wallet1 = " << wallet1 << ", wallet2 = " << wallet2 << endl;
cout << "값을 이용한 값의 교환\n";
swapC(&wallet1, &wallet2);
cout << "값을 이용한 교환 이후 상태\n";
cout << "wallet1 = " << wallet1 << ", wallet2 = " << wallet2 << endl;
return 0;
//함수 템플릿
//구체적인 데이터형을 포괄할 수 있는 일반형으로 함수를 정의
//함수 원형 부분에
/*
template<class Any>
Any sum(Any a, Any b, int c) {
return a + b;
}
*/
// #ifndef STRUCT
// #endif
//STRUCT라고 묶여있는 다른 헤더파일에 구문들이 정의되어 있다면 묶여있는 것들 무시 후 컴파일
// 연산자 오버로딩
//클래스 파괴자 ~
// C++ friend
// << 오버로딩 두 개의 피연산자 필요해서 프렌드 필요
// 동적 결합
}
void swapA(int& a, int& b) {
int temp;
temp = a;
a = b;
b = temp;
}
void swapB(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void swapC(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
'Computer Science > 자료구조' 카테고리의 다른 글
테스트 (0) | 2023.03.08 |
---|---|
[CS50] 2진법 (0) | 2023.02.08 |