13. Constructor
13 Sep 2019 | C++
Copy Constructor
Main.cpp
#include <iostream>
#include "test.h"
using namespace std;
/* COPY CONSTRUCTOR */
int main()
{
int a = 10;
int b = a;
a = 60;
cout << "a : " << a << endl; //60
cout << "b : " << b << endl; //10
Test obj1(50, 100, 60);
Test obj2 = obj1;
obj2.x = 200;
*(obj1.p) = 700;
cout << "obj1.x " << obj1.x << endl;
cout << "*(obj1.p) " << *(obj1.p) << endl;
cout << "obj1.y " << obj1.y << endl << endl;
cout << "obj2.x " << obj2.x << endl;
cout << "*(obj2.p)" << *(obj2.p) << endl;
cout << "obj2.y " << obj2.y << endl;
return 0;
}
test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
class Test
{
public:
int x; //50
int y; //100
int *p; //60
Test(const Test &); //copy
Test(int, int, int);
~Test();
};
#endif // TEST_H_INCLUDED
test.cpp
#include "test.h"
Test::Test(int x, int y, int value)
{
this->x = x;
this->y = y;
this->p = new int(value); // because of in head file p is the *pointer
}
Test::~Test()
{
delete p;
}
Test::Test(const Test & obj) //copy
{
this->p = new int(*(obj.p)); //because of in head file p is the *pointer
this->x = obj.x;
this->y = obj.y;
}
(CONSTRUCTOR)[http://tcpschool.com/cpp/cpp_struct_intro]
- 구조체(structure type)란 사용자가 C++의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입입니다.
- 배열이 같은 타입의 변수 집합이라고 한다면, 구조체는 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것입니다. 이때 구조체를 구성하는 변수를 구조체의 멤버(member) 또는 멤버 변수(member variable) 라고 합니다.
- C++의 구조체는 변수뿐만 아니라 함수까지도 멤버 변수로 가질 수 있습니다
- 또한, C++의 구조체는 타입일 뿐만 아니라, 객체 지향 프로그래밍의 핵심이 되는 클래스(class)의 기초가 됩니다
- 코드와 함께 설명하겠습니다.
struct 구조체이름
{
멤버변수1의타입 멤버변수1의이름;
멤버변수2의타입 멤버변수2의이름;
...
};
Exercise
#include <iostream>
using namespace std;
/* DATA STRUCTURES */
struct personalData
{
string name;
string surname;
string telephoneNumber;
short age;
}a,b;
void test(personalData *);
int main()
{
personalData person[5];
a.age =50;
// cout << a.age << endl;
person[0].name = "Arkadiusz";
person[1].name = "Wiola";
person[0].surname = "Wlodarczyk";
person[0].telephoneNumber = "606102340";
person[0].age = 22;
/*
cout << person[0].name << endl;
cout << person[0].surname << endl;
cout << person[0].telephoneNumber << endl;
cout << person[0].age << endl;
*/
/*
cout << (*person).name << endl;
cout << (*&person[0]).name << endl;
cout << (person+1)->name << endl;
*/
personalData *p = person;
personalData *p = person+1; // it is methods to select second array
cout << p->name << endl;
test(p); // test(person);
cout << p->name << endl;
return 0;
}
void test(personalData *person)
{
person->name = "Agnes";
}
(friend class)[https://yeolco.tistory.com/116]
- firend 클래스는 friend로 선언된 다른 클래스의 private 및 protected 멤버에 접근할 수 있습니다.
- 특정 상황에서 클래스 내에 접근하지 못하도록 private 제한을 두었는데, 필요의 경우 해당 클래스나 함수에서 접근 가능하도록 사용하는것이 friend 클래스 및 함수입니다.
예제
#include <iostream>
#include <string>
using namespace std;
class Friend1 {
private :
string name;
friend class Friend2;
};
class Friend2{
public :
void set_name(Friend1& f, string s) {
f.name = s;
}
void show_name(Friend1& f) {
cout << f.name << "\n";
}
};
int main(void) {
Friend1 f1;
Friend2 f2;
f2.set_name(f1, "열코");
f2.show_name(f1);
return 0;
}
Friend Class Exercise
main.cpp
#include <iostream>
#include "position.h"
using namespace std;
void setX(Position &, int);
int main()
{
Position dog(10, 50);
dog.getPosition();
setX(dog, 1500);
dog.getPosition();
const Position house(100, 200);
house.getPosition();
// house.setPosition(444, 444);
//house.getPosition();
return 0;
}
void setX(Position & obj, int value)
{
//Position &obj = dog;
obj.x = value;
}
position.h
#ifndef POSITION_H_INCLUDED
#define POSITION_H_INCLUDED
class Position
{
int x, y;
public:
Position(int,int);
~Position();
void getPosition() const;
void setPosition(Position &, int, int); // class 를 받고 인자를 받는다.
friend void setX(Position &, int);
};
#endif // POSITION_H_INCLUDED
position.cpp
#include "position.h"
#include <iostream>
using namespace std;
Position::Position(int x, int y)
{
this->x = x;
this->y = y;
}
Position::~Position()
{
}
void Position::getPosition() const
{
cout << "x : " << x << endl;
cout << "y : " << y << endl;
}
void Position::setPosition(Position & obj, int x, int y)
{
obj.x = x; // 클래스 안에 변수들을 불러와 바꾼다.
obj.y = y;
}
Copy Constructor
Main.cpp
#include <iostream>
#include "test.h"
using namespace std;
/* COPY CONSTRUCTOR */
int main()
{
int a = 10;
int b = a;
a = 60;
cout << "a : " << a << endl; //60
cout << "b : " << b << endl; //10
Test obj1(50, 100, 60);
Test obj2 = obj1;
obj2.x = 200;
*(obj1.p) = 700;
cout << "obj1.x " << obj1.x << endl;
cout << "*(obj1.p) " << *(obj1.p) << endl;
cout << "obj1.y " << obj1.y << endl << endl;
cout << "obj2.x " << obj2.x << endl;
cout << "*(obj2.p)" << *(obj2.p) << endl;
cout << "obj2.y " << obj2.y << endl;
return 0;
}
test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
class Test
{
public:
int x; //50
int y; //100
int *p; //60
Test(const Test &); //copy
Test(int, int, int);
~Test();
};
#endif // TEST_H_INCLUDED
test.cpp
#include "test.h"
Test::Test(int x, int y, int value)
{
this->x = x;
this->y = y;
this->p = new int(value); // because of in head file p is the *pointer
}
Test::~Test()
{
delete p;
}
Test::Test(const Test & obj) //copy
{
this->p = new int(*(obj.p)); //because of in head file p is the *pointer
this->x = obj.x;
this->y = obj.y;
}
(CONSTRUCTOR)[http://tcpschool.com/cpp/cpp_struct_intro]
- 구조체(structure type)란 사용자가 C++의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입입니다.
- 배열이 같은 타입의 변수 집합이라고 한다면, 구조체는 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것입니다. 이때 구조체를 구성하는 변수를 구조체의 멤버(member) 또는 멤버 변수(member variable) 라고 합니다.
- C++의 구조체는 변수뿐만 아니라 함수까지도 멤버 변수로 가질 수 있습니다
- 또한, C++의 구조체는 타입일 뿐만 아니라, 객체 지향 프로그래밍의 핵심이 되는 클래스(class)의 기초가 됩니다
- 코드와 함께 설명하겠습니다.
struct 구조체이름
{
멤버변수1의타입 멤버변수1의이름;
멤버변수2의타입 멤버변수2의이름;
...
};
Exercise
#include <iostream>
using namespace std;
/* DATA STRUCTURES */
struct personalData
{
string name;
string surname;
string telephoneNumber;
short age;
}a,b;
void test(personalData *);
int main()
{
personalData person[5];
a.age =50;
// cout << a.age << endl;
person[0].name = "Arkadiusz";
person[1].name = "Wiola";
person[0].surname = "Wlodarczyk";
person[0].telephoneNumber = "606102340";
person[0].age = 22;
/*
cout << person[0].name << endl;
cout << person[0].surname << endl;
cout << person[0].telephoneNumber << endl;
cout << person[0].age << endl;
*/
/*
cout << (*person).name << endl;
cout << (*&person[0]).name << endl;
cout << (person+1)->name << endl;
*/
personalData *p = person;
personalData *p = person+1; // it is methods to select second array
cout << p->name << endl;
test(p); // test(person);
cout << p->name << endl;
return 0;
}
void test(personalData *person)
{
person->name = "Agnes";
}
(friend class)[https://yeolco.tistory.com/116]
- firend 클래스는 friend로 선언된 다른 클래스의 private 및 protected 멤버에 접근할 수 있습니다.
- 특정 상황에서 클래스 내에 접근하지 못하도록 private 제한을 두었는데, 필요의 경우 해당 클래스나 함수에서 접근 가능하도록 사용하는것이 friend 클래스 및 함수입니다.
예제
#include <iostream>
#include <string>
using namespace std;
class Friend1 {
private :
string name;
friend class Friend2;
};
class Friend2{
public :
void set_name(Friend1& f, string s) {
f.name = s;
}
void show_name(Friend1& f) {
cout << f.name << "\n";
}
};
int main(void) {
Friend1 f1;
Friend2 f2;
f2.set_name(f1, "열코");
f2.show_name(f1);
return 0;
}
Friend Class Exercise
main.cpp
#include <iostream>
#include "position.h"
using namespace std;
void setX(Position &, int);
int main()
{
Position dog(10, 50);
dog.getPosition();
setX(dog, 1500);
dog.getPosition();
const Position house(100, 200);
house.getPosition();
// house.setPosition(444, 444);
//house.getPosition();
return 0;
}
void setX(Position & obj, int value)
{
//Position &obj = dog;
obj.x = value;
}
position.h
#ifndef POSITION_H_INCLUDED
#define POSITION_H_INCLUDED
class Position
{
int x, y;
public:
Position(int,int);
~Position();
void getPosition() const;
void setPosition(Position &, int, int); // class 를 받고 인자를 받는다.
friend void setX(Position &, int);
};
#endif // POSITION_H_INCLUDED
position.cpp
#include "position.h"
#include <iostream>
using namespace std;
Position::Position(int x, int y)
{
this->x = x;
this->y = y;
}
Position::~Position()
{
}
void Position::getPosition() const
{
cout << "x : " << x << endl;
cout << "y : " << y << endl;
}
void Position::setPosition(Position & obj, int x, int y)
{
obj.x = x; // 클래스 안에 변수들을 불러와 바꾼다.
obj.y = y;
}
Comments