객체 포인터 부분.
중요한 부분이라 가독성을 위해, 따로 포스팅하게 되었습니다.
->
멤버Circle donut;
double d = donut.getArea();
Circle* p; // 객체에 대한 포인터 선언
p = &donut; // 포인터에 객체 주소 저장
d = p -> getArea(); // 멤버함수 호출
예제 4-1, 객체 포인터 선언 및 활용
#include <iostream>
using namespace std;
class Circle
{
private:
int radius; // 원의 반지름을 저장하는 변수
public:
// 매개변수가 없는 디폴트 생성자
Circle(){
radius= 1; // 반지름 변수를 1로 초기화
}
// int형 매개변수를 받는 생성자
Circle(int r){
radius = r; // 매개변수로 받은 값을 반지름 변수에 할당
}
// 원의 넓이를 계산하여 반환하는 함수
double getArea();
~Circle();
};
Circle::Circle(){
}
double Circle::getArea(){
return 3.14*radius*radius;
}
Circle::~Circle()
{
}
int main(){
Circle donut;
Circle pizza(30);
// 객체 이름으로 멤버 접근
cout << donut.getArea() << endl;
// 객체 포인터로 멤버 접근
Circle *p;
p = &donut;
cout << p ->getArea() << endl; // 도넛의 getArea 호출
cout << (*p).getArea() << endl; // 도넛의 getArea 호출
p = &pizza;
cout << p -> getArea() << endl;
cout << (*p).getArea() << endl;
return 0;
}
int n[3];
// 정수형 배열 선언Circle c[3];
// Circle 타입의 배열 선언 c[0]
의 생성자, c[1]
의 생성자, c[2]
의 생성자 실행Circle circle Array[3](5)
; // 오류예제 4-2
#include <iostream>
using namespace std;
class Circle
{
private:
int radius;
public:
Circle(){
radius =1;
}
Circle(int r){
radius=r;
}
void setRadius(int r){
radius = r;
}
double getArea();
~Circle();
};
Circle::Circle()
{
}
double Circle::getArea(){
return 3.14*radius*radius;
}
Circle::~Circle()
{
}
int main(){
Cricle circleArray[3]; // Circle 객체 배열 생성
//배열의 각 원소 객체의 멤버 접근
circleArray[0].setRadius(10);
circleArray[1].setRadius(20);
circleArray[2].setRadius(30);
for (int i = 0; i < 3; i++){
cout << "Circle"<< i << "의 면적은 " << circleArray[i].getArea()<<endl;
}
Circle *p;
p=circleArray;
for (int i = 0; i < 3; i++){
cout << "Circle" << i <<"의 면적은" << p->getArea() << endl;
p++;
}
}#include <iostream>
using namespace std;
class Circle
{
private:
int radius;
public:
Circle(){
radius =1;
}
Circle(int r){
radius =r;
}
void setRadius(int r){
radius = r;
}
double getArea();
~Circle();
};
Circle::Circle(/* args */)
{
}
double Circle::getArea(){
return 3.14 * radius * radius;
}
Circle::~Circle()
{
}
int main(){
Circle circleArray[3] ={
Circle(10), Circle(20), Circle()
};
for (int i = 0; i < 3; i++)
{
cout << "Circle"<<i<<"의 면적은" << circleArray[i].getArea() << endl;
}
return 0;
}
Circle circleArray[3] = { Circle(10), Circle(20), Circle()};
circleArray[0]
객체가 생성될 때, 생성자 circle(10) 호출circleArray[1]
객체가 생성될 때, 생성자 circle(20) 호출circleArray[2]
객체가 생성될 때, 생성자 circle() 호출예제 4-3 객체 배열 초기화
#include <iostream>
using namespace std;
class Circle
{
private:
int radius;
public:
Circle(){
radius =1;
}
Circle(int r){
radius =r;
}
void setRadius(int r){
radius = r;
}
double getArea();
~Circle();
};
Circle::Circle(/* args */)
{
}
double Circle::getArea(){
return 3.14 * radius * radius;
}
Circle::~Circle()
{
}
int main(){
Circle circleArray[3] ={
Circle(10), Circle(20), Circle()
};
for (int i = 0; i < 3; i++)
{
cout << "Circle"<<i<<"의 면적은" << circleArray[i].getArea() << endl;
}
return 0;
}
malloc() / free()
라이브러리 함수 사용new
연산자C++의 기본 연산자
new / delete
연산자의 사용 형식
데이터타입* 포인터 변수 = new 데이터타입;
delete 포인터변수;
new / delete
의 사용
int* pInt = new int; // int 타입의 메모리 동적 할당
char* pChar = new char; // char 타입의 메모리 동적 할당
Circle *pCircle = new Circle(); // Circle클래스 타입의 메모리 동적 할당
delete pInt; // 할당 받은 정수 공간 반환
delete pChar; // 할당 받은 문자 공간 반환
delete pCircle; // 할당 받은 객체 공간 반환
예제 4-5, 정수형 공간의 동적 할당 및 반환 예
#include <iostream>
using namespace std;
int main(){
int* p;
p = new int; // int 타입 1개 할당함
if(!p){ // p가 NULL이면, 메모리 할당 실패함.
cout << "메모리를 할당할 수 없습니다."
return 0;
}
*p=5;
int n=*p;
cout << "*p=" << *p <<'\n';
cout << "n=" << n <<'\n';
// 할당받은 메모리 반환
delete p;
}
1) 동적으로 할당 받지 않는 메모리 반환 - 오류
int n;
int* p = &n;
delete p; // 실행시간 오류
// 포인터 p가 가리키는 메모리는 동적으로 할당 받은 것이 아님
2) 동일한 메모리 두 번 반환 - 오류
int* p =new int;
delete p;
delete p;
new / delete 연산자 사용 형식
데이터타입 *포인터변수 = new 데이터타입[배열의크기];
// 동적 배열 할당
delete [] 포인터변수;
// 배열 반환
#include <iostream>
using namespace std;
int main() {
cout << "입력할 정수의 개수는?";
int n;
cin >> n; // 정수의 개수 입력
if(n <= 0) return 0;
int *p = new int[n]; // n 개의 정수 배열 동적 할당
if(!p) {
cout << "메모리를 할당할 수 없습니다.";
return 0;
}
for(int i=0; i<n; i++) {
cout << i+1 << "번째 정수: "; // 프롬프트 출력
cin >> p[i]; // 키보드로부터 정수 입력
}
int sum = 0;
for(int i=0; i<n; i++)
sum += p[i];
cout << "평균 = " << sum/n << endl;
delete [] p; // 배열 메모리 반환
}
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle();
Circle(int r);
~Circle();
void setRadius(int r) { radius = r; }
double getArea() { return 3.14*radius*radius; }
};
Circle::Circle() {
radius = 1;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::~Circle() {
cout << "소멸자 실행 radius = " << radius << endl;
}
int main() {
Circle *p, *q;
p = new Circle;
q = new Circle(30);
cout << p->getArea() << endl << q->getArea() << endl;
delete p;
delete q; // 생성한 순서에 관계 없이 원하는 순서대로 delete 할 수 있음
}
참고로, 반환(delete)는 생성한 순서에 관계 없이 원하는 순서대로 delete 할 수 있음.
new / delete 연산자 사용 형식
클래스이름 *포인터변수 = new 클래스이름[배열의크기];
delete [] 포인터변수;
// 포인터변수가 가리키는 객체 배열을 반환
class Circle{
int radius;
public:
Circle(){
this -> radius=1;
}
Circle(int radius){
this -> radius = radius;
}
void setRadius(int radius){
this -> radius = radius;
}
...
};
<string>
헤더 파일에 선언되어있음.#include <string>
해서 쓰면 됨 !!string str = "I love "; // str은 'I', ' ', 'l', 'o', 'v', 'e', ' '의 7개 문자로 구성
str.append("C++."); // str은 "I love C++."이 된다. 11개의 문자
new / delete
를 이용하여 문자열을 동적 생성/반환
가능#include <iostream>
#include <string> // string 클래스를 사용하기 위해선 반드시 필요합니다.
using namespace std;
int main() {
// 스트링 생성
string str; // 빈 문자열을 가진 스트링 객체 생성
string address("서울시 성북구 삼선동 389");
string copyAddress(address); // address의 문자열을 복사한 스트링 객체 생성
char text[] = {'L', 'o', 'v', 'e', ' ', 'C', '+', '+', '\0'}; // C-스트링
string title(text); // "Love C++" 문자열을 가진 스트링 객체 생성
// 스트링 출력
cout << str << endl; // 빈 스트링. 아무 값도 출력되지 않음
cout << address << endl;
cout << copyAddress << endl;
cout << title << endl;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string names[5]; // 문자열 배열 선언
for(int i=0; i<5; i++) {
cout << "이름 >> ";
getline(cin, names[i], '\n');
}
string latter = names[0];
for(int i=1; i<5; i++) {
if(latter < names[i]) { // 사전 순으로 latter 문자열이 앞에 온다면
latter = names[i]; // latter 문자열 변경
}
}
cout << "사전에서 가장 뒤에 나오는 문자열은 " << latter << endl;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cout << "문자열을 입력하세요(한글 안됨) " << endl;
getline(cin, s, '\n'); // 문자열 입력
int len = s.length(); // 문자열의 길이
for(int i=0; i<len; i++) {
string first = s.substr(0,1); // 맨 앞의 문자 1개를 문자열로 분리
string sub = s.substr(1, len-1); // 나머지 문자들을 문자열로 분리
s = sub + first; // 두 문자열을 연결하여 새로운 문자열로 만듦
cout << s << endl;
}
}
&가 입력될 때까지 여러 줄의 영문 문자열을 입력 받고, 찾는 문자열과 대치할 문자열을 각각 입력 받아 문자열을 변경하기