Tải bản đầy đủ (.pdf) (32 trang)

CHƯƠNG 2:NHỮNG MỞ RỘNG CỦA C+ ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (16.87 MB, 32 trang )

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
Giới thiệu những điểm khác biệt chủ yếu giữa C và C++
Các điểm mới của C++ so với C
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
1. CÁC ĐIỂM KHÔNG TƯƠNG THÍCH GIỮA C++ VÀ ANSI C
1.1 Định nghĩa hàm
Trong định nghĩa hàm ANSI C cho phép hai kiểu khai báo dòng tiêu đề của hàm,
trong khi đó C++ chỉ chấp nhận một cách
/* C++ không khai báo kiểu này *//* C++ không khai báo kiểu này */
double ham(a,b)double ham(a,b)
int a;int a;
double bdouble b ;;
/* Cả C và C++ cho phép*//* Cả C và C++ cho phép*/
double ham(int a, double b)double ham(int a, double b)
int a;int a;
double b;double b;
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
1. CÁC ĐIỂM KHÔNG TƯƠNG THÍCH GIỮA C++ VÀ ANSI C
1.2 Khai báo hàm nguyên mẫu
- Tronc C chỉ cần khai báo tên hàm và giá trị trả về, không cần danh sách kiểu
của các tham số
- C++ khai báo hàm nguyên mẫu
Với C++ một lời gọi hàm chỉ được chấp nhận khi trình biên dịch biết được kiểu
của các tham số, kiểu của giá trị trả về
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
1. CÁC ĐIỂM KHÔNG TƯƠNG THÍCH GIỮA C++ VÀ ANSI C
1.2 Khai báo hàm nguyên mẫu


