class
#include <iostream>
class My_class
{
// 1. 접근 제한 지정자
// private, public, protected(상속)
// 각 접근 제한 지정자는 선언된 아래로 다른 접슨 제한 지정자가 나타날 때까지 효력이 있다
private:
int m_i; // private 는 My_class 의 하위 맴버로 main 등의 다른 함수에서 접근할 수 없다.
float m_f;
public:
int m_o; // public 은 하위 맴버로의 접근을 허용한다.
// 2. 맴버함수
public:
void SerInt(int i)
{
m_i =i; // 본래 m_i 는 private 이기에 접근이 불가능 하지만 SetInt 함수를 통해서는 수정이 가능하다
// this -> m_i =i; // this 포인터(해당 맴버 함수를 호출한 객체의 주소 타입을 뜻함)
// c 에서는 함수에 객체를 매개인자로 주어야 했지만 c++ 의 class 에서는 객체를 통하여 맴버함수에
// 접근하기에 c 스타일의 My)class* _this 를 매개인자에서 생략하고 this 키워드(객체의 주소값)로 대신하는 것
// this 키워드는 생략이 가능
// 정리하면, 맴버함수를 객체를 통해서 호출하면 해당 객체의 주소가 this 포인터로 전달된다.
}
//해당 SerInt 를 c 스타일로 할 경우
void SetIntWithC(My_class* _this, int i)
{
_this -> m_i = i;
}
// 3. 대입연산자 ( class 내에서 자동으로 만들어짐)
My_class& operator = ( const My_class& _Other) // 여기에서 ' operator = ' 이 뜻하는 것은 ' 해당 클라스 쪽에
// 대입연산자가 발생 했을 때 호출되는 함수 '라는 뜻
{
m_i = _Other.m_i;
m_f = _Other.m_f;
return *this;
}
// 예를 들어 main 함수에 My_calss 형태의 객체 c2 와 c3가 있다고 할 때
// c2 = c3 에서
// 위의 대입연산자의 this 는 c2(의 주소값)가 되는 것이고 대입연산자 첫 번째 인자 에는 c3(의 주소값)가 되는것
// _Other 는 c3 객체를 참조 받아 온 것
// 즉 m_i는 ㅊ2, _Other.m_i는 c3가 되는 것
// 이때 대입연산이기에 c3는 값이 변형될 일이 없다 고로 인자에 const를 취하는 것
// 연산은 한번에 여러 연산이 순차적으로 이루어 질 수 있기 때문에 (ex. c1 = c2 = c3 ) 연산에 리턴값을 주어야 한다.
// 대입연산자를 호출시킬 그 객체 본인을 그대로 참조해서 그 원본 자체를 리턴한다.
// 연산자 오버로딩 // 사용자 정의 객체 끼리의 대입을 제외한 연산은 마찬가지로 사용자가 그 연산의 행위에 대하여 정의를 해주어야 한다.
// 4. 생성자와 소멸자
// 생성자 및 소멸자는 따로 정의하지 않으면 컴파일러가 기본적으로 만든다 기능은 하지 않고 구색만 갖춘것
// 이렇게 자동 생성된 생성자 및 소멸자를 디폴트(기본)생성자와 디폴트(기본)소멸자 라고 한다.
// 생성자는 객체가 호출될 때, 소멸자는 객체가 중지될 때 실행한다.
public:
My_class() // 생성자는 클래스 명과 이름이 같고 반환값이 없다
: m_i(100)
, m_f(0.f) // 객체가 만들어 짐과 동시에 값이 주어짐 (이니셜 라이즈(초기화문법))
{
m_i = 100; // 객체를 만들고 생성자 함수에 값을 입력함
}
~My_class() // 소멸자 : ~(물결푶) 뒤에 해당 클래스 명
{
}
}
* 맴버 함수를 스코프 연산자 등으로 그냥 불러올 수는 없다. 객체를 선언하고 그 객체를 통해서 접근해야 한다.
레퍼런스 변수
// 자료형 * 변수명; 포인터 변수 선언
// *포인터변수; 포인터로 주소 역참조
// &변수; 변수의 주소값
// 자료형 & 변수명; 레퍼런스 변수 선언
int a = 100;
int* const p = &a; // 포인터 변수 p가 상수화 되어 다른 주소값을 p 에 대입하지 못한다.
*p = 100;
int& iRef = a; // 래퍼런스 변수로 선언하게 되면 iRef로 접근할 경우 그 본래의 값에만 영향이 간다. (iRef와 a 를 동일시)
iRef = 100; // 레퍼런스는 본래 값을 수정할 때 역참조의 과정이 필요 없다.
const int* const p = &a;
는
const int& iRef = a;
와 같다.
'assortrock' 카테고리의 다른 글
구조체를 이용하여 배열 구현 (0) | 2022.06.07 |
---|---|
c++ 10일차 1부 (0) | 2022.05.21 |
c++ 8,9일차 (0) | 2022.05.19 |
c++7일차 (0) | 2022.05.19 |
c++ 6일차 (0) | 2022.05.18 |