C++ The difference between C and C ++.
1.C ++ basic functions
#include
using namespace std; void print_square(int arg); int main() { int i; cout << "제곱할 수 ? : "; cin >> i; print_square(i); return 0; } void print_square(int arg) { cout << "전달된 인자 : " << arg*arg << endl; }
C++와 C는 입출력 방법이 방법만 조금 다를 뿐, 다 똑같다.
아래 코드에서 void형의 (리턴값 X) 함수 print_square를 선언한다.
즉 arg* arg를 출력하는 것.
void print_square(int arg);
{
cout << "전달된 인자: " << arg*arg << endl;
}
main 함수에서 인자로 i를 전달하고, print_square(i);
따라서 arg에 i의 값이 들어가서 i * i인, 실행 결과의 경우 12를 전달해서 144가 출력된다.
2.C ++ The difference between C and C++.
#include
using namespace std; int change_val(int *p) { *p = 3; return 0; } int main() { int number = 5; cout << number << endl; change_val(&number); cout << number << endl; }
일단 예시를 먼저 들겠다.
일단 레퍼런스(Reference)의 사전적 의미는 참조,참조.
C++에서는 흔히 참조자라고 한다.
위 소스코드를 보면 chage_val 함수에서 number 앞에 &를 붙이지 않고, change_val 에서도 *p = 3; 대신에 p = 3;으로 썼다. 대신 change_val에서 int &p를 받고 있다.
여기서 레퍼런스는 p가 number 변수의 다른 이름이 되는 것을 의미한다. 즉 p = 3; 이란 명령은 number = 3;를 말하는 것이다.
즉 레퍼런스는 int& ref = number;
int 타입 변수의 레퍼런스는 int&. 사용자가 마음대로 정의한 것이라고 할 수 있다.
유의해야 될 것은 반드시 정의 할 때 초기화가 되어야 된다는 것이다.
int &ref <= X.
포인터 자체는 메모리 값을 보관하는 변수 자체로 활용될 수 있지만, 레퍼런스는 포인터처럼 메모리 공간에 할당되어서 자기 자신을 참조하는 *주소값을 보관하는 것이 아니라, 컴파일 시에 원래 가리키던 변수의 주소값으로 다 치환된다.
int a = 10;
int &ref = a;
int b = 3;
ref = b;
ref =b; 에서 ref가 b를 가리키는 것이 아니라, a = b; 즉 a에 3이 대입되는 것.
&ref = b; 와 같은 문장은 &a = b; 'a의 주소값을 3으로 변경?' 말도 안되는 소리고,
ref &=b;는 ref = ref & b; = a = a & b;와 같은 문장으로 의미가 다르다.
레퍼런스는 포인트로 치면 int const * 가장 중요한 것은 한 번 별명이 정해지면 절대 바꿀 수 없다.
3.C ++ Pointer vs Reference.
int number = 5;
int& ref = number;
int *p = &number;
ref++;
p++;
#includeusing namespace std; int main() { int x; int& y = x; int& z = y; x = 1; cout << "x : " << x << " y : " << y << " z : " << z << endl; y = 2; cout << "x : " << x << " y : " << y << " z : " << z << endl; z = 3; cout << "x : " << x << " y : " << y << " z : " << z << endl; }
4.C ++ A reference to a constant.
예시를 통해 보자.
#includeusing namespace std; int main() { int &ref = 5; cout << ref << endl; }
5.An array of references and an array reference.
c를 공부해본 사람들이라면 이와 비슷한 주제를 본 적이 있을 것이다. 포인터의 배열 vs 배열 포인터 느낌과 비슷하게 C++에서는 레퍼런스로 주제를 잡겠다.
일단 레퍼런스는 반드시 정의와 함께 초기화를 해줘야 한다는 절대 조건이 있다.
int a,b,c; int& arr[3] = {a,b,c}; 라는 간단한 코드가 있다고 하고 컴파일을 실행해봤지만, 에러가 뜬다. 일단 결론부터 말하자면, 레퍼런스의 포인터는 애초에 성립 자체를 하지 않는다.
레퍼런스는 메모리 상에 특정 공간을 차지하는 것이 아니라 컴파일 시에 원래 레퍼런스가 참조하던 변수의 주소값으로 대체된다고 했고, 메모리 공간을 차지하지 않는 것의 포인터를 생각한다는 것 자체가 말이 안된다.
반대로 배열의 레퍼런스를 보자.
#includeusing namespace std; int main() { int arr[3] = {1,2,3}; int (&ref)[3] = arr; ref[0] = 2; ref[1] = 3; ref[2] = 1; cout << arr[0] << arr[1] << arr[2] << endl; return 0; }
코드를 살펴보자.
int arr[3] = {1,2,3};
int (&ref)[3] = arr;
#include <iostream>using namespace std;int fn1(int &a) {return a;}int& fn2(int &a) {return a;}int main(){int x = 1;cout << fn2(x)++ << endl;cout << "x :: " << x << endl;}
x의 값이 바뀌었다. 이유는 fn2.
int& fn2(int &a) {
return a;
}
'#Programming Language > C++' 카테고리의 다른 글
C++ Object-oriented programming. (0) | 2018.03.30 |
---|---|
C++ Everything in an object. (0) | 2018.03.30 |
C++ Features of C ++ only. (0) | 2018.03.30 |
C++ Common in C and C ++. (0) | 2018.03.29 |
C++ Introduction and Basic Elements. (0) | 2018.03.29 |