Chuyển kiểu tự động theo nguyên tắc sau:
char -> int ->longint -> float ->double
Ví dụ:
double ham(int , double) /* khai báo hàm ham*/
….
main()
{
int n;
char c;
double x, x1, x2,x3;
x1=ham(n,x); /* không có chuyển đổi kiểu*/
x2=ham(c,x); /* có chuyển đổi kiểu từ char->int*/
x3=ham(x,n); /* có chuyển đổi kiểu từ double ->int và từ int thành double */
….
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
1. CÁC ĐIỂM KHÔNG TƯƠNG THÍCH GIỮA C++ VÀ ANSI C
1.3 Sự tương thích giữa con trỏ void và các con trỏ khác
Trong ANSI C, kiểu void tương thích với các kiểu con trỏ khác cả hai chiều
Ví dụ:
void *g;
int *i;
Phép gán sau là hợp lệ
g=i ;
i=g ;
Trong C++ chỉ có chuyển đổi kiểu ngầm định từ một kiểu con trỏ tùy ý thành void*,
còn ngược lại phải thực hiện chuyển đổi kiểu tường minh.
Ví dụ:
g=i;
i=(int*)g;

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
Trong tệp tiêu đề isotream.h người ta định nghĩa hai đối tượng cout và cin tương
ứng với hai thiết bị chuẩn ra vào được sử dụng cùng với << và >>. Thường thì ta
hiểu cout là màn hình còn cin là bàn phím
2.1 Ghi dữ liệu ra thiết bị chuẩn cout
Ví dụ 1 :
#include <isostream.h>
main()
{
cout << “Hello C++”;
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.1 Ghi dữ liệu ra thiết bị chuẩn cout
Sử dụng cout và << đưa ra các giá trị khác nhau
Ví dụ 2 :
#include <iostream.h>
void main()
{
int n=25;
cout << “value :“;
cout << n;
}
Ví dụ 3 :
#include <iostream.h>
void main()
{

int n=25;
cout << “value :“<<n ;
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.1 Các khả năng viết ra trên cout
Có thể sử dụng toán tử << cùng với cout để đưa ra màn hình giá trị của một biểu
thức có các kiểu sau :
 Kiểu cơ sở (char, int, float, double)
 Xâu ký tự (char *)
 Con trỏ (trừ con trỏ char *)
Trong trường hợp muốn đưa ra địa chỉ của xâu ký tự phải thực hiện việc chuyển đổi
kiểu tường minh (char*)->(void*)
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.1 Các khả năng viết ra trên cout
Ví dụ:
#include <iostream.h>
void main()
{
int n=25;
long p=250000;
unsigned q=63000 ;
char c=’a’ ;
float x=12.3456789;
double y=12.3456789e16;
char *st= “Hello C++”;
int *ad=&n ;

cout <<”Gia tri cua n :” <<n<< “\n”;
cout <<”Gia tri cua p :” <<p<<”\n”;
cout <<”Gia tri cua c :” <<c<<”\n”;
cout <<”Gia tri cua q :” <<q<<”\n”;
cout <<”Gia tri cua x :” <<x<<”\n”;
cout <<”Gia tri cua y :” <<y<<”\n”;
cout <<”Gia tri cua st :” <<st<<”\n”;
cout <<”Dia chi cua ad :” <<ad<<”\n”;
cout <<”Dia chi cua st :”
<<(void*)st<<”\n”;
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.2 Đọc dữ liệu từ thiết bị chuẩn cin
Ví dụ 1:
int n;
cin>>n;
Ví dụ 2:
int n ;
float p ;
char c ;
cin>>c>>n>>p ;
Dùng toán từ >> để nhập dữ liệu cho các kiểu char, int, float, double và char*
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.2 Đọc dữ liệu từ thiết bị chuẩn cin
Giống với hàm scanf(), cin tuân theo một số qui ước dùng trong việc phân tích các
ký tự

 Các giá trị số được phân cách bởi : SPACE, TAB, CR, LF. Khi gặp một ký tự
không hợp lệ như dấu “.” đối với số nguyên, chữ cái đối với số, sẽ kết
thúc việc đọc cin, ký tự không hợp lệ này sẽ được xem xét trong lần đọc sau
 Đối với gía trị xâu ký tự, dấu phân cách cũng là SPACE, TAB, CR còn đối
với gía trị ký tự, dấu phân cách là dấu CR. Trong hai trường hợp này không
có khái niệm “ký tự không hợp lệ”. Mã sinh ra do nhấn phím Enter của lần
nhập trước vẫn được xét trong lần nhập chuỗi hay ký tự tiếp theo và do đó
sẽ có nguy cơ không nhập được đúng giá trị mong muốn khi đưa ra lệnh
nhập xâu lý tự hoặc ký tự ngay sau các lệnh nhập cá giá trị khác. Giải pháp
khắc phục ta dùng một trong hai lệnh sau
fflush(stdin) ; // khai báo trong stdio.h
cin.clear(); // hàm thành phần của lớp cin
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.2 Đọc dữ liệu từ thiết bị chuẩn cin
Ví dụ :
#include<iostream.h>
void main()
{
int n;
float x;
char t[81] ;
do
{
cout << “Nhap vao mot so nguyen, mot xau, mot so thuc : ” ;
cint >>n>>t>>x ;
cout << “Da nhap ”<<n<< “, ”<<t<< “va ”<<x<<“\n ” ;
} while (n) ;
}

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
3. NHỮNG TIỆN ÍCH CHO NGƯỜI LẬP TRÌNH
3.1 Ghi chú thích cuối dòng
C++ dùng // để chỉ ra một dòng là chú thích
Ví dụ
cout << ” Xin chao \n“ ; // xin chao
3.2 Khai báo mọi nơi
Ví dụ
{
int a ;
a=32 ;
cout <<a<< ” \n“ ;

int *p=&a ;
cout<< p <<” \n“

// chua co j
for (int j=0 ;j<10 ;j++)
….
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
3. NHỮNG TIỆN ÍCH CHO NGƯỜI LẬP TRÌNH
3.1 Toán tử phạm vi ::
Ví dụ 1:
int a=5 ;
main()
{
int a=10 ;

cout<<a ;
}
Ví dụVí dụ 2:2:
#include<iostream.h>#include<iostream.h>
int aint a ;;
main()main()
{{
int a=10; // a cục bộint a=10; // a cục bộ
::a=10::a=10 ; // a toàn cục; // a toàn cục
cout<<a; // a cục bộcout<<a; // a cục bộ
cout<<::a; // a toàn cụccout<<::a; // a toàn cục
}}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
4. HÀM INLINE
Trong C++ ta có thể định nghĩa các hàm được thay thế trực tiếp thành mã lệnh máy
tại chổ gọi (inline) mỗi lần được tham chiếu. Ưu điểm của hàm inline là chúng không
đòi hỏi các thủ tục bổ sung khi gọi hàm và trả về giá trị. Do vậy, hàm inline được
thực hiện nhanh hơn so với các hàm thông thường
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
4. HÀM INLINE
Ví dụVí dụ ::
#include<iostream.h>#include<iostream.h>
#include<conio.h>#include<conio.h>
inline long tong(int a[]); // khai báo inline long tong(int a[]); // khai báo
hàm inlinehàm inline
void main()void main()
{{
int i;int i;

int a[3];int a[3];
for (i=0;i<3;i++)for (i=0;i<3;i++)
a[i]=i;a[i]=i;
cont<<”Tong cac phan tu trong mang cont<<”Tong cac phan tu trong mang
la:”<<tong(a);la:”<<tong(a);
getch();getch();
}}
// định nghĩa hàm inline// định nghĩa hàm inline
inline long tong(int a[])inline long tong(int a[])
{{
int i;int i;
long s=0;long s=0;
for (i=0;i<3;i++)for (i=0;i<3;i++)
s+=a[i];s+=a[i];
return s;return s;
}}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
Ngôn ngữ C++ giới thiệu một khái niệm mới là tham chiếu ”reference”. Một tham
chiếu có thể là một biến, tham số hình thức của hàm hay dùng làm giá trị trả về của
một hàm.
5.1 Tham chiếu tới một biến
Ví dụ:
int n ;
int &p=n ; //p là một biến tham chiếu, p tham chiếu tới vùng nhớ nơi n lưu trữ
Nếu viết:
n=7;
cout<<p;
Kết quả in ra là:

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.1 Tham chiếu tới một biến
Tham chiếu và con trỏ giống nhau vì cùng chỉ đến các đối tượng có địa chỉ, cùng
được cập phát địa chỉ khi khai báo. Nhưng cách sử dụng thì khác nhau. Khi nói tới
tham chiếu ta phải gán nó với một biến nào đó đã khai báo, trong khi con trỏ thì
không nhất thiết phải khởi tạo giá trị cho nó. Con trỏ có thể tham chiếu tới nhiều biến
khác nhau con biến tham chiếu chỉ chỉ có thể tham chiếu tới một biến duy nhất lúc
khởi tạo nó.
Ví dụVí dụ ::
int n=3, m=4int n=3, m=4 ;;
int *pint *p ; ;
p=&np=&n ; // p chỉ tới n; // p chỉ tới n
*p=4*p=4 ; ;

p=&mp=&m ; // cho p chỉ tới m; // cho p chỉ tới m
int &q=nint &q=n ; // khai báo biến tham ; // khai báo biến tham
chiếu q chỉ đến nchiếu q chỉ đến n
q=4q=4 ; // gán cho n giá trị là 4; // gán cho n giá trị là 4

q=mq=m ; // gán m cho biến n ; // gán m cho biến n
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.1 Tham chiếu tới một biến
Ví dụVí dụ ::
#include<iostream.h>#include<iostream.h>
void main()void main()
{{

int x=3,&y; // sẽ báo lỗi vì y chưa int x=3,&y; // sẽ báo lỗi vì y chưa
được khởi tạođược khởi tạo
… …
}}
Ví dụ :Ví dụ :
int &p=3; // không hợp lệint &p=3; // không hợp lệ
const int &p=3; // hợp lệconst int &p=3; // hợp lệ
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.2 Truyền tham số cho hàm bằng tham chiếu
Ví dụVí dụ ::
#include<conio.h>#include<conio.h>
#include<iostream.h>#include<iostream.h>
/* hàm được gọi theo truyền tham trị*//* hàm được gọi theo truyền tham trị*/
void swap1(int x, int y) {void swap1(int x, int y) {
int temp =x;int temp =x;
x=y;x=y;
y=temp;y=temp;
}}
/* hàm thực hiện việc truyền tham số /* hàm thực hiện việc truyền tham số
bằng con trỏ */bằng con trỏ */
void swap2(int *x,int *y) {void swap2(int *x,int *y) {
int temp=*x;int temp=*x;
*x=*y;*x=*y;
*y=temp;*y=temp;
}}
/*hàm thực hiện việc truyền tham số /*hàm thực hiện việc truyền tham số
bằng tham chiếu */bằng tham chiếu */
void swap3(int &x,int &y) {void swap3(int &x,int &y) {

int temp=x;int temp=x;
x=y;x=y;
y=temp;y=temp;
}}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.2 Truyền tham số cho hàm bằng tham chiếu
void main()void main()
{{
int a=3, b=4int a=3, b=4 ;;
swap1(a,b)swap1(a,b) ;;
cout<<”a=”<<a<<”b=”<<b<<”cout<<”a=”<<a<<”b=”<<b<<”\\n”;n”;
a=3;b=4;a=3;b=4;
swap2(&a,&b);swap2(&a,&b);
cout<<”a=”<<a<<”b=”<<b<<”cout<<”a=”<<a<<”b=”<<b<<”\\n”;n”;
a=3;b=4;a=3;b=4;
swap3(a,b);swap3(a,b);
cout<<”a=”<<a<<”b=”<<b<<”cout<<”a=”<<a<<”b=”<<b<<”\\n”;n”;
getch();getch();
}}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.3 Giá trị trả về của hàm là tham chiếu
Định nghĩa hàm:
<type> & fct (…)
{
return <biến có phạm vi toàn cục>
}

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.3 Giá trị trả về của hàm là tham chiếu
Ví dụ:Ví dụ:
#include<iostream.h>#include<iostream.h>
#include<conio.h>#include<conio.h>
int a[5];int a[5];
int &fr(int *d,int i)int &fr(int *d,int i)
void main()void main()
{{
clrscr();clrscr();
cout<<”nhap gia tri cho mang a: cout<<”nhap gia tri cho mang a: \\n”;n”;
for (int i=0;i<5;i++) {for (int i=0;i<5;i++) {
cout <<”a[“<<i<<”]=”;cout <<”a[“<<i<<”]=”;
cin>>fr(a,i);cin>>fr(a,i);
}}
cout<<”Mang a sau khi nhap cout<<”Mang a sau khi nhap \\n”;n”;
for (i=0;i<5;i++)for (i=0;i<5;i++)
cout<<a[i]<<” ”;cout<<a[i]<<” ”;
cout <<”cout <<”\\n”;n”;
getch();getch();
}}
Int &fr(int *d,int i)Int &fr(int *d,int i)
{{
return d[i];return d[i];
}}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
6. ĐỊNH NGHĨA CHỒNG HÀM

C++ cho cho phép sử dụng một tên cho nhiều hàm khách nhau ta gọi đó là sự
chồng hàm.
#include <iostream.h>#include <iostream.h>
//Ham nguyen mau//Ham nguyen mau
int min(int, int); int min(int, int); //Ham 1//Ham 1
double min(double, double);double min(double, double);//Ham 2//Ham 2
char min(char, char);char min(char, char);//Ham 3//Ham 3
int min(int, int, int);int min(int, int, int);//Ham 4//Ham 4
int min(int, int *);int min(int, int *);//Ham 5//Ham 5
main() {main() {
int n=10, p =12, q = int n=10, p =12, q = 12;12;
double x = 2.3, y = double x = 2.3, y = 1.2;1.2;
char c = ‘A’, d= ‘Q’;char c = ‘A’, d= ‘Q’;
int td[7] = {1,3,4,int td[7] = {1,3,4, 2,0,23,9};2,0,23,9};
cout<<“min (n,p) : ”<<min(n,p)<<“cout<<“min (n,p) : ”<<min(n,p)<<“\\m”; m”;
//Ham 1//Ham 1
cout<<“min (n,p,q) : ”<<min(n,p,q)<<“cout<<“min (n,p,q) : ”<<min(n,p,q)<<“\\m”; m”;
//Ham 4//Ham 4
cout<<“min (c,d) : ”<<min(c,d)<<“cout<<“min (c,d) : ”<<min(c,d)<<“\\m”; m”;
//Ham 3//Ham 3
cout<<“min (x,y) : ”<<min(n,p)<<“cout<<“min (x,y) : ”<<min(n,p)<<“\\m”; m”;
//Ham 2//Ham 2
cout<<“min (7,td) : ”<<min(7,td)<<“cout<<“min (7,td) : ”<<min(7,td)<<“\\m”; m”;
//Ham 5//Ham 5
cout<<“min (n,x) : ”<<min(n,x)<<“cout<<“min (n,x) : ”<<min(n,x)<<“\\m”; m”;
//Loi//Loi
//cout<<//cout<<““min (n,p,x) :min (n,p,x) :
””<<min(n,p,x)<<<<min(n,p,x)<<““\\mm””; //Ham 4; //Ham 4
}}
CHƯƠNG 2:

NHỮNG MỞ RỘNG CỦA C++
6. ĐỊNH NGHĨA CHỒNG HÀM
Trường hợp có nhiều hàm trùng tên trong chương trình, việc xác định hàm nào
được gọi tuân theo nguyên tắc sau:
a. Tương ứng thật sự
b. Tương ứng dữ liệu số nhưng có sự chuyển đổi kiểu tự động
char và short >int; float >int.
c. Các chuyển đổi kiểu được C và C++ chấp nhận
d. Chuyển đổi kiểu do người dùng định nghĩa

×