본문 바로가기
C++(공부중)

C++ 공부 1일차

by 케찹이 2020. 7. 28.
int x;
int& y = x;
int& z = y;

C++에는 C언어의 대부분 문법들을 포함하고 있다. 

C++ 파일들은 xxx.cpp로 저장을 한다.

printf(.....)은 C++에서 std::cout << ....  << std::endl; 로 사용하게 된다. (물론 printf를 그대로 사용하여도 출력이 가능하다.) std::cout은 데이터를 출력하고 std::endl은 "엔터" 역활을 해준다.

#include<stdio.h> 와 같은 표준 입출력 헤더는 C++에서 #include<iostream>으로 대체한다.

 

이름공간(namespace)부터 아예 C++에서의 새로운 내용들이 시작된다.

std::cout, std::endl, std::cin에서 std의 정체는 C++표준 라이브러리의 모든 함수, 객체 등이 정의된 이름공간이다. 

어떤 객체에 소속되어 있는지 지정해주는 것과 같다. 

std라는 이름공간에 정의되어 있는 cout, endl, cin(뒷부분)이라는 의미이다.

using namespace std를 사용하면 std::를 생략가능하지만 C++언어 특성상 업데이트가 자주 됨으로 귀찮더라도 왠만하면 std::를 사용하도록 하자.

 

for, if, while, switch, 변수 선언등은 모두 C언어와 같은 방식으로 사용된다.

 

C++에는 참조자라는 것이 존재하는데 이는 포인터와 비슷한 역활을 하고 있다. 포인터는 메모리주소를 사용하여 실제 변수의 값에 접근하는 반면에 참조자는 해당 변수의 또다른 이름 역활을 한다. 

참조자는 int& a, double& b, int*& c 이런식으로 선언 가능하다.

참조자의 몇가지 특징으로써는

 

1. 참조자는 반드시 처음에 누구의 별명이 될것인지 지정해야한다. 

2. 참조자는 한번 별명이 된다면 절대로 다른 변수의 별명이 될 수 없다. 

3. 참조자는 메모리상에 존재하지 않을 수도 있다.

 

함수인자로 참조자를 받을 때에는 메모리에 존재할 수도 있다.(보류, 아직 메모리에 존재할때의 상황을 잘 모르겠다.)

 

int x;
int& y = x;
int& z = y;

위 코드에서 x = y = z이다. 절대로 int&&z = y 가 아니다. 

 

scanf와 cin의 다른점은 scanf는 항상 주소값을 전달하였지만 cin은 참조자로 변수를 받기 때문에 &를 붙일 필요가 없다.

 

상수값을 참조할 수는 없다. 왜냐? 상수값 자체는 리터럴이기 때문이다. (리터럴이란 소스 코드 상에서 고정된 값을 가지고 있는 것.) 그 대신에

 

const int &ref = 4;

상수 참조자로 선언하면 리터럴도 참조 가능하다고 한다.

 

 

래퍼런스(참조자입니다.)의 배열은 존재하지 않는다. 즉 int& arr[2] = { 1, 2 }; 은 존재할 수가 없다...

왜냐하면 arr만을 사용했을 때 이는 첫번째 원소의 주소 값을 의미하고 이는 해당 원소가 메모리에 존재한다라는 것이다.

하지만 막 위에서 언급했다 싶이 참조자는 메모리에 존재하지 않을 수도 있다. 그럼으로 이런식으로 사용되는 것은 문제가 될 수 있다. 

 

레퍼런스의 배열은 불가능하지만 배열의 레퍼런스는 가능하다!!!

int arr[3] = {1, 2, 3};
int (&ref)[3] = arr;

ref[0] = 2;
ref[1] = 3;
ref[2] = 1;

이런식으로 ref가 arr을 참조하도록하고 ref를 통해 값을 조정하게 되면 arr의 값도 그와 같게 바뀌게 된다. 

 

 

 

 

 

<씹어먹는 C++>을 참조하였습니다.

'C++(공부중)' 카테고리의 다른 글

C++ 공부 3일차  (0) 2020.07.30
C++ 공부 2일차  (0) 2020.07.28

댓글