본문 바로가기
프로그래밍 언어/C++

C++기본기(2)

by 엉덩이싸움 2024. 2. 29.

6) C언어 기본기 정리 

 const 

- const int num = 10  변수 num을 상수화

- const int * ptrl1 = &val1 포인터 ptrl1을 이용해서 val1 값 변경 불가

- int * const ptr2 = &val2 포인터 ptrl2가 상수화

- const int * const ptrl3 = &val3 포인터 ptrl3을 이용해서 val3 값 변경 불가하며 포인터값 싱수화

 

상수화된 변수

: const 선언에 의해서 만들어진 변수를 가리킴

 본래 상수가 아니라, 변수를 상수화시킨 것으로 정의

   ec. cons int &ref = 50;                  

 

 

main ()함수

int main(void)  / int main(int argc, char* argv[])

argc : 프로그램에 전달할 인수 개수

argv : 전달한 인수의 값(실제 매개변수는 인덱스 1부터 시작하며 argv[0]에는 프로그램 이름이 담김)

 

 메모리 공간

- stack = 지역변수 및 매개변수 저장 영역

- heap = malloc 함수호출에 의해 프로그램이 실행되는 과정에서 동적으로 할당이 이뤄지는 영역

              호출된 함수를 free함수를 통해 해제해주어야 함

- data = 전역변수가 저장되는 영역

+ boo: true 와 false를 가리키는 자료 new+

7) 참조자

&의 사용

(1) 이미 선언된 변수 앞에 & 연산자 사용 시, 주소값의 반환을 의미

ec. int *ptrl = &num1   변수 num1의 주소 값을 반환에서 포인터 ptrl에 저장해라

(2) 새로 선언되는 변수의 이름 앞에 등장 시, 참조자의 선언을 의미 new+

ec. int &num2  = num1    변수 num1 에 대한 참조자 num2 선언

참조자 

= 자신이 참조하는 변수를 대신할 수 있는 또 다른 이름(기능과 연산의 결과가 변수랑 동일함)

  but 참조자는 선언과 동시에 변수를 대상으로만 선언가능

  참조자는 별칭과 마찬가지의 쓰임이며, 참조자 수에 제한이 없고, 참조자를 대상으로 참조자 선언가능

 

레퍼런스의 레퍼런스, 레퍼런스의 배열, 레퍼런스의 포인터는 존재할 수 없음

-> 주소값이 존재한다는 것은 해당 원소가 메모리 상에서 존재를 의미, but 레퍼런스는 특별한 경우가 아닌 이상 메모리 상에서 공간을 차지하지 않음

+ 배열의 레퍼런스는 가능  ex.  int arry[3]  = {};  int (&ref)[3] = arry;

                                           ex. int a, b, int& arry[2] = {a, b}  레퍼런스의 배열(불가능)

 

call by value VS call by reference

call by value : 값을 인자로 전달하는 함수의 호출방식 -> 함수 내부에서 외부에서 선언된 변수 접근 불가능

call by reference : 주소값을 인자로 전달받아, 함수 외부에서 선언된 변수에 접근하는 형태의 함수 호출

                                -> 주소값이 참조하는 영역에 저장된 값을 직접 변경함

                               + 주소값대신 참조자를 사용하여 함수호출 시 전달되는 인자로 초기화 가능;

권고사항)

함수 내에서, 참조자를 통한 값의 변경을 진행하지 않을 경우, 참조자를 const로 선언해서, 함수의 형만 봐도 값의 변경이 이루어지지 않음을 알 수 있게 함

참조자 상수

: const 참조자를 이용해서 상수를 참조할 때 임시변수를 만듦.

  이를 통해서 함수에 인자전달을 목적으로 변수 선언이 불필요함

ec. int ADDER(const int &ref1, const int &ref2); 선언 ADDER(3, 4)  호출 

 

reference return 은 reference 참조하는 타입의 크기와 상관없이 딱 한 번의 주소값 복사로 전달(매우 효율적)

but Dangling reference 주의 (=  피참조값이 사라지는 현상)

-> 레퍼런스를 리턴하는 함수에서 지역 변수의 레퍼런스를 리턴하지 않도록 유의

 

  함수에서 값 리턴 (int f()) 함수에서 참조자 리턴 int&f()
