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 |
댓글