반응형

 

 

 

함수 포인터 는?

함수 포인터 는 함수에 포인터를 달아서 다른 함수들을 교체해가면서 사용할 수 있는 방법이다.

 

 그럼 어디 쓰이냐? 

간단하게 생각하면 스킬 변경이나 같은 값으로 다른 효과를 내고 싶을때 사용한다.

 

사용

{

 선언은 함수와 비슷해 [ 자료형 (* 함수명)(매개변수) ]처럼 사용한다.

 

	void (*Point_func)();
	void (*Point_func_mg)(int &a ,int &b);

 

void pointFuncTest1() {	printf("1번작동");}

 void pointFuncTest2() { printf("2번작동");}
    
    C->Point_func = pointFuncTest1;
	C->Point_func();
	C->Point_func = pointFuncTest2;
	C->Point_func();

	B->Point_func_mg = swap_reference;
	B->Point_func_mg(x, y); // x =10, y=5
	printf("\n\n\n%d , %d", x, y);

}

처럼 사용한다.

 

결과를 한번보자

{

 

 

 

}

 

처럼 작동한다.

 

또 함수포인터 를 매개변수로 받아 줄수 있는 방법도있다.

 

//선언
D3DXVECTOR3(*Shootting)(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos,int _speed);
void SETBulletTiype(  D3DXVECTOR3(_Funce(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos, int _speed))=Shutting_Under);
inline static D3DXVECTOR3 Shutting_Under(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos, int _speed);


//함수를 넣어주는 함수
void BulletBase::SETBulletTiype( D3DXVECTOR3(_Funce(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos, int _speed)))
{
      this->Shootting = _Funce;
}

넣어주는방법
this->SETBulletTiype(Shutting_Under);

 

 

 

'언어 > C++' 카테고리의 다른 글

cpp 전처리기  (0) 2023.09.05
c++ std::function 사용하기  (0) 2023.01.10
인라인 함수(Inline Function)  (0) 2021.06.15
네임스페이스  (9) 2021.05.18
bit연산! 또는 bit Flag  (0) 2021.05.05
반응형

 

인라임 함수가 뭘까?

 

 

 

일반함수 : 사용시 함수 호출

인라인 함수 : 컴파일러 수행 단계에서 이루어진다, - 컴파일러가 함수를 사용할때 코드를 복사해서 사용해

매크로 함수 : 선행처리기 수행 단계에서 이루어진다, - 또한 계산식이 다르고 복잡하여 힘들어 

 

함수 호출 과정이 없어서 속도가 조금더 빠르다

 

why?

왜 복사보다 호출이 느리지? 라고 생각할수있어

하지만 함수가 호출 되는 과정은 생각보다 복잡해

그렇기 때문에 간단한 식은 오히려 복사하는게 빠른거지

그래서 간단한 식을 인라인 함수로 사용하는거야

 

 

우선 인라인 함수의  기본적인 사용법은

inline 자료형 이름(매개변수){ 내용 } 이야

 //인라인함수
 inline int SUM_INLINE(int a, int b) {
	 return a + b;
 }

 int main()
 {

	 int INLINE_NUM = SUM_INLINE(5, 5);
	 std::cout << INLINE_NUM << std::endl;//10입니다.
  }

코드가 컴파일되면 

 

 //인라인함수
 inline int SUM_INLINE(int a, int b) {
	 return a + b;
 }

 int main()
 {

	 int INLINE_NUM = inline int SUM_INLINE(5, 5){ return 5 + 5 }
	 std::cout << INLINE_NUM << std::endl;//10입니다.
  }

이처럼 함수가 실행되는 부분에 복제되어 작동하지!

 

주의할점

하지만 인라인 함수를 사용하면 프로그램 속도는 빨라져도 남용하게 된다면

복제되는 것이기 때문에 프로그램의 크기가 커저버려

 

 

 

 

