반응형

오늘 수업 들은것.... 근데 뭔가 글쓰기는 귀찮아서 주석으로 대체한다. (주석적다가 일부분 수업 놓침 망함티비)

#include <iostream>

class ConstTest
{
public:

	const int a = 0;
	int b = 0;

	ConstTest() {}
	~ConstTest() {}
	void Addnum()
	{
		b++;
	}
	int GetNum() const
	{
		return b;
	}
	void Show() const
	{
		std::cout << a << " " << b << '\n';
	}
};

int main()
{
	const ConstTest* a = new ConstTest(); // const객체 선언. 객체의 멤버를 바꾸지 않겠다!
	ConstTest* const b = new ConstTest(); // non-const객체 선언. 객체의 멤버를 바꿀 수 있다. but b포인터의 주소는 바꿀 수 없다.

	a->b += 1; // 에러. const객체는 멤버를 변경할 수 없다.
	b->b += 1; // 가능.

	a->Addnum(); // 에러. const객체는 const함수만 호출 가능.
	b->Addnum(); // 가능.

	a->GetNum() = 1; // const함수기 때문에 반환 값을 바꿀 수 없다.
	b->GetNum() = 1; // 위와 동일

	a->Show(); // 가능. const객체는 const함수는 호출할 수 있기 때문.
	b->Show(); // 가능.

	a = b; // 가능. 주소는 바꿀 수 있다. 멤버만 못바꿈.
	b = a; // 불가능. 포인터를 const화 시켰기 때문에 주소를 바꿀 수 없다.

	delete a;
	delete b;

	a = new ConstTest(); // 가능
	b = new ConstTest(); // 에러. const변수는 선언과 동시에 초기화 되어야 하기 때문

}

 

알아서들 이해하셨길....

반응형
반응형

하 개 오랜만에 글쓴다....

 

한국인을 위한 코드 미리보기

#include <iostream>

class Object
{
private:
	static int m_obejctCount;
	const char* m_name;
public:
	Object(const char* _name)
	{
		++m_obejctCount;
		m_name = _name;
		std::cout << "CreateObject (" << m_name << ")\n";
	}
	~Object()
	{
		--m_obejctCount;
		std::cout << "DeleteObject (" << m_name << ")\n";
	}
	static int GetObjectCount()
	{
		return m_obejctCount;
	}
	static void DestroyObject(Object* _target)
	{
		delete _target;
	}
};
int Object::m_obejctCount = 0;

int main()
{
	Object* a = new Object("Object1");
	Object* b = new Object("Object2");
	Object* c = new Object("Object3");

	Object::DestroyObject(c);

	std::cout << "Object Count : " << Object::GetObjectCount() << "\n";
}


먼저 알아가야 할 것..

밑줄  << 이렇게 밑줄 쫙 그어놓은건 ㅈㄴ 중요한거고

배경  << 이렇게 배경해놓은거는 그냥 한번 봤으면 좋겠다는 정도고

밑줄배경 << 이건 그냥 개 ㅈㄴ게 ㅁㅊ 레전드로 중요한거다 다른거 안봐도 이건 봐줍메 제발

class내에서 변수에 static을 붙였다 = 정적멤버변수

class내에서 함수에 static을 붙였다 = 정적멤버함수

(이게 ㅈㄴ게 중요!!!!!!) static은 전역변수, 함수 취급을 받는다. 하지만 class 내부에 멤버로 주게 될 경우 그냥 그 class 내부에서만 쓸 수 있게 한정해줄 뿐이다. 너무 어렵게 생각하지 말자... 첨에 이 개념을 못가져가서 많이 헷갈렸다.


static은 프로그램 시작시 할당되는데, 문제는 class객체의 생성 전에 할당된다는 것이다....

때문에 정적멤버변수는 class안에서 초기화를 못한다...(class 내부에서 해보고싶으면 해보자... 내 기억엔 에러뜸...)

따라서 정적멤버변수는 전역범위에서 따로 초기화를 해줘야 한다!!

