C++ 과 C의 차이점

0. 스트림 입출력 연산자

C언어에서 입출력을 위해서는 printf와 scanf 가 주로 쓰였다.
C++에서는 cout<<과 cin>>을 주로 쓰는데 함수형태가 아니라 연산자 형태이다
 printf("%d",1234);
가 CPP에서는
std::cout << 1234;
로 같은(?)동작을 수행한다
<<, >> 이놈들이  C에서는 쉬프트 연산을 했기때문에
CPP 에서는 따로 구분을 쵸큼 해줘야된다…
std::cout <<  1<<2  <<endl;         -> 12 (1과 2를 순서대로 출력)
std::cout << (1<<2) <<endl;         -> 4  (1을 왼쪽2쉬프트 결과)

1. 블록내 변수선언

C 에서는 항상 함수나 블록의 시작에 변수를 선언해야하나
C++에는 어디서나 가능
ex )  for(int i =0 ; i< loopcount ; i++)

2. 변수 범위지정연산자

지역변수와 같은이름을 가진 전역변수를 구분하여 쓸수있다
ex )
char * str= "global";
{
    char * str = "what?";
    {
        char * str = "region";
        cout<< "Global : " << ::str << endl;
        cout<< "Region : " <<   str << endl;
    }
}
output :
Global : global
Region : region

3. bool 자료형

C에서도 쓴거같지만 …. 아니다
참과 거짓을 표현하는게 무려 1바이트나 든다 ( sizeof(bool) == 1 )
true 는 1로 (실제론 0이아닌 모든수가 true이다!)
false 는 0으로

4. 명시적인 형 변환

C에서는 캐스트 연산자를 써서 자료형을 변환하였지만
C++ 에서는 함수타입으로 형변환을 할수있다
(int)ch  ->  int(ch)
앞뒤를 괄호로 감싸줌으로써 어디서 어디까지 캐스팅하는지 정확하게 알수있다

5. enum, struct, union

사용시에
C에서는
enum t_enum a;
struct t_struct b;
union t_union c;
이런식으로 앞에 명시해줘야했지만
 C++에서는 생략하고
t_enum a;
t_struct b;
t_union c;
이런식으로 쓸수가 있다 .

6. 오버로딩

오버로딩이 뭐냐면 함수 재정의 입니다 (초과 적재)
C에서는 같은이름을 가진 함수를 여러개(두개이상) 쓸수없습니다만
C++에서는 구분이 된다면 얼마든지 만들어 쓸수가 있습니다 .
int sum (int a,int b)         {   return a+b; }
int sum (short a, short b) {   return a+b; }
뭐 이런식?

7. 디폴트 매개변수

매개변수를 입력하지 않았을때 기본값을 지정할수있다
int increase(int incnum = 1 )
{
    return (count +=incnum);
}
increase(5); // 호출시 count가 5증가
increase();  // 호출시 count가 default 만큼(1) 증가

8. 인라인 함수 inline

보기는 함수랑 똑같은데
실제 수행하는 함수랑은 다르다 ( 스택프레임이 바뀌지 않는다.  -> 속도가 함수에비해 빠르다 )
매크로의 단점을 보완해주며 코드 최적화(?)에 사용된다
#define SQUARE(x) ( (x) * (x) )
inline int square(int x){    return ( x * x ); }
int main()
{  
    int a=2;
    cout <<"M : " <<SQUARE(++a)<<endl;
    a=2;
    cout <<"I : " <<square(++a)<<endl;
    return 0;
}
M : 16  // ((++a) * (++a))  ->  4 * 4
I : 9     // (3 * 3)

9. 레퍼런스 Reference

별명이라고 하는데 그냥 포인터를 변수화 시킨것.
int a = 5 ;
int &b = a ;  // b별명의 본체로 a를 지목
cout << "a : " << a << "\t" <<  "b : " << b<< endl ;
b=10;
cout << "a : " << a << "\t" <<  "b : " << b<< endl ;
output :
a : 5         b : 5
a : 10        b : 10
참고로 포인터로는
int a=5;
int *  b=&a;  // a의 주소를 b가 가리킴
cout << "a : " << a << "\t" <<  "b : " << *b<< endl ;
*b=10; // b=10 요롷케 쓰면 b가 가리키는 주소가 바껴버림
cout << "a : " << a << "\t" <<  "b : " << *b<< endl ;
그러니까 *을 줄일수 있다 + 포인터 울렁증엔 이거만큼 좋은게 없지 ㅇㅇ…
근데 이거는 한번 가리킨걸 바꿀수가 없다 b = c 이렇게하면 b의 값을 c로 바꾸는거밖에 더되나.
&b = c ? 컴파일에러 .(error: lvalue required as left operand of assignment) 라는데…
&b 가 b의 주소값이란 뜻이잖아 그 주소값을 c라는 정수로 바꿀수가 없다는뜻이지 (바껴서도 안되고..)
책에 쵸큼 신기한게 있네
int x = 88;
int & func (void )
{
    return x;
}
int main()
{
    cout << "x : "<< func << endl;    // x : 88 을 출력하겠찌
    func() = 100;   // 이게 가능해 !
    cout << "x : "<< func << endl;    // 가능하다니 x : 100 을 출력하겠찌
    return 0;
}

10. 동적메모리 할당 (new , delete)

C언어에서는 void * malloc ( size_t __size ) 를 호출해서 형변환을통해 포인터로 받았다.
예를들어
int * mem = (int*) malloc( sizeof(int) * 100); // int의 크기를 알아내서… 하여튼 귀찮다
free (mem) ; // 해제는 간단하다.
C++에서는 훨씬 간단하게 가능하다
int * mem = new int[100];
delete [] mem ; // 배열을 해제할떄는 꼭 대괄호 써줘야된다!  // 한개만 해제는 안써도됨

11. 네임스페이스

C++ 에서는 비슷한(?)애들을 묶어버릴수 있다
namespace AA
{
    int i;
    void function();
    …
}
이렇게 묶고 AA::i , AA::function() 이런식으로 쓸수가 있다
이게 계속쓰기 귀찮잖아 ? (예를들어 std::cout ..)
그러면
using namespace AA;
를 써주면 i 만써도 알아서 AA::i를 찾아간단 말이지
어휴 끝났따

Leave a Reply

Your email address will not be published. Required fields are marked *