Giới hạn của tham chiếu Truyền tham chiếu cho hàm Hàm trả về nhiều giá trị Hàm tạo bản sao Con trỏ và tham chiếu Tham chiếu con trỏ... THAM CHIẾU LÀ GÌ ? Là một bí danh của
Trang 1Ngôn ngữ lập trình C++1
Trang 2THAM CHIẾU (Reference)
Tham chiếu là gì?
Giới hạn của tham chiếu
Truyền tham chiếu cho hàm
Hàm trả về nhiều giá trị
Hàm tạo bản sao
Con trỏ và tham chiếu
Tham chiếu con trỏ
Trang 3THAM CHIẾU LÀ GÌ ?
Là một bí danh của biến khác
Khi tạo ra một tham chiếu, gán nó lên một đối tượng khác thì tham chiếu hoạt động như chính đối tượng đã gán đến nó
Cú pháp:
Kiểu &TênThamChiếu = MộtĐốiTượngĐãTồnTại;
Ví dụ:
Sinhvien sv_lop_T14A;
Sinhvien &sv1 = sv_lop_T14A;
Trang 4THAM CHIẾU LÀ GÌ ?
Địa chỉ của tham chiếu: là địa chỉ của đối tượng mà nó tham chiếu đến
Tương tự như trong thực tế khi một bí danh đã được gắn với một người nào đó cụ thể
Chú ý: không thể gán lại thêm một lần nữa tên của tham chiếu
cho một đối tượng khác
Trang 5GIỚI HẠN CỦA THAM CHIẾU
- Ví dụ các khai báo sau là sai
1) int &sn=int;
2) Sinhvien &sv1=Sinhvien;
1) int sn=20;
int &i=sn;
2) Sinhvien sv_lop_T14A;
Sinhvien &sv1 = sv_lop_T14A;
Trang 6TRUYỀN THAM CHIẾU CHO HÀM(1)
Nhắc lại về truyền tham trị:
Đối số truyền cho hàm là các giá trị
Câu lệnh return cho phép trả về một giá trị
void Doicho(int x, int y) { int tam;
tam=x;
x=y;
y=tam;
}
Giá trị của các đối số x, y chỉ được đổi chỗ cho nhau trong pham vi của hàm
Trang 7TRUYỀN THAM CHIẾU CHO HÀM(2)
Giải quyết bằng con trỏ
void Doicho(int *px, int *py);
{ int tam;
tam=*px;
*px=*py;
*py=tam;
}
Khi gọi hàm phải truyền đối số là con trỏ
int x=5,y=7;
Doicho(&x,&y);
Lúc này 2 giá trị x và y mới thực sự được đổi chỗ cho nhau
Trang 8TRUYỀN THAM CHIẾU CHO HÀM(3)
Giải quyết bằng truyền tham chiếu đến hàm: Đối tượng thực sự được truyền đến hàm
Có thể sửa đổi được giá trị của đổi tượng
void Doicho(int &x, int &y) { int tam;
tam=x;
x=y;
y=tam;}
Khi goi hàm, biến được truyền trưc tiếp, 2 giá trị x và y thực sự được đổi chỗ cho nhau
Doicho(x,y);
Trang 9HÀM TRẢ VỀ NHIỀU GIÁ TRỊ(1)
Hàm chỉ có thể trả về một giá trị
Chúng ta sẽ sử dụng kỹ thuật truyền tham chiếu để thay đổi các đối tượng ngoài ngay bên trong hàm, và như vậy hàm có thể
“trả về” nhiều giá trị
Sử dụng con trỏ
Sử dụng tham chiếu
Trang 10HÀM TRẢ VỀ NHIỀU GIÁ TRỊ(3)
void HinhTron(int r, int *dientich, int *chuvi) {
*dientich = 3.14 * r * r;
*chuvi = 2 * 3.14 * r;
}
Khi gọi hàm phải truyền địa chỉ
RutgonPS(r, &dt,&cv);
Trang 11HÀM TRẢ VỀ NHIỀU GIÁ TRỊ(4)
void HinhTron(int r, int &dientich, int &chuvi) {
dientich = 3.14 * r * r;
chuvi = 2 * 3.14 * r;
}
RutgonPS(r, dt, cv);
Trang 12HÀM TẠO BẢN SAO (1) (copy constructor)
Hàm tạo bản sao:
Sinhvien::Sinhvien() {
Cout<<“Ham tao\n”;
} Sinhvien::Sinhvien(Sinhvien&) {
Cout<<“Ham tao ban sao\n”;
}
Trang 13HÀM TẠO BẢN SAO (2)
Đối số ở dạng tham trị hoặc khi hàm trả về giá trị thì một bản sao của đối số sẽ được tạo ra
Nếu đối số là đối tượng của lớp thì hàm tạo bản sao sẽ được gọi
Giả sử có 2 hàm
Sinhvien Ham1(Sinhvien sv);
Sinhvien Ham2(Sinhvien *sv);
Khi hàm 1 được gọi, phải truyền đối số ở dạng tham trị nên hàm tạo bản sao được gọi
Khi hàm 2 được gọi, truyền đối số ở dạng tham chiếu, hàm tạo bản sao không được gọi
Trang 14CON TRỎ & THAM CHIẾU
Qua các ví dụ đã phân tích, việc sử dụng con trỏ và tham chiếu cho ta kết quả giống nhau
Nên sử dụng tham chiếu thay cho con trỏ nếu có thể
Nếu ta làm việc với nhiều đối tượng, chỉ có cách duy nhất là
sử dụng con trỏ
Hơn nữa tham chiếu không thể nhận giá trị null
Trang 15THAM CHIẾU CON TRỎ (Pointer Reference)
giá trị địa chỉ trong con trỏ.
Ví dụ:
void Doicho(Sinhvien *&sv1, Sinhvien *&sv2)
{ SinhVien *temp;
temp = sv1;
sv1 = sv2;
sv2 = temp;
}
Trang 16Bài tập
1.Xây dựng lớp hình chữ nhật với các thuộc tính sau: Xtt,Ytt,
Xpd, Ypd- là tọa độ trái-trên, phải-dưới của một hình chữ nhật
Với các phương thức sau: Hàm tạo, Hàm hủy, Phương thức đặt giá trị cho các thuộc tính, và phương thức lấy giá trị của các thuộc
tính(dùng tham chiếu và con trỏ) Viết chương trình minh họa
2 Viết chương trình xây dựng lớp Điểm trong không gian 2 chiều với các thuộc tính sau: hoành độ x, tung độ y là các số thực Với các phương thức sau: hàm tạo, hàm hủy, phương thức đặt giá trị cho x và y, phương thức lấy giá trị x, phương thức lấy giá trị y và phương thức lấy cả 2 giá trị x, y Viết chương trình minh họa