class Matrix Matrix { public: Matrix const short rows, const short cols; ~Matrix void {delete elems;} double& operator const short row, const short col; friend ostream& operator = 1 &&
Trang 1L P TRÌNH
tuantp@hcmup.edu.vn http://giaotrinh.tranphuoctuan.com
8/30/2009
Tái nh ngh a hàm.
Tái nh ngh a toán t Chuy n i ki u.
Tái nh ngh a toán t xu t (<<)– nh p (>>) Tái nh ngh a toán t [], toán t ()
Kh i t o ng m nh - Gán ng m nh.
Tái nh ngh a toán t ++ và Tái nh ngh a new và delete
nh ngh a các hàm cùng tên
i s ph i khác nhau:
class Time Time {
//
long GetTime (void); // s giây tính t a êm
void GetTime (int &hours,
int &minutes, int &seconds);
};
ng Th
Ki u
Có th dùng i s c nh.
void main() { int h, m, s;
long t = GetTime(); // G i hàm ???
GetTime(h, m, s); // G i hàm ???
}
nh ngh a các phép toán trên i t ng Các phép toán có th tái nh ngh a:
, () []
||
&&
>=
<=
>
<
!=
==
>>=
<<=
^=
|=
&=
%=
/=
-=
+=
=
>>
<<
^
|
&
% /
* -+ Nh ng
delete new
->* -> () ++
&
~
!
* -+ n ng
Các phép toán không th tái nh ngh a:
.* :: ?: sizeof
Trang 2TPT - LTH T 5
8/30/2009
ng hàm thành viên:
class Point Point {
public:
Point (int x, int y) { Point::x = x; Point::y = y; }
Point operator + (Point &p) { return Point(x + p.x,y + p.y); }
Point operator - (Point &p) { return Point(x - p.x, y - p.y); }
private:
int x, y;
};
void main() {
Point p1(10,20), p2(10,20);
Point p3 = p1 + p2; Point p4 = p1 - p2;
Point p5 = p3.operator + (p4); Point p6 = p3.operator – (p4);
};
Có 1 tham s (N u là toán t nh ng)
8/30/2009
ng hàm c l p: th ng khai báo friend
class Point Point { public:
Point (int x, int y) { Point::x = x; Point::y = y; } friend Point operator + (Point &p, Point &q)
{return Point(p.x + q.x,p.y + q.y); } friend Point operator - (Point &p, Point &q)
{return Point(p.x - q.x,p.y - q.y); } private:
int x, y;
};
void main() { Point p1(10,20), p2(10,20);
Point p3 = p1 + p2; Point p4 = p1 - p2;
Point p5 =operator + (p3, p4); Point p6 = operator – (p3, p4);
};
Có 2 tham s (N u là toán t nh ng)
i ti n l p t p h p (Set):
#include <iostream.h>
const maxCard = 100;
enum Bool {false, true};
class Set Set {
public:
Set(void) { card = 0; }
friend Bool operator & (const int, Set&);// thanh vien ?
friend Bool operator == (Set&, Set&); // bang ?
friend Bool operator != (Set&, Set&); // khong bang ?
friend Set operator * (Set&, Set&); // giao
friend Set operator + (Set&, Set&); // hop
//
void AddElem(const int elem);
void Copy (Set &set);
void Print (void);
private:
int elems[maxCard];
int card;
};
// nh ngh a các toán t
……….
……….
int main (void) { Set s1, s2, s3;
s1.AddElem(10); s1.AddElem(20);
s1.AddElem(30); s1.AddElem(40);
s2.AddElem(30); s2.AddElem(50);
s2.AddElem(10); s2.AddElem(60);
cout << "s1 = "; s1.Print();
cout << "s2 = "; s2.Print();
if (20 & s1) cout << "20 thuoc s1\n";
cout << "s1 giao s2 = "; (s1 * s2).Print();
cout << "s1 hop s2 = "; (s1 + s2).Print();
if (s1 != s2) cout << "s1 /= s2\n";
return 0;
}
Mu n th c hi n các phép c ng:
void main() { Point p1(10,20), p2(30,40), p3, p4, p5;
p3 = p1 + p2;
p4 = p1 + 5; p5 = 5 + p1;
};
Có th nh ngh a thêm 2 toán t :
class Point Point {
//
friend Point operator + (Point, Point);
friend Point operator + (int, Point);
friend Point operator + (Point, int);
};
Trang 3TPT - LTH T 9
8/30/2009
void main() { Point p1(10,20), p2(30,40), p3, p4, p5;
p3 = p1 + p2;
p4 = p1 + 5; // ng ng p1 + Point(5) p5 = 5 + p1; // ng ng Point(5) + p1 }
class Point Point { //
Point (int x) { Point::x = Point::y = x; } friend Point operator + (Point, Point);
};
Chuy n ki u
5 Point(5)
Chuy n i ki u: ngôn ng nh ngh a s n.
nh ngh a phép chuy n i ki u
8/30/2009
Tái nh ngh a toán t xu t <<
nh ngh a hàm toàn c c:
ostream& operator << (ostream&, Class&);
class Point Point { public:
Point (int x=0, int y=0) { Point::x = x; Point::y = y; } friend ostream& operator <<
(ostream& os, Point& p) { os<< “(“ << p.x << “,” << p.y << “)”; } // …
private:
int x, y;
};
void main() { Point p1(10,20), p2;
cout<<“Diem P1: “<< p1 << endl; cout<<“Diem P2: “<< p2 << endl; }
t qu trên màn hình ?
nh ngh a hàm toàn c c:
istream& operator >> (istream&, Class&);
class Point Point {
public:
Point (int x=0, int y=0)
{ Point::x = x; Point::y = y; }
friend istream& operator >>
(istream& is, Point& p)
{ cout<<“Nhap x: “; is>>p.x;
cout<<“Nhap y: “; is>>p.y;
}
// …
private:
int x, y;
};
void main() { Point p1, p2;
cout<<“Nhap thong tin cho P1: \n“;
cin>>p1;
cout<<“Nhap thong tin cho P2: \n“;
cin>>p2;
}
Thông th ng xu t ra giá tr a 1 ph n t i trí cho tr c trong i t ng.
nh ngh a là hàm thành viên.
class StringVec StringVec { public:
StringVec (const int dim);
~StringVec ();
char* operator [] (int);
int add(char* );
// ………
private:
char **elems; // cac phan tu int dim; // kich thuoc cua vecto int used; // vi tri hien tai };
char* StringVec::operator [] (int i) {
if ( i>=0 && i<used) return elems[i]; return “”;
}
void main() { StringVec sv1(100);
sv1.add(“PTPhi”);sv1.add(“BQThai”); sv1.add(“LVLam”); sv1.add(“NCHuy”); cout<< sv1[2]<<endl;
cout<<sv1[0];
}
Trang 4TPT - LTH T 13
8/30/2009
nh ngh a là hàm thành viên.
class Matrix Matrix {
public:
Matrix (const short rows, const short cols);
~Matrix (void) {delete elems;}
double& operator () (const short row,
const short col);
friend ostream& operator << (ostream&, Matrix&);
friend Matrix operator + (Matrix&, Matrix&);
friend Matrix operator - (Matrix&, Matrix&);
friend Matrix operator * (Matrix&, Matrix&);
private:
const short rows; // s hàng
const short cols; // s t
double *elems; // các ph n t
};
double& Matrix::operator () (const short row, const short col) {
static double dummy = 0.0;
return (row >= 1 && row <= rows
&& col >= 1 && col <= cols)
? elems[(row - 1)*cols + (col - 1)]
: dummy;
} void main() { Matrix m(3,2);
m(1,1) = 10; m(1,2) = 20;
m(2,1) = 30; m(2,2) = 40;
m(3,1) = 50; m(3,2) = 60;
cout<<m<<endl;
}
8/30/2009
c nh ngh a s n trong ngôn ng :
VD: Point p1(10,20); Point p2 = p1;
gây ra l i (k t qu SAI) khi bên trong i t ng
VD: Matrix m(5,6); Matrix n = m;
i s y ra do
kh i t o ng m
ng cách gán
ng ng t ng thành ph n.
Khi l p có th th ành ph n d li u con tr ,
ph i nh ngh a hàm xây d ng sao chép
class Point Point {
int x, y;
public:
Point (int =0; int =0 );
// Khong can thiet DN
Point (const Point& p) {
x= p.x;
y = p.y;
}
// ………
};
// ………
class Matrix Matrix { //….
Matrix(const Matrix&);
};
Matrix::Matrix (const Matrix &m) : rows(m.rows), cols(m.cols) {
int n = rows * cols;
elems = new double[n]; // cùng kích th c for (register i = 0; i < n; ++i) // sao chép ph n t elems[i] = m.elems[i];
}
c nh ngh a s n trong ngôn ng :
Gán t ng ng t ng thành ph n.
úng khi i t ng không có d li u con tr
VD: Point p1(10,20); Point p2; p2 = p1;
Khi thành ph n d li u có con tr , b t bu c ph i
nh ngh a phép gán = cho l p.
class Matrix Matrix { //….
Matrix& operator = (const Matrix &m) {
if (rows == m.rows && cols == m.cols) { // ph i kh p int n = rows * cols;
for (register i = 0; i < n; ++i) // sao chép các ph n t elems[i] = m.elems[i];
} return *this;
} };
Hàm thành viên
Trang 5TPT - LTH T 17
8/30/2009
u Ý
u Ý
ng có nhu c u c p phát tài nguyên.
i Ph ng th c thi t l p
ii Ph ng th c thi t l p sao chép
iii Ph ng th c hu
iv Phép gán
8/30/2009
Toán t ++ (ho c toán t ) có 2 lo i:
Ti n t : ++n
u t : n++
class PhanSo PhanSo { int tuso, mau so;
public:
// …
PhanSo(int=0 , int =1);
friend PhanSo operator ++ (PhanSo&);
friend PhanSo operator ++ (PhanSo&, int);
};
PhanSo operator ++ (PhanSo& p) { return (p = PhanSo(tuso+mauso, mauso));
} PhanSo operator ++ (PhanSo& p, int x) { PhanSo p2 = PhanSo(tuso+mauso, mauso);
return p2;
}
void main() { PhanSo p1(3,4), p2;
cout<< p1++;
cout<<++p2;
cout<<++(p1++) + (++p2)++; }
t qu trên màn hình ?
Hàm new và delete c nh c a ngôn ng :
u i t ng kích th c nh , có th gây ra quá
nhi u kh i nh => ch m.
Không áng k khi i t ng có kích th c l n.
=> Toán t new và delete ít c tái nh ngh a.
nh ngh a theo d ng hàm thành viên:
class Point Point {
public:
//
void* operator new (size_t bytes);
void operator delete (void *ptr, size_t bytes);
private:
int xVal, yVal;
};
void main() { Point *p = new Point(10,20);
Point *ds = new Point[30];
//………
delete p;
delete []ds;
}
i s thành viên n Toán t ph m vi Danh sách kh i t o thành viên Thành viên h ng
Thành viên t nh Thành viên tham chi u Thành viên là i t ng c a 1 l p
ng các i t ng
Ph m vi l p
u trúc và h p Các tr ng bit
Trang 6TPT - LTH T 21
8/30/2009
i s c nh tính t bên ph i.
class Point Point {
int xVal, yVal;
public:
Point (int x = 0, int y = 0);
//
};
void main() {
Point p1; // nh là ???
Point p2(10); // nh là ???
Point p3(10,20);
Point p4(, 20); // ?????
…
}
class Point Point { int xVal, yVal;
public:
Point (int x = 0, int y = 0);
Point (float x=0, float y=0);
//
};
void main() { Point p2(1.6, 5.0); // nh là ???
Point p3(10,20); // nh là ???
Point p4; // ?????
…
}
i ngh a h
8/30/2009
Là 1 thành viên n, có thu c tính là private.
Tr i chính b n thân i t ng.
void Point:: OffsetPt (int x, int y) {
xVal += x;
yVal += y;
}
void Point:: OffsetPt (int x, int y) {
this->xVal += x;
this->yVal += y;
}
• Có nh ng tr ng h p s ng *this là th a (Ví d trên)
• Tuy nhiên, có nh ng tr ng h p ph i s ng con tr *this *this
Toán t :: dùng xác nh chính xác hàm
(thu c tính) c truy xu t thu c l p nào.
Câu l nh: pt.OffsetPt(2,2);
<=> pt.Point::OffsetPt(2,2);
n thi t trong m t s tr ng h p:
Cách g i hàm trong th a k
Tên thành viên b che b i bi n c c b
Ví d : Point(int xVal, int yVal) {
Point::xVal = xVal;
Point::yVal = yVal;
}
ng ng vi c gán giá tr li u thành viên.
class Image Image { public:
Image(const int w, const int h); private:
int width;
int height;
//
};
Image::Image(const int w, const int h) {
width = w;
height = h;
//
}
Image::Image (const int w, const int h) : width(w), height(h)
{ // }
class Point {
int xVal, yVal;
public:
Point (int x, int y) { xVal = x;
yVal = y;
} // ………
};
Point::Point (int x, int y) : xVal(x), yVal(y)
{ }
Trang 7TPT - LTH T 25
8/30/2009
ng d li u thành viên:
class Image Image {
public:
Image(const int w, const int h);
private:
const int const int width;
const int const int height;
//
};
Image::Image (const int w, const int h)
: width(w), height(h) { // }
Khai báo bình th ng
nh d li u thành viên
class Image Image {
const int width = 256;
const int height = 168;
//
};
Kh i t o
SAI
Kh i t o ÚNG thông qua danh sách
kh i t o thành viên
8/30/2009
ng i t ng: không c thay i giá tr
Hàm thành viên h ng:
c phép g i trên h ng i t ng.
Không c thay i giá tr li u thành viên.
class Set Set { public:
Set(void){ card = 0; } Bool Member(const int) const;
void AddElem(const int);
//
};
Bool Set::Member (const int elem) const { //
}
void main() { const Set s;
s.AddElem(10); // SAI s.Member(10); // ok
}
li u thành viên t nh:
Dùng chung 1 b n sao chép (1 vùng nh ) chia s
cho t t c i t ng c a l p ó.
ng: <TênL p>::<TênD Li uThànhViên>
Th ng dùng m s ng i t ng.
class Window Window {
// danh sách liên k t t t c Window static Window *first;
// con tr i window k ti p Window *next;
//
};
Window *Window:: Window:: first = &myWindow;
// ……….
Kh i t o
li u thành viên nh Khai báo
Hàm thành viên t nh:
ng ng v i hàm toàn c c.
i thông qua: <TênL p>::<TênHàm>
class Window Window { // ……….
static void PaintProc () { … } // ………
};
void main() { // ……….
Window::PainProc();
}
Truy xu t hàm thành viên t nh
Khai báo
nh ngh a hàm thành viên t nh
Trang 8TPT - LTH T 29
8/30/2009
class Image {
int width;
int height;
int &widthRef = width;
//
};
Tham chi u d li u thành viên:
class Image {
int width;
int height;
int &widthRef;
//
};
Image::Image (const int w, const int h)
: widthRef(width) { //……… }
Khai báo bình th ng
nh d li u thành viên
Kh i t o
SAI
Kh i t o ÚNG thông qua danh sách
kh i t o thành viên
8/30/2009
li u thành viên có th có ki u:
li u (l p) chu n c a ngôn ng
p do ng i dùng nh ngh a (có th là chính l p ó).
class Point { …… };
class Rectangle Rectangle { public:
Rectangle (int left, int top, int right, int bottom);
//
private:
Point topLeft;
Point botRight;
};
Rectangle::Rectangle (int left, int top, int right, int bottom)
: topLeft(left,top), botRight(right,bottom) { }
Kh i t o cho các
li u thành viên qua danh sách
kh i t o thành viên
ng hàm xây d ng không i s (hàm
xây d ng m c nhiên - default constructor).
VD: Point pentagon[5];
ng b kh i t o m ng:
VD: Point triangle[3] =
{ Point(4,8), Point(10,20), Point(35,15) };
Ng n g n:
Set s[4] = { 10, 20, 30, 40 };
Set s[4] = { Set(10), Set(20), Set(30), Set(40) };
ng d ng con tr :
p vùng nh :
VD: Point *pentagon = new Point[5];
Thu h i vùng nh :
delete[] pentagon;
delete pentagon; // Thu h i vùng nh u
class Polygon Polygon { public:
//
private:
Point *vertices; // các nh int nVertices; // s các nh };
Không c n bi t kích th c m ng.
Trang 9TPT - LTH T 33
8/30/2009
Thành viên trong 1 l p:
Che các th c th trùng tên trong ph m vi.
// ………
int fork (void); // fork h th ng
class Process Process {
int fork (void); // fork thành viên //
};
// ………
int Process::func1 (void)
{ int x = fork(); // g i fork c c b
int pid = :: fork(); // g i hàm fork h th ng
//
}
fork thành viên che i fork toàn c c trong ph m vi l p Process
8/30/2009
p toàn c c: i a s p trong C++.
p l ng nhau: p ch a ng l p.
p c c b : trong 1 hàm ho c 1 kh i.
class Rectangle Rectangle { // L p l ng nhau public:
Rectangle (int, int, int, int);
//
private:
class Point { public:
Point(int a, int b) { … } private:
int x, y;
};
Point topLeft, botRight;
};
Rectangle ::Point pt(1,1); // sd ngoài
void Render (Image &i) {
class ColorTable ColorTable { public:
ColorTable () { /* */ } AddEntry (int r, int g, int b) { /* */ }
//
};
ColorTable colors;
//
} ColorTable ct; // SAI
u trúc (structure):
t ngu n t ngôn ng C.
ng ng v i class i các thu c tính là public.
ng nh class.
struct Point Point {
Point (int, int);
void OffsetPt(int, int);
int x, y;
};
class Point Point { public:
Point(int, int);
void OffsetPt(int, int);
int x, y;
};
Point p = { 10, 20 }; Có th kh i t o d ng này
u không có nh ngh a hàm xây d ng
p (union):
t c thành viên ánh x n cùng 1 a ch bên trong i t ng chính nó (không liên ti p).
Kích th c = kích th c c a d li u l n nh t.
union Value Value {
long integer;
double real;
char *string;
Pair list;
//
};
Kích th c c a Value là
8 bytes = sizeof(double)
class Pair Pair {
Value *head;
Value *tail;
//
};
class Object Object { private:
enum ObjType {intObj, realObj,
strObj, listObj}; ObjType type; // ki u i t ng Value val; // giá tr a i t ng //
};
Trang 10TPT - LTH T 37
8/30/2009
u khi n i t ng c bit.
VD: Truy xu t các bit trong header c a gói tin.
typedef unsigned int Bit Bit ;
class Packet Packet {
Bit type : 2; // r ng 2 bit
Bit acknowledge : 1; // r ng 1 bit
Bit channel : 4; // r ng 4 bit
Bit sequenceNo : 4; // r ng 4 bit
Bit moreData : 1; // r ng 1 bit
//
};
enum PacketType { dataPack, controlPack,
supervisoryPack };
enum Bool { false, true };
// …………
Packet p;
p.type = controlPack;
p.acknowledge = true;
8/30/2009