C++ OOP từ cơ bản đến nâng cao( Phần 3)
Xin chào các bạn, hôm nay chúng ta lại quay trở lại series lập trình C++ hướng đối tượng từ cơ bản đến nâng cao, ở bài trước chúng ta đã tìm hiểu đến static member function rồi. Trong bài hôm nay chúng ta sẽ cùng đi tìm hiểu những khái niệm sau:
+ Hàm bạn - Lớp bạn
+ Nạp chồng toán tử.
Như chúng ta đã biết chỉ có hàm thành viên mới truy cập được các thuộc tính của lớp. Vậy làm sao để truy cập thuộc tính của class từ một hàm bên ngoài , đó là sử dụng hàm friend chúng ta cùng đi xem ví dụ sau để hiểu rõ hơn nhé.
#include<stdio.h>
#include<iostream>
using namespace std;
class ClassSample{
private:
float a,b;
public:
ClassSample();
ClassSample(float a, float b){
this->a = a;
this->b =b;
}
friend float sum(ClassSample);
};
float sum(ClassSample c){
return c.a+c.b;
};
int main(){
ClassSample c(5,5);
cout<<"Sum: "<<sum(c);
system("exit");
return 0;
}
Phương thức của một class có thể là hàm bạn của một class khác. Ví dụ:
class X{
public:
int function();
}
class Y{
private:
friend int X::function(); // function() của X là hàm bạn của Y.
}
Class bạn
class Z{
friend class X;
}
Tất cả các phương thức của X là bạn của Z.
Nạp chồng toán tử (Operator overloading)
Như các bạn đã biết là ở một số kiểu dữ liệu như là int, float... khi cộng trừ hai số với nhau,trình biên dịch sẽ tự hiểu nên làm gì. Nhưng với những kiểu dữ liệu do người dùng tự định nghĩa thì ta phải định nghĩa toán tử lại cho chúng.
Đây là các loại toán tử trong C++
Có thể phân ra làm 4 dạng như sau:
+ Cộng, trừ, nhân, chia
+ Nhập, xuất
+ So sánh
+ Tiền tố/hậu tố
Toán tử không có trong C++
+ (::) Khai báo Method
+ (.) Truy cập thuộc tính
Cách cài đặt toán tử: có 3 cách như sau:
+ Sử dụng member-function: Tức là ở trong phương thức của class
+ Sử dụng nonnon-member function: Viết ở ngoài class, sử dụng getter/setter để truy xuất vào thuộc tính của class đó
+ Sử dụng friend member-function
Sau đây mình sẽ ví dụ 3 cách cài đặt trên để cho các bạn dễ hình dung.
Ví dụ 1: Toán tử số đối dùng member-function
#include<stdio.h>
#include<iostream>
using namespace std;
class ClassSample{
private:
float a,b;
public:
void output(){
cout<<a<<"/"<<b;
}
ClassSample();
ClassSample(float a,float b){
this->a=a;
this->b=b;
}
void operator - ();
};
void ClassSample::operator-(){
a=-a;
b=-b;
};
int main(){
ClassSample C(5,5);
-C;
C.output();
System("exit");
return 0;
}
Ví dụ 2: Toán tử số đối dùng non-member function
#include<stdio.h>
#include<iostream>
using namespace std;
class ClassSample{
private:
float a,b;
public:
//getter
float getA(){ return a;}
float getB(){ return b;}
// setter
void setA(float a){
this->a=a;
}
void setB(float b){
this->b=b;
}
void output(){
cout<<a<<"/"<<b;
}
ClassSample();
ClassSample(float a, float b){
this->a=a;
this->b=b;
}
};
void operator-(ClassSample &C){
C.setA(-C.getA());
};
int main(){
ClassSample C(4,5);
-C;
C.output(); // output = -4/5;
system("exit");
return 0;
}
Ví dụ 3: Toán tử sử dụng friend-member function
#include<stdio.h>
#include<iostream>
using namespace std;
class Point{
int x,y;
public:
Point() {} // needed to constructor temporaries
Point(int px,int py){
x=px;
y=py;
}
void Show(){
cout<<x<<" ";
cout<<y<<"\n";
}
friend Point operator+(Point op1, Point op2); // now a friend
};
// Now, + is overloaded using friend function
Point operator+(Point op1, Point op2){
Point temp;
temp.x = op1.x+op2.x;
temp.y=op1.y+op2.y;
return temp;
}
int main(){
Point ob1(10,20), ob2(5,30);
ob1=ob1+ob2;
ob1.Show(); // 15 30;
return 0;
}
Nguồn: https://medium.com/tuanbinhblog/c-oop-từ-cơ-bản-đến-nâng-cao-phần-3-5a426244fd59
+ Hàm bạn - Lớp bạn
+ Nạp chồng toán tử.
Như chúng ta đã biết chỉ có hàm thành viên mới truy cập được các thuộc tính của lớp. Vậy làm sao để truy cập thuộc tính của class từ một hàm bên ngoài , đó là sử dụng hàm friend chúng ta cùng đi xem ví dụ sau để hiểu rõ hơn nhé.
#include<stdio.h>
#include<iostream>
using namespace std;
class ClassSample{
private:
float a,b;
public:
ClassSample();
ClassSample(float a, float b){
this->a = a;
this->b =b;
}
friend float sum(ClassSample);
};
float sum(ClassSample c){
return c.a+c.b;
};
int main(){
ClassSample c(5,5);
cout<<"Sum: "<<sum(c);
system("exit");
return 0;
}
Phương thức của một class có thể là hàm bạn của một class khác. Ví dụ:
class X{
public:
int function();
}
class Y{
private:
friend int X::function(); // function() của X là hàm bạn của Y.
}
Class bạn
class Z{
friend class X;
}
Tất cả các phương thức của X là bạn của Z.
Nạp chồng toán tử (Operator overloading)
Như các bạn đã biết là ở một số kiểu dữ liệu như là int, float... khi cộng trừ hai số với nhau,trình biên dịch sẽ tự hiểu nên làm gì. Nhưng với những kiểu dữ liệu do người dùng tự định nghĩa thì ta phải định nghĩa toán tử lại cho chúng.
Đây là các loại toán tử trong C++
Có thể phân ra làm 4 dạng như sau:
+ Cộng, trừ, nhân, chia
+ Nhập, xuất
+ So sánh
+ Tiền tố/hậu tố
Toán tử không có trong C++
+ (::) Khai báo Method
+ (.) Truy cập thuộc tính
Cách cài đặt toán tử: có 3 cách như sau:
+ Sử dụng member-function: Tức là ở trong phương thức của class
+ Sử dụng nonnon-member function: Viết ở ngoài class, sử dụng getter/setter để truy xuất vào thuộc tính của class đó
+ Sử dụng friend member-function
Sau đây mình sẽ ví dụ 3 cách cài đặt trên để cho các bạn dễ hình dung.
Ví dụ 1: Toán tử số đối dùng member-function
#include<stdio.h>
#include<iostream>
using namespace std;
class ClassSample{
private:
float a,b;
public:
void output(){
cout<<a<<"/"<<b;
}
ClassSample();
ClassSample(float a,float b){
this->a=a;
this->b=b;
}
void operator - ();
};
void ClassSample::operator-(){
a=-a;
b=-b;
};
int main(){
ClassSample C(5,5);
-C;
C.output();
System("exit");
return 0;
}
Ví dụ 2: Toán tử số đối dùng non-member function
#include<stdio.h>
#include<iostream>
using namespace std;
class ClassSample{
private:
float a,b;
public:
//getter
float getA(){ return a;}
float getB(){ return b;}
// setter
void setA(float a){
this->a=a;
}
void setB(float b){
this->b=b;
}
void output(){
cout<<a<<"/"<<b;
}
ClassSample();
ClassSample(float a, float b){
this->a=a;
this->b=b;
}
};
void operator-(ClassSample &C){
C.setA(-C.getA());
};
int main(){
ClassSample C(4,5);
-C;
C.output(); // output = -4/5;
system("exit");
return 0;
}
Ví dụ 3: Toán tử sử dụng friend-member function
#include<stdio.h>
#include<iostream>
using namespace std;
class Point{
int x,y;
public:
Point() {} // needed to constructor temporaries
Point(int px,int py){
x=px;
y=py;
}
void Show(){
cout<<x<<" ";
cout<<y<<"\n";
}
friend Point operator+(Point op1, Point op2); // now a friend
};
// Now, + is overloaded using friend function
Point operator+(Point op1, Point op2){
Point temp;
temp.x = op1.x+op2.x;
temp.y=op1.y+op2.y;
return temp;
}
int main(){
Point ob1(10,20), ob2(5,30);
ob1=ob1+ob2;
ob1.Show(); // 15 30;
return 0;
}
Nguồn: https://medium.com/tuanbinhblog/c-oop-từ-cơ-bản-đến-nâng-cao-phần-3-5a426244fd59
Nhận xét
Đăng nhận xét