c++/3주차

[c++][7강] 클래스 기초

아너 2022. 1. 26. 23:59

1. c++에서의 구조체 변수 선언

c언어                                  c++

struct Car basicCar;       =>     Car basicCar;                         // c++에서는 struct 키워드 생략 가능

 

2. 구조체 속 함수와 기호상수(enum)

//구조체 안에 함수 삽입가능
struct Car
{
 	enum	//열거체(#define ID_LEN 20 과 같은 역할)
    	{
    	ID_LEN	=20,	//타입이 없을 시 정수형	
        MAX_SPD	=200,
        FUEL_STEP	=2,
        ACC_STEP	=10
    	};
char userID[ID_LEN];
int fuel;
 int speed;
    
   
    void showCarState(){...}	//구조체 안에 함수 삽입 가능 *인자 전달이 필요없다는 것이 유용
    void Accel(){...}
    void Break(){...}
    
    
}

2-1 외부로 빼낸 함수

-구조체 안 함수가 너무 길어질 경우 밖으로 뺄 수도 있음.

단 void Car::ShowCarState(){...} Car::을 통해 Car에 속해있다는 것을 정의 해줘야 함.

구조체 안에는 void showCarstate();로 어떤 함수가 있는지만 명시(프로토 타입만 정의)

3. 클래스와 구조체의 차이점

-타입만 다름 struct car{};가 class car{};로

-클래스는 기본 제한자가 private임.

public 어디서든 접근 가능
protected 상속, 유도 클래스에서의 접근 가능
private 클래스 내(에 정의된 함수)에서만 접근 가능
class Car
{
private:	//이 밑으로는 다 private
	char gamerID[CAR_CONST::ID_LEN];	//멤버 변수
	int fuel;
	int carSpeed;
public:	//이 밑으로는 다 public
	void InitMevers(char ID, int fuel);	//멤버 함수
	void Accel();

}

4. c++에서의 파일 분할

-클래스의 선언은 일반적으로 헤더파일에 삽입해야함. 

-인라인 함수(클래스 안에 정의된 함수)는 헤더파일에 함께 정의 되어야함.

-ex)Car.h Car.cpp

 

 

 

<lab실습>

lab1)lamp 밝기 조절

 

Lamp.h

#pragma once
class Lamp {
private:
	bool m_isOn;
	int  m_illuminance;
public:
	void powerOnOff();
	void changeLight();
	void showStatus();
	void init();
};

Lamp.cpp

#include <iostream>
#include "Lamp.h"	//""은 현재 디렉토리에서 불러옴(사용자정의 헤더파일)
using namespace std;

void Lamp::powerOnOff() {
	m_isOn = !m_isOn;
}
void Lamp:: init() {
	m_isOn = false;
	m_illuminance = 1;
}
void Lamp::changeLight() {
	if (m_isOn) {
		if (m_illuminance < 3)
			m_illuminance++;
		else
			m_illuminance = 1;
	}
}
void Lamp::showStatus() {
	if (m_isOn)
		cout << "밝기 : " << m_illuminance<< "\n";
}

Lamp_Test.cpp

#include "Lamp.h"
#include <iostream>

int main() {
	Lamp lamp1;
	lamp1.init();
	lamp1.powerOnOff();
	lamp1.changeLight();
	lamp1.changeLight();
	lamp1.changeLight();
	lamp1.changeLight();
	lamp1.showStatus();
	return 0;
}

lab2) 사용자로부터 lamp 조종

lamp.cpp와 lamp.h는 lab1과 동일

 

user.h

#pragma once
#include <string>
#include "Lamp.h"

using namespace std;

class User {
private:
	string m_name;
public:
	void turnOnOff(Lamp& lamp);	//lamp레퍼런스 변수
	void changeLight(Lamp& lamp);
	void init();
};

user.cpp

#include "User.h"

void User::turnOnOff(Lamp& lamp) {
	lamp.powerOnOff();
}

void User::changeLight(Lamp& lamp) {
	lamp.changeLight();
}
void User::init() {	//user 멤버변수 초기화
	m_name = "No Name";
}

lamp_test.cpp

#include "Lamp.h"
#include "User.h"
#include <iostream>

int main() {
	Lamp lamp1;
	lamp1.init();
	Lamp lamp2;
	lamp2.init();
	Lamp lamp3;
	lamp3.init();
	
	User user1;
	user1.init();
	user1.turnOnOff(lamp2);
	user1.turnOnOff(lamp3);
	user1.changeLight(lamp2);

	cout << "lamp1 상태\n";
	lamp1.showStatus();	//lamp1은 꺼져있어서 상태 출력x
	cout << "lamp2 상태\n";
	lamp2.showStatus();
	cout << "lamp3 상태\n";
	lamp3.showStatus();



	
	return 0;
}

결과화면

※내가 가지고 있는 멤버를 사용할 때는 ' . '을 사용(ex lamp1.m_isOn) 포인터변수로 가리키고 있는 멤버를 사용할 때는 ' ->'사용(ex p_lamp->init())

 

lab3) lamp 동적할당, 포인터변수, 배열

#include "Lamp.h"
#include "User.h"
#include <iostream>

int main() {
	Lamp lamp1;
	lamp1.init();	//내가 가진 lamp이므로 ' . ' 사용

	Lamp* p_lamp = &lamp1;	//lamp1의 주소값을 갖는 포인터 변수
	Lamp* p_lamp2 = new Lamp();	//동적할당
	
	
	p_lamp->init();
	p_lamp->init();
	p_lamp2->powerOnOff();
	p_lamp2->changeLight();


	//배열 만들때
	Lamp lamp3[4];
	lamp3[0].init();


	return 0;
}

lab4) tv+user클래스