재미있는점은 컴파일러판단해서 인라인화를 안할수도 있고,

선언을 안해도 자동으로 인라인화를 하는 경우도있어

          visual studio 의 경우 구성속성 -> c/c++ -> 최적화 -> 인라인 함수 확장[...]

          에서 설정을 해줄수도 있어 (사용한함처럼) 기본값은 적합한 것 모두 확장이야.

 

 

'언어 > C++' 카테고리의 다른 글

c++ std::function 사용하기  (0) 2023.01.10
함수 포인터! (Function Pointer)!  (0) 2021.07.13
네임스페이스  (9) 2021.05.18
bit연산! 또는 bit Flag  (0) 2021.05.05
call by reference/call by value/call by address  (0) 2021.05.03

반응형

 

네임스페이스(namespace)를 알아보자!

 

네임스페이스를 모르더라도 C++ 공부를 하면서 이미 알고 사용하고 있어

std::cout 다들 많이 써봤지? 

 

            std                                 ::                                   cout

 (네임스페이스 이름) (스코프 연산자) (사용할 변수 또는 함수등)  

 

이러한 구조로 이루어 져있어서 스코프 연산자를 사용해 접근하여 사용해

 

그래서 이게 왜필요한데;;

 

 

그건 우리가 팀프로젝트나 다른 라이브러리를 추가할때 이름이 겹칠 확률이 늘어나

이러한 이름 충돌 문제를 네임스페이스로 해결할수 있는거지!

 

네임스페이스 안에는 여러가지를 선언하여 사용할수 있지.

사용 하는걸 한번보자!

 

<기본 예시+class>

 namespace TestCode { //선언

	 int testint; //변수
	 
     void testFunc() {//함수
		printf("My Namespace");
	 }
     
	class NamespaceClass//클래스
    {
    public:
    	void static classfunc() {}
 	};
	
 }
 
  namespace TestFunc { 
  	void testFunc(){}
  }
 
int main()
{
	TestCode::NamespaceClass::classfunc();
	TestCode::testint = 1;
    
     TestCode::testFunc();
     TestFunc::testFunc();

}

처럼 사용할수 있지!

 

 

 

과연 네임 스페이스 안에 네임스페이스를 선언하여 사용할수 있을까?

 

<중첩 네임스페이스>

 namespace TestCode {
	 namespace Names {
		 int b;
	 }
 }

int main()
{
	TestCode::Names::b = 0;
	std::cout << TestCode::Names::b;
}

이처럼 사용할수 있지

 

네임스페이스를 쓸때 전부 std:: 처럼 사용하기 싫지?

그럴때 맨위에 using namespace <이름> 을 사용하면 앞에 붙이지 않아도 사용할수 있지

<using>

 namespace TestCode {
	 namespace Names {
		 int b;
	 }
 }

int main()
{
	using namespace TestCode::Names;
	b = 0;
 }

 

 

그리고 이건 조금 중요해

 

 

<네임스페이스 함수 구현>

namespace TestCode {
	 void TestFunc();
 }
 
 using namespace TestCode;
 void TestCode::TestFunc() { printf("a"); };
int main()
{
	TestFunc();
}

함수를 구현할때는 using을 써도 네임스페이스 이름을 붙여서 사용해야해 

 

 

그리고 우리가 사용하는 전역변수와 함수는 암시적으로 전역 네임스페이스에 추가되지

전역 네임스페이스를 한정할때는 :: (함수이름) 처럼 이름없이 사용하면 구분해줄수 있지!

 

<전역 네임스페이스 코드>

int a =10; 
 
int main()
{
int a =0;

  ::a //전역변수
  a //지역변수

}

이렇게 말이야

::a 를 출력하면 10 이 나오고 a 를출력하면 0이 나오는 거야!

 

 

 

 

 

'언어 > C++' 카테고리의 다른 글