이렇게...

 

그리고 위와 같은 이유로 멤버함수도 당연히 this포인터를 받지 못한다...

따라서 this->m_name과 같이 정적멤버함수는 비정적멤버변수에 접근하지 못한다.

근데 ㅈㄴ 웃긴게... 위에 사진처럼 정적멤버함수에 매개변수로 자신의 class를 자료형으로 줄 수 있음... 심지어 위에 사진에 있는 _target의 비정적멤버변수도 사용 가능. (이 순간 "아니 ㅅㅂ!! this는 못쓰는데 이건 어캐 씀?" 라는 의문을 가짐)

당연히 static은 프로그램 시작 시 할당되는데.... class의 존재여부를 모르는게 당연한거 아닌가? 해서 교수님한테 물어봄ㅋㅋ

교수님왈, 매개변수를 받아 쓰는건 초기화 이후의 과정이므로... 상관없다... 라는 느낌으로 말하셨는데 느낌만 알겠고 설명을 못하겠다...

 

자 여기까지 static의 멤버변수와 멤버함수에 대한 설명을 다 했다!  라고 하고싶은데 중요한게 하나 더 남아있음..ㅇㅇ

위에서 설명했지만 class내의 static도 전역변수,함수라고 생각하라고 했는데, 말 그대로 객체가 여러 개여도 정적 멤버는 하나밖에 존재할 수 없다.

따라서 위 사진에 a, b, c객체가 m_objectCount의 값을 공유한다는 것이다.

더 쉽게 말하면 그냥 m_objectCount라는 전역변수가 있는데, Object라는 class 내에서만 쓸 수 있는 것 뿐이다. 때문에 출력해보면 정적멤버변수인 ObjectCount가 생성(+1)-생성(+1)-생성(+1)-삭제(-1) = 2가 나오는 것이다!

 

하 적다보니 귀찮아서 그냥 대충 설명하게 된다... 알아서 잘 이해하셨길...

반응형
반응형

미리 컴파일된 헤더(Precompiled Header)란 여러 헤더들을 한 헤더에 묶고, 그 헤더를 미리 컴파일 하여 컴파일 시간을 줄여줄 수 있다. 

 

프로젝트 우클릭 - 속성 - C/C++ - 미리 컴파일된 헤더

 

운영체제 확인은 필수

 

 

사용 클릭

 

파일 이름 설정 (아무거나 입력해도 상관없다!!)

 

설정한 이름의 헤더랑 같은 이름의 헤더를 만든다...

 

헤더에 미리 컴파일 할 헤더를 넣어준다!!

 

이제 사용 할 CPP파일에 설정한 헤더(이 글에선 stdafx)를 #include해주면 그 안에 있는 헤더를 다 사용 할 수있다!!!

 

주의할 점은 미리 컴파일된 헤더에 컴파일한 헤더를 자주 바꿀 경우 오히려 컴파일이 느려진다는 것이다. (마소피셜 두배정도느려진다 하네요)

반응형
반응형

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/sprintf-s-sprintf-s-l-swprintf-s-swprintf-s-l?view=msvc-170

 

(int) sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format, (int, float...) argument)

buffer 문자를 저장할 문자열의 포인터
sizeOfBuffer 해당 버퍼의 최대 문자수
format 출력할 문자의 자료형
argument 문자로 넘길 변수

 

반환 값 : 함수를 호출했을 때 넘긴 argument의 문자열 Byte수(int)를 반환합니다. 

 

사용 예시

#include <stdio.h>

int main(void)
{
	char  buffer[100];
	int   a = 35, j;
	float b = 1.7320534f;

	j = sprintf_s(buffer, 100, "a = %d  ", a);
	j += sprintf_s(buffer + j, 100 - j, "b = %f" , b);

	printf_s("%s", buffer);
}

 

string과 wstring을 쓰면서 안쓰게 되었던 메소드지만 stl을 안쓴다면 정말 유용하게 쓸 수 있을거 같다

반응형

+ Recent posts