Từ C đến C++,
Từ C đến C++Lập trình hướng đối tượng@ 2004 Trần Minh Châu. FOTECH. VNU2Tài liệu đọcn Eckel, Bruce. Thinking in C++, 2nd Ed. Volume 1.¨ Chapter 3: The C in C++¨ Chapter 8: Constantsn Up to p. 352: Classes¨ Chapter 10: Name Controln Up to p. 423: Static members in C++¨ Chapter 13: Dynamic Object Creationn Up to p. 566: Overloading new & delete¨ Chapter 11: References and the Copy-Constructorn Up to p. 452: References in Functions @ 2004 Trần Minh Châu. FOTECH. VNU3Khác biệt đối với Cn Các khác biệt đối với C (ngoài các đặc điểmhướng đối tượng)¨ Chúthích¨ Các kiểu dữ liệu¨ Kiểm tra kiểu, đổi kiểu¨ Cảnh báo của trình biên dịch¨ Phạm vi vàkhai báo¨ Không gian tên¨ Hằng¨ Quản lý bộ nhớ¨ Tham chiếu@ 2004 Trần Minh Châu. FOTECH. VNU4Chúthíchn Bên cạnh chúthích kiểu C (nhiều dòng),C++ cho phép kiểu chúthích dòng đơn C C++/* This is a variable */int x;/* This is the variable* being given a value */x = 5;// This is a variableint x;// This is the variable// being given a valuex = 5; @ 2004 Trn Minh Chõu. FOTECH. VNU5Chỳthớchn C++ cho phộp kiu chỳthớch /* */ baongoi cỏc chỳthớch dũng n.C C++/*/* This is a variable */int x;/* This is the variable* being given a value */x = 5;*//*// This is a variableint x;// This is the variable// being given a valuex = 5;*/Chỳthớch cúli@ 2004 Trn Minh Chõu. FOTECH. VNU6Kiu d liun Kiu giỏtr Boolean: boolă Hai giỏtr: true hoc falseă Cỏc toỏn t logic (!, &&, .) ly/to mt giỏtr boolă Cỏc phộp toỏn quan h (==, <, .) to mt giỏtrboolă Cỏc lnh iu kiu (if, while, .) ũi hi mt giỏtrbooln tng thớch ngc vi C, C++ ngm chuynt int sang bool khi cnă Giỏtr 0 falseă Giỏtr khỏc 0 true @ 2004 Trần Minh Châu. FOTECH. VNU7Kiểm tra kiểu dữ liệun C++ kiểm soát kiểu dữ liệu chặt chẽ hơn Cn C++ đòi hỏi hàm phải được khai báo trước khi sử dụng(mọi lời gọi hàm được kiểm tra khi biên dịch)n C++ không cho phép gán giátrị nguyên cho các biếnkiểu enumenum Temperature {hot, cold};enum Temperature t = 1; // Error in C++n C++ không cho phép các con trỏ không kiểu (void*) sửdụng trực tiếp tại bên phải lệnh gán hoặc một lệnh khởitạovoid * vp;int * ip = vp; // Error: Invalid conversion@ 2004 Trần Minh Châu. FOTECH. VNU8Đổi vàép kiểu dữ liệun C++ cho phép người dùng đổi kiểu dữ liệu một cách khárộng rãin Trình biên dịch tựđộng thực hiện nhiều chuyển đổi dễthấy:¨ Gán một giátrị thuộc kiểu số học này cho một biến thuộc kiểukhác¨ Các kiểu số học khác nhau cùng cótrong các biểu thức¨ Truyền đối số cho các hàmn Nếu hiểu rõ khi nào các chuyển đổi này xảy ra vàtrìnhbiên dịch đang làm gì,ta cóthể giải thích được các kếtquả khôngmong đợi @ 2004 Trần Minh Châu. FOTECH. VNU9Đổi vàép kiểu dữ liệun Tựđộng chuyển đổi từ các đối tượng nhỏ thành các đốitượng lớn thìkhông cóvấnđề gì, chiều ngược lại cóthểcóvấnđề¨ short → long (~16 bits → ~32 bits) không cóvấnđề¨ long → short (~32 bits → ~16 bits) cóthể mất dữ liệu¨ Khi chuyển từ các kiểu chấm động sang các kiểu nguyên cóthểlàm giảm độ chính xác của dữ liệun Trình biên dịch sẽ sinh cảnh báo (warning) đối với cácchuyển đổi tựđộng cóthể gây mất dữ liệu.@ 2004 Trần Minh Châu. FOTECH. VNU10Đổi vàép kiểu dữ liệun C++ cho phép người dùngép kiểu một cách tường minh bằng nhiềucách¨ Ép kiểu kiểu C: myInt = (int) myFloat;¨ Ép kiểu kiểu hàm C++: myInt = int(myFloat);n Để hạn chế ép kiểu quámức vàloại trừ các lỗi doép kiểu, C++cung cấp một cách mới sử dụng 4 loạiép kiểu tường minh¨ static_cast¨ const_cast¨ reinterpret_cast¨ dynamic_castn Cúpháp myInt = static_cast<int>(myFloat) @ 2004 Trần Minh Châu. FOTECH. VNU11Phạm vi vàcác Khai báon Trong C, các biến phải được định nghĩa tại đầu file hoặctại bắt đầu của một khối {…}n C++ cho phép khai báo sau vàphạm vi của các biếnđược giới hạn chính xác hơn¨ Các khai báo cóthểđặt tại các câu lệnh lặp for vàcác câu lệnhđiều kiện¨ Phạm vi giới hạn bên trong vòng lặp hoặc khối điều kiệnn C++ còn bổ sung hai phạm vi mới:¨ Phạm vi không gian tên-Namespace scope¨ Phạm vi lớp-Class scope@ 2004 Trần Minh Châu. FOTECH. VNU12Namespace-Không gian tênn Không gian tên được bổ sung vào C++ để biểu diễn cấutrúc logic vàcung cấp khả năng quản lý phạm vi tốt hơnn Không gian tên cung cấp một cơ chế tường minh để tạocác vùng khai báon Các tên khai báo trong một không gian tên¨ không xung đột với các tên đượckhai báo trong các không gian tên khác¨ Tránh xung đột tên biến, tên hàm¨ Nghiễm nhiên cóthểđượcliên kết ra ngoài (external linkage)namespace Frog {double weight;double jump() {…}}namespace Kangaroo {int weight;void jump() {…}} @ 2004 Trần Minh Châu. FOTECH. VNU13Namespacen Vídụnamespace Frog {double weight;double jump() {…}}namespace Kangaroo {int weight;void jump() {…}}int main(){Frog::weight = 5;Kangaroo::jump();}weight trong namespaceFrog và weight trongnamespace Kangaroo độclập vàkhông bị xung độtKhi sử dụng định danh,dùng tên namespace vàtoán tử phạm vi@ 2004 Trần Minh Châu. FOTECH. VNU14Namespacen C++ cung cấp hai cơ chếđểđơn giản hóaviệc sử dụng các namespaces: các khaibáo using vàcác định hướng using.n khai báo using (using-declaration) chophép truy nhập một định danh cụ thể trongvùng khai báo tạm thờiusing <namespace>::<name>;¨Từđây, ta cóthể sử dụng tên màkhông cầnmỗi lần đều phải chỉ rõ namespace chứa nó. @ 2004 Trần Minh Châu. FOTECH. VNU15Namespacen Vídụsửdụng khai báo usingnamespace Frog {double weight;double jump() {…}}int main(){using Frog::weight;int weight; // Error (already declared locally)weight = 5; // Sets Frog::weight to 5}Từđây, weight đượchiểu là Frog::weightKhai báo using cho địnhdanh weight trongnamespace Frog.@ 2004 Trần Minh Châu. FOTECH. VNU16Namespacen Khai báo using dành cho 1tên, định hướngusing cho phép truy nhập mọi định danh trongnamespaceusing namespace <namespace>;n Định hướng using thường được đặt tại mứctoàn cục.#include <iostream>using namespace std;… @ 2004 Trần Minh Châu. FOTECH. VNU17Quản lý bộ nhớn Cấp phát bộ nhớđộng trong C trông rối rắm vàdễlỗi¨myObj* obj = (myObj*)malloc(sizeof(myObj));n Các nhàthiết kế C++ thấy rằng:¨ Một ngôn ngữ sử dụng class sẽ hay phải sử dụng bộ nhớđộng.¨ Không cólý do gì để tách cấp phát bộ nhớđộng ra khỏi việckhởi tạo đối tượng (hay tách thu hồi bộ nhớđộng ra khỏi việchủy đối tượng)n malloc và free đã được thay bằng new và delete@ 2004 Trần Minh Châu. FOTECH. VNU18Quản lý bộ nhớn Lợi thế của new so với malloc:¨ Không cần chỉ ra lượng bộ nhớ cần cấp phát¨ Không cần đổi kiểu¨ Không cần dùng lệnh if để kiểm tra xem bộ nhớđãhết chưa¨ Nếu bộ nhớđang được cấp cho một đối tượng, hàm khởi tạo(constructor) của đối tượng sẽđược gọi tựđộng (tương tự,delete sẽ tựđộng gọi hàm hủy (destructor) của đối tượng)n Vídụ:myObj* obj = new myObj;//một đối tượngdelete obj;myObj* obj = new myObj[10];// mảng đối tượngdelete[] obj; @ 2004 Trần Minh Châu. FOTECH. VNU19Tham chiếu–Referencen Tham chiếu tới một đối tượng làmột biệt danh tới đốitượng đón Cóthể coi mọi thao tác trên tham chiếu đều được thựchiện trên chính đối tượng nguồn.int x = 5;int& y = x;cout <<“x =“<< x <<“y =“<< y <<“.\n”; // x = 5 y = 5x = x + 1;cout <<“x =“<< x <<“y =“<< y <<“.\n”; // x = 6 y = 6y = y + 1;cout <<“x =“<< x <<“y =“<< y <<“.\n”; // x = 7 y = 7int *p = &y;*p = 9;cout <<“x =“<< x <<“y =“<< y <<“.\n”; // x = 9 y = 9@ 2004 Trần Minh Châu. FOTECH. VNU20Tham chiếu–Referencen Tham chiếu cóthểđược dùng độc lập nhưng thường hay đượcdùng làm tham số cho hàmn C truyền mọi đối số cho hàm bằng giátrị (truyền trị -call by value)¨ Khi cần, ta cóthể truyền một con trỏ tới đối tượng (chính nócũng đượctruyền bằng giátrị)¨ void myFunction(myObj* obj) {…}n C++ cho phép các đối số hàm được truyền bằng tham chiếu (call byreference)¨ void myFunction(myObj& obj) {…}¨ myObj& cónghĩa“tham chiếu tới myObj”¨ đối với các đối số làcác đối tượng lớn, truyền bằng tham chiếu đỡ tốnkém hơn truyền bằng giátrị (do chỉ truyền địa chỉ bộ nhớ) [...]... c c chuyển đổi này xảy ra vàtrình biên dịch đang làm gì,ta c thể giải thích đư c c c kết quả khôngmong đợi @ 2004 Trần Minh Châu. FOTECH. VNU 25 Const Hằng c a ANSI -C v C+ + c c c quy t c phạm vi kh c nhau n C c giátrị #define c phạm vi file (do trình tiền xử lý chỉ th c hiện tìm vàthay thế tại file đó) n const c a ANSI -C đư c coi lc c bin c giỏtr khụng i vcúphm vi chng trỡnh ă Do úta khơng thể c c c. .. liệu n C+ + cho phép người dùngép kiểu một c ch tường minh bằng nhiu c ch ă ẫp kiu kiu C: myInt = (int) myFloat; ă ẫp kiểu kiểu hàm C+ +: myInt = int(myFloat); n Để hạn chế ép kiểu quám c vàloại trừ c c lỗi doép kiểu, C+ + cung c p một c ch mới sử dụng 4 loạiép kiểu tường minh ă static_cast ă const_cast ă reinterpret_cast ă dynamic_cast n C phỏp myInt = static_cast<int>(myFloat) @ 2004 Trần Minh Châu.... đổi từ c c đối tượng nhỏ thành c c i tng ln thỡkhụng c vn gỡ, chiu ngc li c th c vn ă short long (~16 bits ~32 bits) khụng c vn ă long → short (~32 bits → ~16 bits) c thể mất d liu ă Khi chuyn t c c kiu chm ng sang c c kiểu ngun c thể làm giảm độ chính x c của dữ liệu n Trình biên dịch sẽ sinh c nh báo (warning) đối với c c chuyển đổi tựđộng c thể gây mất dữ liệu. @ 2004 Trần Minh Châu. FOTECH. VNU 10 Đổi... thể c c c biến trùng tên tại hai file kh c nhau n Trong C+ +, c c định danh const tuân theo c c quy tc phm vi nh c c bin kh c ă Do ú, chúng c thể c phạm vi tồn c c, phạm vi khơng gian tên, ho c phạm vi khối @ 2004 Trần Minh Châu. FOTECH. VNU 26 const vàcon trỏ n Ba loại: 1. const int * pi;// con trỏ tới hằng 2. int * const ri = &i; // hằng con trỏ 3. const int * const ri = &i; //hằng con trỏ... Trần Minh Châu. FOTECH. VNU 7 Kiểm tra kiểu dữ liệu n C+ + kiểm soát kiểu dữ liệu chặt chẽ hơn C n C+ + đòi hỏi hàm phải đư c khai báo trư c khi sử dụng (mọi lời gọi hàm đư c kiểm tra khi biên dịch) n C+ + không cho phép gán giátrị nguyên cho c c biến kiểu enum enum Temperature {hot, cold}; enum Temperature t = 1; // Error in C+ + n C+ + không cho phép c c con trỏ không kiểu (void*) sử dụng tr c tiếp tại... lệnh gán ho c một lệnh khởi tạo void * vp; int * ip = vp; // Error: Invalid conversion @ 2004 Trần Minh Châu. FOTECH. VNU 8 Đổi vàép kiểu dữ liệu n C+ + cho phép người dùng đổi kiểu dữ liệu một c ch khá rộng rãi n Trình biờn dch tng thc hin nhiu chuyn i d thy: ă Gỏn một giátrị thu c kiểu số h c này cho một biến thuc kiu kh c ă C c kiu s hc kh c nhau c ng c trong c c biu thc ă Truyn i s cho c c hm n Nu... Date::getDay() const { return day; } Lưu ý: c c yêu c u trênáp dụng cho tất c c c bài tập, bài thi c a môn h c. @ 2004 Trần Minh Châu. FOTECH. VNU 29 hằng tham chiếu làm tham số hàm void non_constRef(LargeObj &Lo) { cout Lo.height; } void constRef(const LargeObj &Lo) { cout Lo.height; } int main { LargeObj dinosaur; const LargeObj rocket; non_constRef(dinosaur); constRef(dinosaur); non_constRef(rocket);//... Đối với c c đối tượng đư c khai báo làhằng, C+ + chỉ cho phép gọi c c hàm thành viên làhằng màkhông cho phép gọi c c hàm thành viên không phải làhằng c a đối tượng đó. class Date { int year, month, day; public: int getDay() const { return day; } int getMonth() const { return month; } void addYear(int y) // Non-const function }; @ 2004 Trần Minh Châu. FOTECH. VNU 9 Đổi vàép kiểu dữ liệu n Tựđộng chuyển... //hằng con trỏ tới hằng n C c khái niệm c n ghi nhớ: n Nu mt i tng lhng ă Khụng th sa i tng ú ă Ch c con tr ti hng mi c dựng trỏ tới hằng, con trỏ thường không dùng đư c n Nếu PI c khai bỏo lcon tr ti hng: ă C th thay i PI, nhng *PI khụng th b thay i. ă PI c th tr đến hằng ho c biến thường @ 2004 Trần Minh Châu. FOTECH. VNU 21 Tham chiếu–Reference n Vídụ: tham chiếu làm đối số cho hàm int f(int &i)... Châu. FOTECH. VNU 14 Namespace n C+ + cung c p hai c chếđểđơn giản hóa vi c sử dụng c c namespaces: c c khai báo using v c c định hướng using. n khai báo using (using-declaration) cho phép truy nhập một định danh c thể trong vùng khai bỏo tm thi using <namespace>::<name>; ăTõy, ta c th s dng tờn màkhơng c n mỗi lần đều phải chỉ rõ namespace chứa nó. . tới char¨ const char *pcc; // pcc làcon trỏ tới hằng char¨ const char *const cpcc = & ;c; // cpcc làhằngcon trỏ tớihằng char@ 2004 Trần Minh Châu. FOTECH.. c nghĩa con trỏ làhằngn C ch dễ hơn: đ c c c khai báo từ phải sang trái¨ char c = 'Y'; // c làchar¨ char *const cpc = & ;c; //cpc làhằng con trỏ