Tải bản đầy đủ (.pdf) (7 trang)

Nạp chồng toán tử và Nạp chồng hàm trong C++ | 101 bài hướng dẫn C++ hay nhất PDF

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (371.47 KB, 7 trang )

/>
Copyright © vietjack.com

Nạp chồng toán tử và Nạp chồng hàm
trong C++
C++ cho phép bạn xác định nhiều hơn một định nghĩa cho một tên hàm hoặc một toán tử trong
cùng phạm vi (scope), được gọi tương ứng là Nạp chồng hàm (function overloading) và Nạp
chồng toán tử (operator overloading) trong C++.
Một khai báo nạp chồng là một khai báo mà đã được khai báo với cùng tên như một khai báo được
khai báo trước đó trong cùng phạm vi, ngoại trừ rằng: cả hai khai báo có các tham số khác nhau và
định nghĩa khác nhau.
Khi bạn gọi một hàm nạp chồng hoặc một toán tử nạp chồng, thì compiler quyết định định nghĩa
thích hợp nhất để sử dụng bằng việc so sánh các kiểu tham số bạn đã sử dụng để gọi hàm hoặc
toán tử với các kiểu tham số đã được xác định trong các định nghĩa. Tiến trình lựa chọn hàm nạp
chồng hoặc toán tử nạp chồng thích hợp nhất này được gọi là overload resolution - phân giải
nạp chồng.

Nạp chồng hàm trong C++
Bạn có thể có nhiều định nghĩa cho cùng tên hàm trong cùng phạm vi. Định nghĩa của hàm phải
khác lẫn nhau về kiểu và/hoặc số tham số trong danh sách tham số. Bạn không thể nạp chồng các
khai báo hàm mà chỉ khác nhau ở kiểu trả về.
Trong ví dụ sau, cùng một hàm print() được sử dụng để in các kiểu dữ liệu khác nhau:
#include <iostream>
using namespace std;

class printData
{
public:
void print(int i) {
cout << "Printing int: " << i << endl;
}



void print(double

f) {

Trang chia sẻ các bài học online miễn phí

Page 1


/>
Copyright © vietjack.com

cout << "Printing float: " << f << endl;
}

void print(char* c) {
cout << "Printing character: " << c << endl;
}
};

int main(void)
{
printData pd;

// Call print to print integer
pd.print(5);
// Call print to print float
pd.print(500.263);
// Call print to print character

pd.print("Hello C++");

return 0;
}

Khi code trên được biên dịch và thực thi, nó cho kết quả sau:
Printing int: 5
Printing float: 500.263
Printing character: Hello C++

Nạp chồng toán tử trong C++
Bạn có thể định nghĩa lại hoặc nạp chồng hầu hết các toán tử có sẵn trong C++. Vì thế, một lập
trình viên có thể sử dụng các toán tử với kiểu tự định nghĩa (user-defined).
Nạp chồng toán tử trong C++ là các hàm với tên đặc biệt: Tên hàm là từ khóa operator theo sau là
ký hiệu của toán tử đang được định nghĩa. Giống như bất kỳ hàm khác, một toán tử nạp chồng có
một kiểu trả về và một danh sách tham số.

Trang chia sẻ các bài học online miễn phí

Page 2


/>
Copyright © vietjack.com

Box operator+(const Box&);

Khai báo toán tử + để cộng hai đối tượng Box và trả về đối tượng Box cuối cùng. Hầu hết toán tử
nạp chồng có thể được định nghĩa dưới dạng: các hàm không có thành viên (non-member) hoặc
các hàm thành viên lớp. Trong trường hợp trên, chúng ta định nghĩa hàm ở dạng non-member của

một lớp, thì sau đó chúng ta phải truyền hai tham số cho mỗi toán hạng, như sau:
Box operator+(const Box&, const Box&);

Ví dụ sau minh họa khái niệm nạp chồng toán tử bởi sử dụng một hàm thành viên. Ở đây, một đối
tượng được truyền như là một tham số mà các thuộc tính của nó sẽ được truy cập bởi sử dụng đối
tượng này, đối tượng mà sẽ gọi toán tử này có thể được truy cập bởi sử dụng toán tử this, như
sau:
#include <iostream>
using namespace std;

class Box
{
public:

double getVolume(void)
{
return length * breadth * height;
}
void setLength( double len )
{
length = len;
}

void setBreadth( double bre )
{
breadth = bre;
}

Trang chia sẻ các bài học online miễn phí


Page 3


/>
Copyright © vietjack.com

void setHeight( double hei )
{
height = hei;
}
// Overload + operator to add two Box objects.
Box operator+(const Box& b)
{
Box box;
box.length = this->length + b.length;
box.breadth = this->breadth + b.breadth;
box.height = this->height + b.height;
return box;
}
private:
double length;

// Length of a box

double breadth;

// Breadth of a box

double height;


// Height of a box

};
// Main function for the program
int main( )
{
Box Box1;

// Declare Box1 of type Box

Box Box2;

// Declare Box2 of type Box

Box Box3;

// Declare Box3 of type Box

double volume = 0.0;

// Store the volume of a box here

// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);

// box 2 specification
Box2.setLength(12.0);


Trang chia sẻ các bài học online miễn phí

Page 4


/>
Copyright © vietjack.com

Box2.setBreadth(13.0);
Box2.setHeight(10.0);

// volume of box 1
volume = Box1.getVolume();
cout << "Volume of Box1 : " << volume <
// volume of box 2
volume = Box2.getVolume();
cout << "Volume of Box2 : " << volume <
// Add two object as follows:
Box3 = Box1 + Box2;

// volume of box 3
volume = Box3.getVolume();
cout << "Volume of Box3 : " << volume <
return 0;
}

Khi code trên được biên dịch và thực thi, nó cho kết quả sau:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

Toán tử có thể nạp chồng và không thể nạp chồng
trong C++
Bảng dưới liệt kê danh sách các toán tử có thể được nạp chồng trong C++:
+

-

*

/

Trang chia sẻ các bài học online miễn phí

%

^

Page 5


/>
Copyright © vietjack.com

&

|


~

!

,

=

<

>

<=

>=

++

--

<<

>>

==

!=

&&


||

+=

-=

/=

%=

^=

&=

|=

*=

<<=

>>=

[]

()

->

->*


new

new []

delete

delete []

Còn đây là danh sách các toán tử không thể được nạp chồng trong C++:
::

.*

.

?:

Ví dụ về Nạp chồng toán tử trong C++
Dưới đây là các ví dụ đa dạng minh họa Nạp chồng toán tử trong C++, từ đó giúp bạn hiểu sâu
hơn về khái niệm này. Bạn click vào link để thấy ví dụ:
STT

Toán tử và Ví dụ

1

Nạp chồng toán tử một ngôi (unary) trong C++

2


Nạp chồng toán tử nhị phân trong C++

3

Nạp chồng toán tử quan hệ trong C++

4

Nạp chồng toán tử Input/Output trong C++

Trang chia sẻ các bài học online miễn phí

Page 6


/>
5

Nạp chồng toán tử ++ và -- trong C++

6

Nạp chồng toán tử gán trong C++

7

Nạp chồng toán tử gọi hàm () trong C++

8


Nạp chồng toán tử [] trong C++

9

Nạp chồng toán tử truy cập thành viên lớp -> trong C++

Trang chia sẻ các bài học online miễn phí

Copyright © vietjack.com

Page 7



×