Day la mot chuoi
Tham so la Stringand 10
Day la mot chuoi
Trong ch¬ng tr×nh nµy líp CWords ®îc ®Þnh nghÜa víi mét constructor vµ mét hµm chång Display(). Trong hµm main, khai b¸o mét ®èi tîng X thuéc líp CWords vµ hµm Display cña nã ®îc gäi víi c¸c tham sè kh¸c nhau.
Víi c¸c ®èi sè ®îc ®a vµo trong hµm kh¸c nhau ®ã nã sÏ t¬ng øng víi tõng hµm Display ®· ®îc khai b¸o trong líp. Víi tham sè nµo th× sö dông hµm cã ®èi sè t¬ng øng ®ã.
X.Display(120);
X.Display('A');
X.Display("String");
X.Display("String",10);
Nh hµm Dislay ®îc gäi ®Çu tiªn lµ hµm chØ cã duy nhÊt mét ®èi sè kiÓu int, cßn hµm Display gäi kÕ tiÕp lµ hµm Display mµ ®èi sè cña nã cã kiÓu char, tiÕp theo ®ã lµ hµm cã ®èi sè kiÓu con trá char, cßn hµm cuèi cïng cã hai ®èi sè lµ kiÓu chuæi vµ kiÓu sè nguyªn.
4.4 Hµm friend:
Mét hµm cã thÓ ®îc ®Þnh nghÜa nh lµ mét hµm friend cña mét líp ®Ó cã thÓ truy cËp c¸c thuéc tÝnh private cña líp ®ã. Mét constructor vµ destructor cña mét líp kh«ng thÓ lµ mét hµm friend.
Trong ch¬ng tr×nh díi ®©y, chóng ta sÏ sö dông mét hµm friend ®Ó céng hai biÕn kiÓu float thuéc vÒ hai líp kh¸c nhau lµ Alpha vµ Beta. Hµm friend lµ mét h×nh thøc cÇu nèi gi÷a hai líp kh¸c nhau ®Ó truy cËp c¸c thuéc tÝnh private cña 2 líp nµy.
#include
#include
class Beta;
class Alpha
{
private:
float X;
public:
Alpha()
{
X = 5.0;
}
friend float Init(Alpha,Beta);
};
class Beta
{
private:
float Y;
public:
Beta()
{
Y = 1.0;
}
friend float Init(Alpha,Beta);
};
float Init(Alpha A,Beta B)
{
return A.X + B.Y;
}
void main()
{
clrscr();
Alpha A;
Beta B;
cout << Init(A,B) << " la ket qua cua hai lop\n";
}
|
Khi ch¹y ch¬ng tr×nh trªn chóng ta sÏ ®îc kÕt qu¶ nh sau:
6 la ket qua cua hai lop
ë ch¬ng tr×nh trªn trªn chóng ta sö dông c¶ hai líp Alpha vµ Beta. ë hai líp nµy ®Òu cã hµm constructor ®Ó khëi t¹o gi¸ trÞ cho c¸c thuéc tÝnh cña líp ®ã, lµ biÕn X ë líp Alpha vµ Y ë líp Beta. V× líp Alpha khai b¸o tríc líp Beta th× ®Ó trong líp Alpha cã thÓ truy cËp ®Õn líp Beta ta ph¶i khai b¸o líp Beta phÝa trªn:
class Beta
NÕu chóng ta kh«ng khai b¸o líp Beta phÝa trªn th× trong hµm Init cña líp Alpha kh«ng thÓ khai b¸o ®èi sè thuéc líp Beta.
Hµm friend Init lÊy hµm tham sè, tham sè thø nhÊt lµ líp Alpha vµ tham sè thø hai líp Beta. Hµm friend nµy kh«ng thuéc vÒ líp nµo. V× thÕ khi khao b¸o nã chóng ta kh«ng ph¶i ®a ra nã thuéc vÒ líp nµo. V× lµ hµm friend cña c¶ hai líp Alpha vµ Beta nªn nã cã thÓ truy cËp ®Õn biÕn private X cña líp Alpha, vµ Y cña líp Beta.
Mét chó ý lµ hµm friend ph¶i ®Þnh nghÜa bªn ngoµi hay kh¸c h¬n nã kh«ng thuéc bÊt cø líp nµo.
Bµi tËp lµm thªm
Bµi 1: ViÕt mét ch¬ng tr×nh khai b¸o líp CString, t¬ng tù nh líp CString ®· viÕt trong bµi nhng thªm mét sè tÝnh n¨ng sau:
void Overwrite(int c,int nPos);
//thay thÕ ký tù thø nPos trong chuçi b»ng ký tù c
void Overwrite(char* str,int nPos);
//thay thÕ ký c¸c ký tù trong chuçi strNam tõ vÞ trÝ nPos ®Õn vÞ trÝ (nPos + //strlen(str) " 1) b»ng chuçi str;
Mét hµm constructor mÆc ®Þnh víi chuçi strName lµ rçng.
Hµm Insert còng hai hµm gièng nh hµm Overwrite nhng lµ chÌn t¹i vÞ trÝ nPos.
Vd: Insert("c",2); AABB -> AcABB
Insert("CC",2); AABB -> ACCABB
Bµi 2: ViÕt mét ch¬ng tr×nh khai b¸o hai líp CCircle vµ CRectangle. Hai líp nµy cã mét hµm friend Area ®Ó tÝnh tæng diÖn tÝch cña hai h×nh nµy, hµm nµy ®îc khai b¸o nh sau:
friend int Area(CCircle,CRectangle);
Bµi thùc hµnh:
BÀI THỰC HÀNH SỐ 4
Môc tiªu:
Đa năng hoá các toán tử.
Đa năng hoá toán tử gán.
Khởi tạo chép đối tượng.
Chuyển đổi kiểu với kiểu do người dùng định nghĩa.
BÀI TẬP THỰC HÀNH
4.1 Đa năng hoá toán tử
4.2 Đa năng hoá toán tử gán và khởi tạo chép đối tượng
4.3 Chuyển đổi kiểu với kiểu người dùng định nghĩa
Đa năng hoá toán tử
Các toán tử ++, --, <= , > +=, có thể đa năng hoá cho các kiểu dữ liệu người dùng định nghĩa như các lớp đối tượng. Các toán tử một ngôi và toán tử hai ngôi có thể đa năng hoá như sau:
Toán tử một ngôi (Unary Operators)
Chương trình sau sẽ đa năng hoá các toán tử ++ và --. Toán tử ++ chuyển các ký tự trong chuỗi ký tự thành các ký tự hoa, toán tử -- chuyển các ký tự trong chuỗi ký tự thành các ký tự thường.
Tạo file mới
Gõ đoạn chương trình sau
#include
#include
#include
class Converter
{
private:
char str[80];
public:
Converter()
{
strcpy(str,””);
}
Converter(char *s)
{
strcpy(str,s);
}
void display()
{
cout <
}
Converter operator ++() //dạng tiền tố
{
return (strupr(str));
}
Converter operator ++(int) //Hậu tố
{
Converter ss = str;
char *ptr = strupr(str);
strcpy (str, ptr);
return ss;
}
Converter operator -- () //dạng tiền tố
{
return (strlwr(str));
}
Converter operator --(int) //Hậu tố
{
Converter ss = str;
char *ptr = strlwr(str);
strcpy(str,ptr);
return ss;
}
};
void main()
{
clrscr();
Converter s1 = “changed to UPPERCASE”;
Converter s2 = “BACK TO LOWER CASE”;
Converter s3 = “that is all for now”;
Converter s4 = “ENDING ON A LOW NOTE”;
Converter s5;
int i, j;
++s1;
cout << “++s1 = “;
s1.display();
--s2;
cout<<”++s1 = “;
s2.display();
s5 = s3++;
cout << “Result of s5 = s3++ “<< endl << “s3 = “;
s3.display();
cout<<”s5 = “;
s5.display();
s4--;
cout<<”s4-- = “;
s4.display();
}
Lưu file với tên “danag411.cpp”
Dịch và chạy chương trình
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
++s1 = CHANGED TO UPPERCASE
++s1 = back to lower case
Result of s5 = s3++
s3 = THAT IS ALL FOR NOW
s5 = that is all for now
s4-- = ending on a low note
Trong chương trình trên chúng ta xây dựng lớp Converter có một thành phần dữ liệu là mảng ký tự. Chúng ta khai báo file string.h để sử dụng các hàm chuẩn về chuỗi.
Chúng ta sử dụng các hàm chuẩn về chuỗi: strupr() để chuyển chuỗi ký tự thành chuỗi ký tự hoa, strlwr() để chuyển các chuỗi ký tự thành các chuỗi ký tự thường.
Để trình biên dịch phân biệt được các toán tử ++, -- đứng trước hay là đứng sau, chúng ta sử dụng cú pháp sau:
operator++(); //dạng tiền tố operation
xác định toán tử đứng trước
operator++(int); //Hậu tố operation
xác định toán tử đứng sau. Tham số int chỉ là giả để trình biên dịch phân biệt hai hình thức trên.
Trong câu lệnh s5 = s3++ thì lệnh s5 = s3 sẽ thực hiện trước rồi đến lệnh s3++. Vì vậy kết quả in ra màn hình là:
s3 = THAT IS ALL FOR NOW
s5 = that is all for now
Đóng file “danag411.cpp”
Toán tử hai ngôi (Binary Operators)
Khi đa năng hoá toán tử hai ngôi, thành phần bên phải toán tử là tham số, thành phần bên trái toán tử là đối tượng thực hiện hàm.
Trong chương trình dưới đây, chúng ta sẽ đa năng hoá toán tử +=. Toán tử này kết hợp phép gán và phép cộng. Trong lệnh sau s3 = s1 += s2, s3 bằng s1 và có kết quả là s1 cộng với s2.
Tạo file mới
Gõ đoạn chương trình sau
#include
#include
#include
const SIZE = 80;
class CPhrase
{
private:
char str[SIZE];
public:
CPhrase() //constructors
{
strcpy(str,””);
}
CPhrase(char *s)
{
strcpy(str,s);
}
void display()
{
cout<
}
CPhrase operator +=(CPhrase aa) //overloaded +=
{
if (strlen(str) + strlen(aa.str)
{
strcat(str,aa.str);
return (*this);
}
else
{
cout<<”string is too long”;
return (*this);
}
}
};
void main()
{
clrscr();
CPhrase s1;
CPhrase s2 = “ Chao cac ban”;
s1+=s2;
s1.display();
s1 = “ Chuc suc khoe”;
CPhrase s3;
s3 = s1 += s2;
s3.display();
CPhrase s4;
CPhrase s5 = “ Xin moi vao”;
s4 = s2 += s5 += s5;
s4.display();
}
Lưu file với tên “danag412.cpp”
Dịch và chạy chương trình
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
Chao cac ban
Chuc suc khoe Chao cac ban
Chao cac ban Xin moi vao Xin moi vao
Nếu bạn chỉ sử dụng lệnh đơn giản là s1 += s2; thì trong hàm không cần trả về giá trị. Tuy nhiên để có được lệnh phức tạp hơn như s3 = s1 +=s2, s4 = s2 += s5 += s5 phải có kiểu trả về.
Đa năng hoá toán tử gán và khởi tạo chép đối tượng
Xây dựng lớp CString như sau:
Tạo file mới
Gõ đoạn chương trình sau
#include
#include
#include
class CString
{
private :
char* str;
public:
CString (char* s=””) //constructor
{
int size = strlen(s);
str = new char[size+1];
strcpy(str, s);
}
CString (CString &ss) // copy constructor
{
str = new char[strlen(ss.str) + 1];
strcpy(str, ss.str);
}
~CString() //destructor
{
delete str;
}
CString&operator = (CString& ss) //toán tử gán
{
delete str;
str = new char[strlen(ss.str) + 1];
strcpy(str, ss.str);
return *this;
}
void showstring()
{
cout << str<
}
};
void main()
{
clrscr();
CString s1 = “ Chao cac ban”;
cout <<”s1 = “;
s1.showstring();
CString s2(s1), s3;
s3 = s1;
cout << “s2 = “;
s2.showstring();
cout << “s3 = “;
s3.showstring();
CString s4 = s1;
cout << “s4 = “;
s4.showstring();
}
Lưu file với tên “con42.cpp”
Dịch và chạy chương trình
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
s1 = Chao cac ban
s2 = Chao cac ban
s3 = Chao cac ban
s4 = Chao cac ban
Chuyển đổi kiểu với kiểu người dùng định nghĩa
Chuyển đổi kiểu qua lại giữa kiểu cơ vản và kiểu đối tượng.
1.Tạo file mới
2.Gõ đoạn chương trình sau
#include
#include
#include
const SIZE = 80;
class CString
{
private:
char str[SIZE];
public:
CString ()
{
strcpy(str,””);
}
CString (char *s)
{
strcpy (str,s);
}
void getstr()
{
cout<< “Nhap vao chuoi: “;
cin >>str;
}
void display()
{
cout <
}
operator char*()
{
return (str);
}
};
void main()
{
clrscr();
CString s1;
char* p;
s1.getstr();
s1.display();
p = s1;
cout << “Chuoi p = “<
char n[15] = “Chuoi moi”;
s1 = n;
s1.display();
}
|
Lưu file với tên “con42.cpp”
Dịch và chạy chương trình
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
Nhap vao chuoi: hello
hello
Chia sẻ với bạn bè của bạn: |