2. Essential concept(Parameter passing, structure and function)
01 Jun 2020 | Algorithm
Parameter Passing Methods
int add(int& a, int& b)
{
int c;
c= a+b;
return(c);
}
int main()
{
int x,y,z;
x= 10;
y= 5;
z = add(x,y);
cout<<z;
}
- Main에 생성된 data variable값을 그대로 Reference(즉 address에 있는 값을 공유하여 int a, int b의 어드레스를 x,y어드레스로 한다)
arrays as Parameter
void fun(int A[], int n)
{
int i;
for (i=0; i<n;i++)
cout<<A[i];
}
int main()
{
int A[5] = {2,4,6,8,10};
fun(A,5);
}
- Array an be passed only by address.
- array parameter is working as a pointer which is pointing actual parameter.
- actual parameter is address variable of array in base.
- it can use pointer instead of int A[], like this
void fun(int* A, int n)
{
int i;
for (i=0; i<n;i++)
cout<<A[i];
}
int main()
{
int A[5] = {2,4,6,8,10};
fun(A,5);
}
- explain as above we can test
void fun(int A[], int n)
{
A[0] = 25;
}
int main()
{
int A[5] = {2,4,6,8,10};
fun(A,5);
}
- Value가 교체 된다.
Example
int[] fun(int n) // 리턴 값 데이터 유형이 int array형식
{
int * p;
p = new int[n]
return p;
}
int main()
{
int * A;
A = fun(5);
---
---
}
int* fun(int n) // 리턴 값이 int 데이터 형식의 포인터 리턴
{
int * p;
p = new int[n]
return p;
}
int main()
{
int * A;
A = fun(5);
---
---
}
- Modern C++ 스타일로 이렇게 바꿀수 있다.
int[] fun(int n) // 리턴 값 데이터 유형이 int array형식
{
std::share_ptr<int> p(new int[n]);
return p;
}
int main()
{
std::share_ptr<int> A;
A = fun(5);
---
---
}
int* fun(int n) // 리턴 값이 int 데이터 형식의 포인터 리턴
{
std::share_ptr<int> p(new int[n]);
return p;
}
int main()
{
std::share_ptr<int> A;
A = fun(5);
---
---
}
Structure as Parameter
struct Rectangle
{
int length;
int height;
};
int area(struct Rectangle n)
{
return n.length * n.height;
}
int main()
{
struct Rectangle r = {10,5}
area(r)
}
-
function parameter에 struct Ractangle 데이터 스타일의 n을 새롭게 스택에 생성하여 copy한다.
-
Refernce를 이용하여 새로운 데이터 variable을 생성하지 않고 address를 받아 쓰는 방법을 보자.
struct Rectangle
{
int length;
int height;
};
int area(struct Rectangle& n)
{
return n.length * n.height;
}
int main()
{
struct Rectangle r = {10,5}
area(r)
}
Example
- point터를 이용한 값 바꾸기
struct Rectangle
{
int length;
int height;
};
int changeLength(struct Rectangle* p, int x)
{
p->length = x;
}
int main()
{
struct Rectangle r = {10,5}
changeLength(&r, 20)
}
- Reference를 이용한 값 바꾸기.
struct Rectangle
{
int length;
int height;
};
int changeLength(struct Rectangle& p, int x)
{
p.length = x;
}
int main()
{
struct Rectangle r = {10,5};
changeLength(r, 20);
}
Example 2
void fun(struct Test t1)
{
t1.A[0] = 10
t1.n = 4;
}
struct Test
{
int A[5];
int n;
}
int main()
{
struct Test t = {2,4,6,8,10}, 5;
fun(t);
}
// 여기서도 t의 rvalue에 {}를 더 붙여야 하는데 안됨.. Jekyll..
structure and Functions
struct Rectangle
{
int length;
int height;
};
void initilize(struct Rectangle *r, int l, int b)
{
r->length = l;
r->height = b;
}
int area(struct Rectangle& r)
{
return r.length * r.height;
}
void changeLength(struct Rectangle* r, int l)
{
r->length=l;
}
int main()
{
struct Rectangle r;
initialize(&r,10,5);
area(r);
changeLength(&r,20);
}
Class and Constructor.
- class는 오직 C++에만 있다.
- Struct하고 비슷한 기능이지만 다른점은
- Struct은 기본이 Public 이고
- class는 기본이 Private 이다.
- class에는 public, private, protect 3가지가 있다.
- public은 다른 로컬 펑션이나 매인에서 class를 이용하여 사용할 수 있다.
- private은 오직 해당 Class에서만 사용이 된다. 다른 로컬 펑션이나 메인에서 가져와 쓸 수 없다.
- protected는 파생 클래스의 정의부에서 접근이 가능하지만 외부에서는 접근 불가하다.
- Struct을 아래와 같이 바꿀 수 있다.
class Rectangle
{
public:
Rectangle(int length, int height) : length_(length), height_(height) {}
int area()
{
return length_ * height_;
}
void changeLength(int l)
{
length_=l;
}
private:
int length_;
int height_;
};
int main()
{
Rectangle r(10,5);
int a = r.area();
std::cout<<a<<" "; //50
r.changeLength(20);
a = r.area(); //100
std::cout<<a<<" ";
return 0;
}
Example
#include <iostream>
using namespace std;
class Rectangle
{
public:
Rectangle(int length, int height) : length_(length), height_(height){}
int area();
int perimeter();
int setLength(int k);
int getLength();
~Rectangle();
private:
int length_;
int height_;
};
Rectangle::area()
{
return length_*height_;
}
Rectangle::perimeter()
{
return 2*(length_+height_);
}
Rectangle::setLength(int k)
{
length_=k;
}
Rectangle::getLength()
{
return length_;
}
Rectangle::~Rectangle()
{
}
int main()
{
Rectangle r(10,5);
cout<<r.area()<<" ";
cout<<r.perimeter()<<" ";
r.setLength(20);
cout<<r.getLength()<<" ";
return 0;
}
Template Class
- Data 타입을 컴파일할떄 자동으로 맞춰준다.
- 편하다
- Class던 Data 타입이던 다 자동으로 할 수 있다.
- Template 사용전
class Arithmateic
{
private:
int a_;
int b_;
public:
Arithmateic(int a, int b) : a_(a), b_(b) {}
int add();
int sub();
}
Arithmateic::add()
{
return a_ + b_;
}
Arithmateic::sub(){
return a_ - B_;
}
int main()
{
Arithmatic A(5,1);
A.add();
A.sub();
return 0;
}
- template 사용 후
#include <iostream>
using namespace std;
template <class T> // class안에 있는 data variable의 데이터 타입을 자동으로 맞춘다.
class Arithmateic
{
private:
T a_;
T b_;
public:
Arithmateic(T a, T b) : a_(a), b_(b) {}
T add();
T sub();
};
template <class T>
T Arithmateic<T>::add()
{
return a_ + b_;
}
template <class T>
T Arithmateic<T>::sub(){
return a_ - b_;
}
int main()
{
Arithmateic<int> A(5,1);
A.add();
A.sub();
return 0;
}
Parameter Passing Methods
int add(int& a, int& b)
{
int c;
c= a+b;
return(c);
}
int main()
{
int x,y,z;
x= 10;
y= 5;
z = add(x,y);
cout<<z;
}
- Main에 생성된 data variable값을 그대로 Reference(즉 address에 있는 값을 공유하여 int a, int b의 어드레스를 x,y어드레스로 한다)
arrays as Parameter
void fun(int A[], int n)
{
int i;
for (i=0; i<n;i++)
cout<<A[i];
}
int main()
{
int A[5] = {2,4,6,8,10};
fun(A,5);
}
- Array an be passed only by address.
- array parameter is working as a pointer which is pointing actual parameter.
- actual parameter is address variable of array in base.
- it can use pointer instead of int A[], like this
void fun(int* A, int n)
{
int i;
for (i=0; i<n;i++)
cout<<A[i];
}
int main()
{
int A[5] = {2,4,6,8,10};
fun(A,5);
}
- explain as above we can test
void fun(int A[], int n) { A[0] = 25; } int main() { int A[5] = {2,4,6,8,10}; fun(A,5); }
- Value가 교체 된다.
Example
int[] fun(int n) // 리턴 값 데이터 유형이 int array형식
{
int * p;
p = new int[n]
return p;
}
int main()
{
int * A;
A = fun(5);
---
---
}
int* fun(int n) // 리턴 값이 int 데이터 형식의 포인터 리턴
{
int * p;
p = new int[n]
return p;
}
int main()
{
int * A;
A = fun(5);
---
---
}
- Modern C++ 스타일로 이렇게 바꿀수 있다.
int[] fun(int n) // 리턴 값 데이터 유형이 int array형식 { std::share_ptr<int> p(new int[n]); return p; } int main() { std::share_ptr<int> A; A = fun(5); --- --- }
int* fun(int n) // 리턴 값이 int 데이터 형식의 포인터 리턴
{
std::share_ptr<int> p(new int[n]);
return p;
}
int main()
{
std::share_ptr<int> A;
A = fun(5);
---
---
}
Structure as Parameter
struct Rectangle
{
int length;
int height;
};
int area(struct Rectangle n)
{
return n.length * n.height;
}
int main()
{
struct Rectangle r = {10,5}
area(r)
}
-
function parameter에 struct Ractangle 데이터 스타일의 n을 새롭게 스택에 생성하여 copy한다.
-
Refernce를 이용하여 새로운 데이터 variable을 생성하지 않고 address를 받아 쓰는 방법을 보자.
struct Rectangle
{
int length;
int height;
};
int area(struct Rectangle& n)
{
return n.length * n.height;
}
int main()
{
struct Rectangle r = {10,5}
area(r)
}
Example
- point터를 이용한 값 바꾸기
struct Rectangle { int length; int height; }; int changeLength(struct Rectangle* p, int x) { p->length = x; } int main() { struct Rectangle r = {10,5} changeLength(&r, 20) }
- Reference를 이용한 값 바꾸기.
struct Rectangle
{
int length;
int height;
};
int changeLength(struct Rectangle& p, int x)
{
p.length = x;
}
int main()
{
struct Rectangle r = {10,5};
changeLength(r, 20);
}
Example 2
void fun(struct Test t1)
{
t1.A[0] = 10
t1.n = 4;
}
struct Test
{
int A[5];
int n;
}
int main()
{
struct Test t = {2,4,6,8,10}, 5;
fun(t);
}
// 여기서도 t의 rvalue에 {}를 더 붙여야 하는데 안됨.. Jekyll..
structure and Functions
struct Rectangle
{
int length;
int height;
};
void initilize(struct Rectangle *r, int l, int b)
{
r->length = l;
r->height = b;
}
int area(struct Rectangle& r)
{
return r.length * r.height;
}
void changeLength(struct Rectangle* r, int l)
{
r->length=l;
}
int main()
{
struct Rectangle r;
initialize(&r,10,5);
area(r);
changeLength(&r,20);
}
Class and Constructor.
- class는 오직 C++에만 있다.
- Struct하고 비슷한 기능이지만 다른점은
- Struct은 기본이 Public 이고
- class는 기본이 Private 이다.
- class에는 public, private, protect 3가지가 있다.
- public은 다른 로컬 펑션이나 매인에서 class를 이용하여 사용할 수 있다.
- private은 오직 해당 Class에서만 사용이 된다. 다른 로컬 펑션이나 메인에서 가져와 쓸 수 없다.
- protected는 파생 클래스의 정의부에서 접근이 가능하지만 외부에서는 접근 불가하다.
- Struct을 아래와 같이 바꿀 수 있다.
class Rectangle
{
public:
Rectangle(int length, int height) : length_(length), height_(height) {}
int area()
{
return length_ * height_;
}
void changeLength(int l)
{
length_=l;
}
private:
int length_;
int height_;
};
int main()
{
Rectangle r(10,5);
int a = r.area();
std::cout<<a<<" "; //50
r.changeLength(20);
a = r.area(); //100
std::cout<<a<<" ";
return 0;
}
Example
#include <iostream>
using namespace std;
class Rectangle
{
public:
Rectangle(int length, int height) : length_(length), height_(height){}
int area();
int perimeter();
int setLength(int k);
int getLength();
~Rectangle();
private:
int length_;
int height_;
};
Rectangle::area()
{
return length_*height_;
}
Rectangle::perimeter()
{
return 2*(length_+height_);
}
Rectangle::setLength(int k)
{
length_=k;
}
Rectangle::getLength()
{
return length_;
}
Rectangle::~Rectangle()
{
}
int main()
{
Rectangle r(10,5);
cout<<r.area()<<" ";
cout<<r.perimeter()<<" ";
r.setLength(20);
cout<<r.getLength()<<" ";
return 0;
}
Template Class
- Data 타입을 컴파일할떄 자동으로 맞춰준다.
- 편하다
- Class던 Data 타입이던 다 자동으로 할 수 있다.
- Template 사용전
class Arithmateic
{
private:
int a_;
int b_;
public:
Arithmateic(int a, int b) : a_(a), b_(b) {}
int add();
int sub();
}
Arithmateic::add()
{
return a_ + b_;
}
Arithmateic::sub(){
return a_ - B_;
}
int main()
{
Arithmatic A(5,1);
A.add();
A.sub();
return 0;
}
- template 사용 후
#include <iostream>
using namespace std;
template <class T> // class안에 있는 data variable의 데이터 타입을 자동으로 맞춘다.
class Arithmateic
{
private:
T a_;
T b_;
public:
Arithmateic(T a, T b) : a_(a), b_(b) {}
T add();
T sub();
};
template <class T>
T Arithmateic<T>::add()
{
return a_ + b_;
}
template <class T>
T Arithmateic<T>::sub(){
return a_ - b_;
}
int main()
{
Arithmateic<int> A(5,1);
A.add();
A.sub();
return 0;
}
Comments