값 타입으로 받은 경우 int a = f() 갑이 복사됨  값이 복사됨, 다만 지역 변수의 레퍼런스를 리턴하지 않도록 주의
참조자 타입으로 받는 받음 int & a =  f() 컴파일 오류 가능. 다만 지역 변수의 레퍼런스를 리턴하지 않도록 주의
상수 참조자 타입으로 받는 경우
const int & a = f()
가능 지역 변수의 레퍼렌스를 리턴하지 않도록 주의

 

8) 동적할당함수 new & delete

malloc(C언어) -> new(C++)

ec.

int * ptr1 = new int;  int형 변수의 할당

double *ptr2 = new double; double형 변수의 할당

int * arr1 = new int[3]    길이가 3인 int형 배열의 할당

 

free(C언어) ->  delete(C++)

ec.

delete ptr1;  앞서 할당한 int형 변수의 소멸

delete []arr1; 앞서 할당한 int형 배열의 소멸

 

힙에 할당된 변수는 포인터가 아닌 참조자를 통해 이용가능

 

9) C++에서 C언어의 표준함수 

헤더파일의 확장자인 .h를 생략하고 앞에 c를 붙이면 C언어에 대응하는 C++헤더파일 이름이 됨

모든 표준함수들이 이름공간 std 내에 선언되어 있기 때문에 가능

ec.

#include <stdio.h> -> #include <cstdio>

#include <string.h> -> #include <cstring>

 

+) C++헤더를 선언해야 하는 이유 : 하위 버전과의 호환성을 제공하기 위해서

 

10) 변수

type explanation example
(signed) int 
signed
부호가 있는 정수를 표현, 값의 범위는 컴파일러마다 다름(일반적으로 4bytes) int i { -7 };
signed int i { -6 };
signed i { - 5];
(signed) short (int) 작은 범위의 정수(일반적으로 2bytes) short s { 13 };
short int s {14 };
signed short s { 15 };
signed short int s { 16 };
(signed) long (int) 큰 범위의 정수 (대부분 4bytes) long l {-7L};
(signed) long long (int) 아주 큰 범위의 정수(대부분 8bytes) long long ll { 14LL };
unsigned (int)
unsigned short (int)
unsigned long (int)
unsigned long long (int)
앞에 나온 정수 타입의 범위를 => 0으로 제한  
float  단정도 부동소수점수 float f {7.2f};
double  배정도 부동소수점수, 정밀도가 최소 flozt보다 큼 double d {7.2};
long double 확장 배정도 부동소수점수. 정밀도가 최소 double 보다 큼 lond double d {16. 98L};
char 
unsigned char
signed char
단일 문자 char ch {'m'};
char8_t(C++20부터)
char16_t
char32_t
단일 n비트 UTF n인코딩을 적요한 유티코드 문자(n은 8, 16, 32 중 하나) char8_t c8{u8'm'};
wchar_t 단일 확장 문자. 구체적인 크기는 컴파일러마다 다름 wchar_t w {L'm'}
bool 부울 타입으로 true 나 false 중 하나의 값을 가짐 bool b {true};

 * 위 예시들은 대입 문법이 아닌 균일 초기화, uniform initialization 문법에 따라 작성함 

ex. bool b = true (대입 문법) / bool b {true} (균일 초기화 문법)

 

- 숫자 경계값(정수의 양의 최댓값)

C에서는 INT_MAX로 매크로 정의사용

C++에서는 위의 방법 + <limits> 에서 제공되는 std::numeric_limits 클래스 템플릿 사용

정수에서는 최솟값, minumum value와 최젓값 lowest value가 같으나

부동소수점수에서 최소값은 표현 가능한 가장 작은 양의 값, 최젓값은 표현 가능한 가장 작은 음수(-max())

 

- 영 초기화

유니폼 초기자, {0} 을 이용하여 0으로 초기화함, 0 생략 가능

빈 중괄호 {} 로 표기한 유니폼 초기자를 영 초기자라고 함

기본 정수 타입 -> 0 / 기본 부동소수점 타입 -> 0.0 / 포인터 타입 -> nullptr

 

 

 

'프로그래밍 언어 > C++' 카테고리의 다른 글

문자열 클래스  (2) 2024.03.12
객체지향프로그래밍  (0) 2024.03.06
전처리 지시사  (0) 2024.02.25
rand, srand, time을 이용한 난수 생성  (0) 2024.02.15
C++ 기본기(1)  (1) 2024.02.13