c++ std::function 사용하기  (0) 2023.01.10
함수 포인터! (Function Pointer)!  (0) 2021.07.13
인라인 함수(Inline Function)  (0) 2021.06.15
bit연산! 또는 bit Flag  (0) 2021.05.05
call by reference/call by value/call by address  (0) 2021.05.03
반응형

오버로딩과 오버라이딩

 

오버로딩(overloading) 은 같은이름의 함수를 선언해두고 매개변수 변경및 추가하여 사용하는 기법이야.

	void overloading(int a);
	void overloading(int a,int b);
	 void overloading(int a,char b);

이처럼 같은 이름으로 선언하고 매개변수를 바꿔 사용하지.

 

이게 왜? 필요한데 overloading2 나 3으로 이름 바꿔 쓰는것과 같지 않아? 

 

그렇게도 사용할수 있지만

사용할때 하나의 이름으로  간단하게 사용하는게 장점이야!

 

실제로 사용할때는 2나 3이 아닌 이름을 붙여 사용하게 될텐데

overloading_int(A),overloading_string(B), 으로 사용하는것보다

overloading(A),overloading(B) 동일된 형태로 사용하는게 편하다 이거야

 

 

오버라이딩(overriding) 은 부모 클레스에서 사용된 메서드를 재정의 해서 사용하는거지

 

하지만 동작만을 재정의 하는것이라 매개변수와 매서드의 이름은 부모 클레스와 같아야해

코드로 보자!

class MyClass
{
public:
	virtual void A();
};

class MyClass1 :MyClass 
{
public:
	 void A()override; 
};

void MyClass::A(){
    std::cout<<"MyClass";
 }

 void MyClass1::A(){ 
   std::cout<<"MyClass1";
 }

이처럼  같은 A 라는 메서드에 내용을 바꿔 사용할수있는거야

 

'언어' 카테고리의 다른 글

그냥 내가 자주 쓰던 visual studio 단축키  (0) 2024.11.20
증감연산자  (0) 2021.05.31
메서드 와 함수가 다른가?  (0) 2021.05.15
반응형

 

메서드는 함수에 포함되어 있는 계념이다.

class A
{
	void M(){std::cout << "메소드";}
};

void F(){std::cout << "함수";}

class 안에 있는걸 메소드 라고 칭해

 

다른거 라고 하면 함수는 독립적이고

메소드는 class 에 종속적인것 정도야

'언어' 카테고리의 다른 글

그냥 내가 자주 쓰던 visual studio 단축키  (0) 2024.11.20
증감연산자  (0) 2021.05.31
오버로딩과 오버라이딩  (0) 2021.05.15
반응형

오늘 알아볼 것은 bit 연산이야!

 

bit 연산이 뭘까?

 

 

 

 

 

 8bit = 1byte 인건 알고있지? 

그러면 int 는 4byte = 32bit 같은거야

 

bit 란 데이터를 나타내는 제일 작은 단위야 0과 1로 구성되어 있지 

0과1을 on/off 로 표현한걸 flag🏁 라고도 말해

이걸 사용하면 공간을 좀더 효율적으로 사용하는게 가능해

 

🏁flag 이건 상태를 저장할때 쓰여!

우리가 8가지 상태를 저장할때  bool 을 8번 선언 해서 사용할수도 있을텐데

bit flag 를 사용하면 char 을 하나만 사용해도 8가지 상태를 저장할수 있다는거야

1byte 만 사용해서 8가지 상태 저장을 할수있는거지

 

 

그래서 어떻게 쓰는건데?

 

 

 

 

&   비트 AND 연산  비교되는 인자가 둘다 참일때 참
|   비트 OR 연산  비교되는 인자가 하나라도 참이면 참
^   비트 XOR 연산  비교되는 인자가 서로 다르면 참
~   비트 NOT 연산  인자의 값을 반전시킨다
<< 비트 쉬프트 연산 비트값을 왼쪽으로 지정한 횟수만큼 이동한다.
>> '' 비트값을 오른쪽으로 지정한 횟수만큼 이동한다.

