Con trỏ this

Một phần của tài liệu Lập trinh C cơ bản (Trang 73 - 79)

6. 2: Hàm bạn (friend function)

8.2.Con trỏ this

Cũng giống như phương thức thông thường, phương thức toán tử có đối đầu tiên (đối không tường minh) là con trỏ this.

Các phương thức toán tử một toán hạng :dùng ngay con trỏ this để biểu thị toán hạng duy nhất này, nên trong phương thức sẽ không có đối tường minh. Ví dụ phương thức toán tử - (đổi dấu) một đối tượng kiểu SP (số phức) có thể viết như sau :

class SP { private : double a ;//phần thực double b ;//phần ảo public : SP operator-() ; } ; SP SP ::operator-() { SP u ; u.a=-this->a ; u.b=-this->b ; return u ; } cách dùng : SP u,v ; u=-v ; 8.4.Toán tử có 2 toán hạng

Các phương thức toán tử hai toán hạng : con trỏ this ứng với toán hạng thứ nhất, nên trong phương thức chỉ cần dùng 1 đối tường minh để biểu thị toán hạng thứ hai. Ví dụ phương thức toán tử + (cộng) hai đối tượng kiểu SP (số phức) có thể viết như sau : class SP { private : double a ;//phần thực double b ;//phần ảo public : SP operator+(SP u2) ; } ; SP SP ::operator-() { SP u ; u.a=-this->a +u2.a; u.b=-this->b +u2.b; return u ; } Cách dùng : SP p,q,r ; r=p+q ; 8.5. Lớp DT (đa thức)

Chương trình sau sẽ định nghĩa lớp DT đa thức và đưa vào các phương thức,hàm : +Các thuộc tính :

int n ; //bậc của đa thức

double *a ; //Trỏ tới vùng nhớ chứa các hệ số của đa thức +Các phương thức :

operator+,operator- :dùng để đổi dấu các hệ số của đa thức operator+ :cộng 2 đa thức

operator- :trừ 2 đa thức operator* :Nhân 2 đa thức

operator^ :tính giá trị của đa thức

operator[] : cho biết bậc và các hệ số của đa thức +Các hàm bạn :

operator<< :dùng để in các hệ số của đa thức operator>> : dùng để nhập các hệ số của đa thức + Hàm (tự do)

double F(DT p,double x) dùng để tính p(x)_giá trị của đa thức tại x +Nói thêm về phương thức chỉ số và hàm tự do F

-Nếu p là đối tượng của lớp DT, thì hàm chỉ số cho biết : p[-1]=double(n)

p[i]=a[i], i=0,1,...,n

-Hàm tự do F sẽ dùng phương thức chỉ số để xác định n, các hệ số đa thức và dùng chúng để tính giá trị của biểu thức

+Trong chương trình sử dụng hàm new để cấp phát vùng nhớ chứa hệ số của đa thức +Nội dung của chương trình gồm :

-Nhập,in các đa thức p,q,r,s -Tính đa thức :f=-(p+q)*(r-s) -Nhập các số thực x1 và x2

-Tính f(x1) bằng cách dùng phương thức operator^ -Tính f(x2) bằng cách dùng hàm F

//Chương trình được viết như sau : Code: #include<iostream.h> #include<conio.h> #include<math.h> class DT { private :

int n ; //Bac cua da thuc

double *a ; //Tro toi vung nho chua he so cua da thuc :a0,a1,...

public :

friend ostream& operator<<(ostream& os,const DT &d) ; friend istream& operator>>(istream& is,DT &d) ;

DT operator-() ;

DT operator+(const DT &d2) ; DT operator-(DT d2) ;

DT operator*(const DT &d2) ;

double operator^(const double &x) ;//tinh gia tri cua da thuc double operator[](int i) { if(i<0) return double(n) else return a[i] ; } } ;

//Ham tinh gia tri cua da thuc double F(DT d,double x)

{

double s=0.0,t=1.0 ; int n ; (adsbygoogle = window.adsbygoogle || []).push({});

n=int(d[-1]) ;

{ s+=d[i]*t ; t*=x ; } return s ; }

ostream& operator<<(ostream& os,const DT &d) {

os<< » Cac he so (tu a0) : » ; for(int i=0 ;i<=d.n ;i++) os<<d.a[i]<< » « ; return os ;

}

istream& operator>>(istream& is,DT &d) {

cout<< »\n bac cua da thuc : « ; cin>>d.n ;

d.a=new double[d.n+1] ;

cout<< »\n nhap cac he so cua da thuc : \n ; for(int i=0 ;i<=d.n ;i++)

{

cout<< »\n he so bac « <<i<< » = « ; is>>d.a[i] ; } return is ; } DT DT ::operator-() { DT p ; p.n=n ; p.a=new double[n+1] ; for(int i=0 ;i<=n ;i++) p.a[i]=-a[i] ; return p ; } DT DT ::operator+(const DT &d2) { DT d ; int k,i ; k=n>d2.n ?n ::d2.n ; d.a=new double[k+1] ; for(i=0 ;i<=k ;i++) if(i<=n&&i<=d2.n) d.a[i]=a[i]+d2.a[i] ; else if(i<=n) d.a[i]=a[i] ; else d.a[i]=d2.a[i] ; i=k ; while(i>0&&d.a[i]==0.0) –i ; d.n=i ; return d ; } DT DT ::operator-(DT d2) {

return(*this+(-d2)) ; } DT DT ::operator*(const DT &d2) { DT d ; int k,i,j ; k=d.n=n+d2.n ; d.a=new double[k+1] ;

for(i=0 ;i<=k ;i++) d.a[i]=0 ; for(i=0 ;i<=n ;i++)

for(j=0 ;j<=d2.n ;j++)

d.a[i+j]+=a[i]*d2.a[j] ; return d ;

}

double DT ::operator^(const double &x) {

double s=0.0,t=1.0 ; for(int i=0 ;i<=n ;i++) { s+=a[i]*t ; t*=x ; } return s ; } void main() { DT p,q,r,s,f ; double x1,x2,g1,g2 ; clrscr() ;

cout<< »\n nhap da thuc P « ;cin>>p ; cout<< »\n Da thuc P » <<p ;

cout<< »\n nhap da thuc Q « ;cin>>q ; cout<< »\n da thuc Q : « <<q ;

cout<< »\n nhap da thuc R « ;cin>>r ; cout<< »\n Da thuc R » <<r ;

cout<< »\n nhap da thuc S « ;cin>>s ; cout<< »\n Da thuc S » <<s ;

f=-(p+q)*(r-s) ;

cout<< »\n nhap so thuc x1 : « ;cin>>x1 ; cout<< »\n nhap so thuc x2 : « ;cin>>x2 ; g1=f^x1 ; g2=F(f,x2) ; cout<< »\n Da thuc F « <<f ; cout<< »\n f(« <<x1<< »)= « <<g1 ; cout<< »\n f(« <<x2<< »)= « <<g2 ; getch() ; } __________________

gogo! hoan hô nào, vỗ tay nào

Nào thì chúng ta cùng hoan hô nào vỗ tay nào

Chương này trình bày một số vẫn đề có tính chuyên sâu hơn về lớp như : + hàm tạo (constructor)

+ toán tử gán và hàm tạo sao chép

+ mối liên quan giữa hàm tạo và đối tượng thành phần + Các thành phần tĩnh

+ lớp bạn,hàm bạn + đối tượng hằng + phương thức inline (adsbygoogle = window.adsbygoogle || []).push({});

bài 1 : Hàm tạo (constructor) 1.1.Công dụng

Hàm tạo cũng là một phương thức của lớp (nhưng khá đặc biệt) dùng để tạo dựng một đối tượng mới. Chương trình dịch sẽ cấp phát bộ nhớ cho đối tượng sau đó sẽ gọi đến hàm tạo. Hàm tạo sẽ khởi gán giá trị cho các thuộc tính của đối tượng và thực hiện một số công việc khác nhằm chuẩn bị cho đối tượng mới.

1.2.Cách viết hàm tạo

1.2.1 : Điểm khác nhau của hàm tạo và các phương thức thông thường

Khi viết hàm tạo ta cần chú ý 3 sự khác nhau giữa hàm tạo so với các phương thức khác như sau :

+Tên của hàm tạo : Bắt buộc tên hàm tạo phải trùng với tên của lớp +Không khai báo kiểu cho hàm tạo

+Hàm tạo không có kết quả trả về

1.2.2 : Điểm giống nhau của hàm tạo và các phương thức thông thường

Ngoài 3 điểm khác nhau trên thì hàm tạo được viết giống như các phương thức khác : +Hàm tạo có thể được xây dựng bên trong hoặc bên ngoài định nghĩa lớp

+Hàm tạo có thể có đối hoặc không có đối

+Trong một lớp có thể có nhiều hàm tạo (cùng tên nhưng khác bộ đối) Để minh hoạ cho các điều vừa nói ta xet ví dụ sau :

giả sử ta có một lớp DIEM_DH (điểm đồ hoạ) có 3 thuộc tính như sau : int x ; //hoành độ (hàng) của điểm

int y ; //tung độ (cột) của điểm int m ; //mã mầu của điểm

Và bây giờ ta đưa vào 2 hàm tạo để khởi gán cho các thuộc tính của lớp,

vì ở đây chúng ta đang làm quen với hàm tạo nên chúng ta không nhất thiểt phải quan tâm xem xây dựng 2 hàm đó để làm gì _tức là công dụng của 2 hàm đó,mà chúng ta chỉ quan tâm xem hàm đó xây dựng như thế nào.

Hàm thứ nhất : là hàm tạo không đối,dùng các giá trị cố định để khởi gán cho x,y,m Hàm thứ hai : là hàm tạo có đối,dùng các đối x1,y1,m1 để khởi gán giá trị cho x,y và mặc định m1=15 (mầu trắng)

Và để minh hoạ cho vị trí của hàm tạo,hàm không đối sẽ được viêt bên trong định nghĩa lớp,còn hàm có đối sẽ được xây dựng bên ngoài định nghĩa lớp.

class DIEM_DH { private : x,y,m ; public : DIEM_DH() {

x=y=0 ; //khởi gán giá trị cho x và y là 0 m=1 ; //Khởi gán giá trị cho m là 1 }

DIEM_DH(int x,int y,int m=15) ; // Các phương thức khác nếu có } ;

{

x=x1 ;y=y1 ;m=m1 ; }

1.3.Dùng hàm tạo trong khai báo

+ Sau khi đã xây dựng được các hàm tạo , ta có thể dùng chúng trong khai báo để tạo ra 1 đối tượng,đồng thời khởi gán cho các thuộc tính của đối tượng được tạo. Dựa vào các tham số trong khai báo mà trình biên dịch biết sẽ phải gọi đến hàm tạo nào. + Khi khai báo một biến đối tượng có thể sử dụng các tham số để khởi gán cho các thuộc tính của biến đối tượng.

+ Khi khai báo mảng đối tượng không cho phép dùng các tham số để khởi gán + Câu lệnh khai báo một biến đối tượng sẽ gọi tới hàm tạo một lần.

+ Câu lệnh khai báo một mảng n đối tượng sẽ gọi tới hàm tạo n lần ví dụ :

DIEM_DH d: // Gọi tới hàm tạo không đối,kết quả d.x= d.y =0 , d.m=1

DIEM_DH u(200,100,4) ;// gọi tới hàm tạo có đối,kết quả u.x=200,u.y=100,u.m=4 DIEM_DH v(300,250) ;// Gọi tới hàm tạo có đối,kết quả v.x=300,v.y=250,v.m=15 DIEM_DH p[10] ; // Gọi tới hàm không đối 10 lần

Chú ý : Với các hàm có đối kiểu lớp,thì đối chỉ xem là tham số hình thức, vì vậy khai báo đối (trong dòng đầu của hàm) sẽ không tạo ra đối tượng mới và do đó không gọi tới hàm tạo

(adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Lập trinh C cơ bản (Trang 73 - 79)