멤버 함수
멤버 함수에 대한 포인터
기존에 멤버가 아닌 함수에 대한 포인터를 만들던 방식으로는 멤버 함수를 가리킬 수 없다. 멤버 함수에 대한 포인터를 만드는 문법은 조금 다르다.
main.cpp
멤버 함수의 오버로딩
멤버 함수에서도 오버로딩이 가능하다. 시그니처만 다르게 하면 얼마든지 오버로딩 할 수 있다.
Point.h
Point.cpp
main.cpp
객체의 배열
클래스도 타입의 한 종류기 때문에 배열을 만들 수 있다. 구조체의 배열과 큰 차이점은 없지만 생성자와 관련된 문제를 생각해보아야 한다.
main.cpp
// 객체의 배열을 선언 하면 각 객체들은 디폴트 생성자로 초기화 된다.
main.cpp
// 따로 생성자를 지정해서 초기화 할 수 있다.
객체의 동적인 생성
객체를 동적으로 생성할 때도 new 연산자를 사용한다. 객체의 경우에는 생성자의 호출이라는 문제가 있기 때문에 기존에 new 연산자를 사용하던 방법하고는 조금 다르다.
겍체를 동적 할당 할 때 생성자는 new 연산자를 사용해서 동적으로 객체를 생성할 때 호출된다. 마찬가지로 소멸자는 delete 연산자를 사용해서 해제할 때 호출된다
main.cpp
// 정적 멤버 함수를 사용한 객체의 생성
PMC(Power Management Controller)
ARM 프로세서에서는 사용할 모듈에 각각 전력을 공급을 해주어야 한다. 이를 설정하는 레지스터로 PMC_PCER, PMC_PCDR, PMC_PCSR 등이 있다.
PMC_PCER : 각 비트를 Enable 하는데 사용한다.
PMC_PCDR : 각 비트를 Disable 하는데 사용한다.
PMC_PCSR : 각 비트의 상태를 확인한다.
PIO(Parallel Input/Output Controller)
핀의 입출력을 제어하는 레지스터로 PIO_PER, PIO_PDR, PIO_PSR // PIO_OER, PIO_ODR, PIO_OSR // PIO_SODR, PIO_CODR, PIO_ODSR을 알아본다.
PIO_PER, PIO_PDR, PIO_PSR : 병렬 입출력 관련 설정
PIO_OER, PIO_ODR, PIO_OSR : 출력 관련 설정
PIO_SODR, PIO_CODR, PIO_ODSR : 출력 데이터 설정
* AMR 프로세서에는 레지스터를 Set, Clear 시키는 레지스터가 각기 따로 존재 한다.
PIO_PER : 병력 입출력 허용
PIO_PDR : 병렬 입출력 금지
PIO_PSR : 병력 입출력 상태
PIO_OER : 출력 허용
PIO_ODR : 출력 금지
PIO_OSR : 출력 상태
PIO_SODR : 출력 데이터 허용
PIO_CODR : 출력 데이터 금지
PIO_ODSR : 출력 데이터 상태
멤버 함수에 대한 포인터
기존에 멤버가 아닌 함수에 대한 포인터를 만들던 방식으로는 멤버 함수를 가리킬 수 없다. 멤버 함수에 대한 포인터를 만드는 문법은 조금 다르다.
typedef void (*fp)(int) // 일반 함수에 대한 포인터
typedef void (Point::*fp)(int) // 멤버 함수에 대한 포인터는 범위 지정자를 이용하여 어느 클래스의 멤버인지 지정 해야 한다.
* 정적 멤버 함수에 대한 포인터 : 정적 멤버 함수의 경우에는 멤버가 아닌 함수에 대한 포인터를 그대로 사용하면 된다.typedef void (Point::*fp)(int) // 멤버 함수에 대한 포인터는 범위 지정자를 이용하여 어느 클래스의 멤버인지 지정 해야 한다.
main.cpp
#include "Point.h"
// void XX() 형태의 함수에 대한 포인터
typedef void (*FP1)(int);
// void Point::XX() 형
태의 멤버 함수에 대한 포인터
typedef void (Point::*FP2)(int);
int main()
{
// 객체 생성
Point pt(50, 50);
// FP1 fp1 = &Point::SetX;
FP2 fp2 = &Point::SetX;
// 함수 포인터를 사용해서 함수 호출
(pt.*fp2)(100);
// 내용 출력
pt.Print();
return 0;
}
멤버 함수의 오버로딩
멤버 함수에서도 오버로딩이 가능하다. 시그니처만 다르게 하면 얼마든지 오버로딩 할 수 있다.
Point.h
#ifndef POINT_H
#define POINT_H
// Point 클래수를 정의한다
class Point
{
public:
// 멤버 함수
void Print();
void Offset(int x_delta, int y_delta);
void Offset(const Point& pt);
// 생성자들
Point();
Point(int initialX, int initialY);
Point(const Point& pt);
// 접근자
void SetX(int value);
void SetY(int value);
int GetX() const
{
return x;
}
int GetY() const
{
return y;
}
private:
// 멤버 변수
int x, y;
};
#endif
Point.cpp
#include "Point.h"
#include <iostream>
using namespace std;
void Point::SetX(int value)
{
if(value < 0)
{
x = 0;
}
else if(value > 100)
{
x = 100;
}
else
{
x = value;
}
}
void Point::SetY(int value)
{
if(value < 0)
{
y = 0;
}
else if(value > 100)
{
y = 100;
}
else
{
y = value;
}
}
void Point::Offset(int x_delta, int y_delta)
{
SetX(x + x_delta);
SetY(y + y_delta);
}
void Point::Offset(const Point& pt)
{
Offset(pt.x, pt.y);
}
Point::Point(const Point& pt)
{
x = pt.x;
y = pt.y;
}
Point::Point(int initialX, int initialY)
{
SetX(initialX);
SetY(initialY);
}
Point::Point()
{
x = 0;
y = 0;
}
void Point::Print()
{
cout << "(" << x << ", " << y << ")\n";
}
main.cpp
#include "Point.h"
int main()
{
// 객체를 생성
Point pt(50, 50);
Point delta(100, 100);
// 점을 x축으로 10, y축으로 -10만큼 이동시킨다.
pt.Offset(10, -10);
// 현재 점의 위치 출력
pt.Print();
// 점을 범위 밖으로 이동시킨다.
pt.Offset(delta);
// 현재 점의 위치 출력
pt.Print();
return 0;
}
객체의 배열
클래스도 타입의 한 종류기 때문에 배열을 만들 수 있다. 구조체의 배열과 큰 차이점은 없지만 생성자와 관련된 문제를 생각해보아야 한다.
main.cpp
#include "Point.h"
int main()
{
Point arr[3];
for(int i = 0 ; i < 3 ; ++i)
arr[i].Print();
return 0;
}
// 객체의 배열을 선언 하면 각 객체들은 디폴트 생성자로 초기화 된다.
main.cpp
#include "Point.h"
int main()
{
Point arr[3] = {
Point(100, 100), Point(50, 100), Point(10, 10)
};
for(int i = 0 ; i < 3 ; ++i)
arr[i].Print();
return 0;
}
// 따로 생성자를 지정해서 초기화 할 수 있다.
객체의 동적인 생성
객체를 동적으로 생성할 때도 new 연산자를 사용한다. 객체의 경우에는 생성자의 호출이라는 문제가 있기 때문에 기존에 new 연산자를 사용하던 방법하고는 조금 다르다.
겍체를 동적 할당 할 때 생성자는 new 연산자를 사용해서 동적으로 객체를 생성할 때 호출된다. 마찬가지로 소멸자는 delete 연산자를 사용해서 해제할 때 호출된다
main.cpp
#include "Point.h"
int main()
{
// 초기화용으로 객체를 만든다.
Point pt(50, 50);
// 동적으로 객체를 생성한다.
Point *p1 = new Point();
Point *p2 = new Point(100, 100);
Point *p3 = new Point(pt);
// 객체들의 내용을 출력한다.
p1->Print();
p2->Print();
p3->Print();
// 동
적으로 생성한 객체들을 정리한다.
delete p1;
delete p2;
delete p3;
p1 = p2 = p3 = 0;
return 0;
}
// 정적 멤버 함수를 사용한 객체의 생성
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
string name; // 이름
int sNo; // 학번
void Print();
private:
// 생
성자
Student(const string& name_arg, int stdNumber);
public:
// 정
적 멤버
static int studentNumber;
static Student* CreateStudent(const string& name_arg);
};
int Student::studentNumber = 0;
Student* Student::CreateStudent(const string& name_arg)
{
// 학생 객체를 생성한다
Student *p = new Student(name_arg, studentNumber++);
// 새로 생성된 학생 객체 반환
return p;
}
Student::Student(const string& name_arg, int stdNumber)
{
name = name_arg;
sNo = stdNumber;
}
void Student::Print()
{
cout << "{Name = " << name << ", std. Num. = " << sNo << "}\n";
}
int main()
{
// 학생 객체를 세 개 생성한다.
Student *p1, *p2, *p3;
p1 = Student::CreateStudent("
이계희");
p2 = Student::CreateStudent("이춘훈");
p3 = Student::CreateStudent("윤수연");
// 생성
된 학생의 정보를 출력
p1->Print();
p2->Print();
p3->Print();
// 생성된 객체 해제
delete p1;
delete p2;
delete p3;
p1 = p2 = p3 = 0;
return 0;
}
PMC(Power Management Controller)
ARM 프로세서에서는 사용할 모듈에 각각 전력을 공급을 해주어야 한다. 이를 설정하는 레지스터로 PMC_PCER, PMC_PCDR, PMC_PCSR 등이 있다.
PMC_PCER : 각 비트를 Enable 하는데 사용한다.
PMC_PCDR : 각 비트를 Disable 하는데 사용한다.
PMC_PCSR : 각 비트의 상태를 확인한다.
PIO(Parallel Input/Output Controller)
핀의 입출력을 제어하는 레지스터로 PIO_PER, PIO_PDR, PIO_PSR // PIO_OER, PIO_ODR, PIO_OSR // PIO_SODR, PIO_CODR, PIO_ODSR을 알아본다.
PIO_PER, PIO_PDR, PIO_PSR : 병렬 입출력 관련 설정
PIO_OER, PIO_ODR, PIO_OSR : 출력 관련 설정
PIO_SODR, PIO_CODR, PIO_ODSR : 출력 데이터 설정
* AMR 프로세서에는 레지스터를 Set, Clear 시키는 레지스터가 각기 따로 존재 한다.
PIO_PER : 병력 입출력 허용
PIO_PDR : 병렬 입출력 금지
PIO_PSR : 병력 입출력 상태
PIO_OER : 출력 허용
PIO_ODR : 출력 금지
PIO_OSR : 출력 상태
PIO_SODR : 출력 데이터 허용
PIO_CODR : 출력 데이터 금지
PIO_ODSR : 출력 데이터 상태