이 표를 보면 if 문의 and , or 문에서 본적있는거 같지?

unsigned char Flag1 = 5; //0000 0101
unsigned char Flag2 = 3; //0000 0011

printf("%d",Flag1 & Flag2); //0000 0001
printf("%d",Flag1 | Flag2); //0000 0111
printf("%d",Flag1 ^ Flag2); //0000 0110
printf("%d",~Flag1); // 1111 1010
printf("%d",Flag1 << 1); // 0000 1010
printf("%d",Flag1 >> 2); // 0000 0001

unsigned char (범위 = 0~255)

이처럼 사용된다 게임에서는 플레이어의 상태 같은걸 만든다고 생각하면 편하다.

 

 

 

'언어 > C++' 카테고리의 다른 글

c++ std::function 사용하기  (0) 2023.01.10
함수 포인터! (Function Pointer)!  (0) 2021.07.13
인라인 함수(Inline Function)  (0) 2021.06.15
네임스페이스  (9) 2021.05.18
call by reference/call by value/call by address  (0) 2021.05.03
반응형

 

call by referncecall by value 그리고 call by address

이것들은 무엇인가?

 데이터 전달 하는방식 이라고 생각하자.

 

언어들마다 기본적으로 사용하는 방식이 조금 다를수 있으니 조심하자.

 

 

call by value  

        값에 의한 호출

   

 

int plus(int _a){  _a++; }

값을 복사 생성하여 내부에 새로운 값의 _a를 생성하여 사용하는 방법

그럼으로 아래의 코드  return으로 값을 돌려주어 데이터를 다시 넘겨주는 경우가 많음

int plus(int _a){ return _a++; }

 

잘못하여 사용할경우 큰데이터값을 복사 생성하여 속도가 느려지며 크기가 커질수 있다.

 

 

---------------------------------------------------------------------------------

call by address 

         주소에 의한 호출

 

 

void swap_address(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}

이처럼 함수 안에서 포인터를 이용하여 주소값을 전달하여 사용한다.

값의 위치를 전달하기에 속도가 call by value(복사생성) 보다 빠르다.

수정했을경우 데이터가 바로 바뀔수 있기에 편리하지만 데이터를 직접 변경하기 때문에 위험할수 있다.

 

---------------------------------------------------------------------------------

call by reference

         참조에 의한 호출

 

 

call by reference는 c에서는 지원을 하지않는 방식이다. Address방식괴 매우 유사하다.

메모리 구조에 대해서 이해가 있으면 좋다

 

메모리 공간에 이름을 붙여서 공유하여 사용 한다.

void swap_reference(int &a,int &b){ 
int temp = a;
a = b; 
b = temp;
}

또는

int a =10;
int &ref = a;
ref = 20; //a=20;

처럼 사용할수있다

-------------------------------

정리

 

reference address 방식은 값 전체를 복사하지 않기 때문에 속도가 빠르고 메모리를 덜 사용한다.

 또한 장단점으로는 원래 값이 영향을 받기 때문에 편하지만 조심해야한다.

둘은 포인터 형식으로 전달 받는가 아닌가의 차이다. 

 

 

 

 

value는 복사하여 사용하기 때문에 값이 보존되어 안전하지만

데이터의 크기가 커지면 속도가 느려지고 데이터를 많이 사용한다.

 

예외로는 Python은 call by assignment라는 방식을 사용한다.

 

 

'언어 > C++' 카테고리의 다른 글

c++ std::function 사용하기  (0) 2023.01.10
함수 포인터! (Function Pointer)!  (0) 2021.07.13
인라인 함수(Inline Function)  (0) 2021.06.15
네임스페이스  (9) 2021.05.18
bit연산! 또는 bit Flag  (0) 2021.05.05

+ Recent posts