When we control the event,we control your lives
 
IndexTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập
Tìm kiếm
 
 

Display results as :
 
Rechercher Advanced Search
Latest topics
» Tô màu theo vùng quét
Tue Aug 13, 2013 4:18 pm by minhlap

» authentischen Hermes Lindy Taschen
Wed Jan 23, 2013 11:15 am by cangliang

» Hermes Bag
Wed Jan 23, 2013 11:14 am by cangliang

» Hermes Evelyn pm
Wed Jan 23, 2013 11:13 am by cangliang

» Hermes Kelly bag billig
Mon Jan 21, 2013 8:57 am by cangliang

» Hermes Constance Bag
Mon Jan 21, 2013 8:56 am by cangliang

» Discout Hermes Belt
Mon Jan 21, 2013 8:55 am by cangliang

» Christian Louboutin Love Flats
Tue Jan 15, 2013 12:25 pm by cangliang

» Christian Louboutin Love Flats
Tue Jan 15, 2013 12:25 pm by cangliang

Navigation
 Portal
 Diễn Đàn
 Thành viên
 Lý lịch
 Trợ giúp
 Tìm kiếm
December 2016
MonTueWedThuFriSatSun
   1234
567891011
12131415161718
19202122232425
262728293031 
CalendarCalendar
Diễn Đàn
Affiliates
free forum


Share | 
 

 OOP trong C++ - cơ bản

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
symphonyenigmatic
Thành viên bậc 3
Thành viên bậc 3


Tổng số bài gửi : 61
Points : 104
Reputation : 6
Join date : 26/07/2009
Age : 28
Đến từ : http:://thienthancntt.tk

Bài gửiTiêu đề: OOP trong C++ - cơ bản   Sat Aug 01, 2009 2:33 pm



Tập tin header
Tạo một tập tin header có tên là myfile.h
#ifndef MYFILE_H
#define MYFILE_H
……
#endif


trong tập tin cpp thêm vào dòng
#include "myfile.h"
Về Đầu Trang Go down
Xem lý lịch thành viên http://http:://thienthancntt.tk
symphonyenigmatic
Thành viên bậc 3
Thành viên bậc 3


Tổng số bài gửi : 61
Points : 104
Reputation : 6
Join date : 26/07/2009
Age : 28
Đến từ : http:://thienthancntt.tk

Bài gửiTiêu đề: NHẮC LẠI VỀ LỚP   Sat Aug 01, 2009 2:44 pm



Cơ bản về lớp

Code:
class Date{
    int day;
public:
    Date(int,int a=1);
    int month;
    void setDay(int);
    void output();
};
int main(){
    Date d(6);
    d.month=3;
    d.setDate(25);
    d.output();
    return 0;
}
Date::Date(int day,int month){
    this->day=day;
    this->month=month;
}
void Date::setDay(int day){
    this->day=day;
}
void Date::output(){
    cout<<day<<"/"<<month;
}

Hàm khởi tạo
Chúng ta có thể viết một hàm khởi tạo như thế này

Code:
class Student
{
    string name;int age;
public:
    Student(string name,int n):name(name),age(n)
    {
    }
};

Nó tương đương với

Code:
class Student
{
    string name;int age;
public:
    Student(string name,int n)
    {
        (*this).name = name;
        this->age = n;
    }
};

Hàm bạn (friend function)

Code:
class Student{
public:
    int id;
    friend bool equal(const Student&,const Student&);
};
int main(){
    Student s1;s1.id=2;
    Student s2;s2.id=3;
    cout<<equal(s1,s2);
}
bool equal(const Student& s1,const Student& s2){
    return (s1.id==s2.id);
}
Overload toán tử (operator overload)
Ví dụ dưới sẽ overload toán tử ==
Code:

class Student{
public:
    int id;
    friend bool operator==(const Student&,const Student&);
};
int main(){
    Student s1;s1.id=2;
    Student s2;s2.id=3;
    cout<<((s1==s2)?"equal":"unequal");
}
bool operator==(const Student& s1,const Student& s2){
    return (s1.id==s2.id);
}

Overload toán tử nhập và xuất (input >> và output <<)
Mọi người đều biết cin>>a là gọi toán tử nhập cin.operator>>(a) hoặc operator>>(cin,a) Overload 2 toán tử nhập và xuất này hết sức quan trọng về sau. Nhân tiện mỗi khi cấp phát bộ nhớ, dùng xong phải luôn hủy đi để thu hồi lại bộ nhớ đã cấp phát. Vì về sau game cái ưu tiên hàng đầu là bộ nhớ, đừng để lại rác.
Code:

class Date{
public:
    int day;int month;
    friend istream& operator>>(istream&,Date&);
    friend ostream& operator<<(ostream&,const Date&);
};
istream& operator>>(istream& ins,Date& d){
    ins>>d.day;
    ins>>d.month;
    ins.get();    //phải xóa bộ đệm
    return ins;
}
ostream& operator<<(ostream& outs,const Date& d){
    outs<<d.day<<"/"<<d.month;
    return outs;
}
int main(){
    Date d;   
cin>>d;cout<<d;
    Date *dt=new Date;    //phải tạo object pointer, cấp phát bộ nhớ
    cin>>*dt;cout<<*dt;
    delete dt;        //phải hủy  object pointer
}

Hàm hủy (destructor)
Code:

class myclass{
public:
    int *p;
    myclass();
    ~myclass();
};
int main(){
    myclass m;
    return 0;
}
myclass::myclass(){
    p=new int;    //phải cấp phát bộ nhớ để tránh segmentation fault
}
myclass::~myclass(){
    delete p;
}

Hàm khởi tạo sao chép (copy constructor
Code:

class Date{
public:
    int day;int month;char *special;
    Date(int,int,char*);
    Date(const Date&);
    ~Date(){
        delete [] special;    //bởi vì chúng ta cấp phát bộ nhớ cho nó
    }
};
Date::Date(int day,int month,char *special){
    this->day=day;this->month=month;this->special=special;
}
Date::Date(const Date& d){
    this->day=d.day;this->month=d.month;
    this->special=new char[strlen(d.special)+1];        //cấp phát bộ nhớ cho nó
    strcpy(this->special,d.special);        //phải  dùng strcpy với char array
}
int main(){
    Date d1(29,8,"birthday");
    Date d2(d1);
    cout<<d2.special;
    return 0;
}

Chú ý về cấp phát bộ nhớ
Ðiều gì sẽ xảy ra khi chúng ta không thể cấp phát bộ nhớ ? Ví dụ chúng ta viết 1 game RTS mà mỗi phe tham chiến có 10 tỉ quân ?
Giải quyết khi không thể cấp phát bộ nhớ thành công
Chúng ta vẫn thường cấp phát bộ nhớ như sau
Code:

char *p;int i;
cout<<"number of element u want:";
cin>>i;
p=new char[i+1];
delete [] p;

Nếu chúng ta không thể cấp phát bộ nhớ ? CPP sẽ ném (throw) ra một ngoại lệ. Có 2 cách để xử lí chuyện này
Cách một là dùng từ khóa nothrow. Vì thế CPP vẫn tạo ra một pointer nhưng là 0
Code:

p=new (nothrow) char[i+1];
if(p==0) cout<<"Can't allocate memory";

Cách hai là bắt cái ngoại lệ ấy, Ðó là ngoại lệ std::bad_alloc
Code:

try{
    p=new char[i+1];
}catch(std::bad_alloc &mae){
    cerr<<"failed to allocate memory"<<mae.what();
    exit(1);
}

Cấp phát bộ nhớ trong C
Ðừng có chỉ mê new và delete không thôi, cấp phát với cách của C vẫn phải dùng về sau đấy
Code:

char *p;int i;
printf("number of element u want:");
scanf("%d",&i);
p=(char*)malloc(i+1);
if(p==NULL) exit(1);
free(p);
hoặc chúng ta có thể dùng calloc
p=(char*)calloc(i,sizeof(char));

Toán tử gán (assignment operator)
Code:

class Base{
public:
    Base& operator=(const Base&);
    friend bool operator!=(const Base&,const Base&);
private:
    char* c;
};
Base& Base::operator=(const Base& src){
    if(*this!=src){        //to avoid self-assignment
        delete [] c;
        c = new char[strlen(src.c)+1];
        strcpy(this->c,src.c);
    }
    return *this;
}
bool operator!=(const Base& b1,const Base& b2){
    return(strcmp(b1.c,b2.c));
}
Và chúng ta có thể gọi toán tử này
Base s2=s1;

Thừa kế (inheritance)
Trong C có thể sinh ra bug, trong C++ chúng sẽ được thừa kế.
Code:

class Base{
protected:
    int id;
    Base(int id){
        this->id=id;
    }
};
class Sub:public Base{
public:
    int code;
    Sub(int code,int id):Base(id){
        this->code=code;
    }
};

Hàm ảo (virtual function)
Hàm Play trong lớp MusicPlayer là một hàm ảo (virtual function)
Code:

class MusicPlayer{
public:
    virtual void Play(){
        cout<<"Play on what ?"<<endl;
    }
};
class DVD:public MusicPlayer{
public:
    void Play(){
        cout<<"Play on DVD"<<endl;
    }
};
int main(){
    MusicPlayer m;m.Play();
    DVD d(2);d.Play();
}

Bây giờ chúng ta sẽ làm hàm Play trong lớp MusicPlayer là một hàm thuần ảo (pure virtual function), đồng thời làm lớp MusicPlayer trở thành một lớp trừu tượng (abstract class), chúng ta sẽ không thể tạo instance của nó được nữa
Code:

class MusicPlayer{
public:
    virtual void Play() = 0;
};
class DVD:public MusicPlayer{
public:
    void Play(){
        cout<<"Play on DVD"<<endl;
    }
};
int main(){
    DVD d(2);d.Play();
}

Chúng ta tạo con trỏ để trỏ đến các subclass của nó
Code:

MusicPlayer *m=new DVD(5);m->play();

Chúng ta cung có thể tạo mảng các con trỏ của một lớp trừu tượng
Code:

class MusicPlayer... là một lớp trừu tượng
class DVD:public MusicPlayer...
class CD:public MusicPlayer...
MusicPlayer *m[2];
m[0]=new DVD(5);m[0]->play();
m[1]=new CD("Sony");m[1]->play();

Nhắc lại một chút về mảng các kí tự (char array)
Code:

char destArray[10];char srcArray[]="panther";
strcpy(destArray, srcArray);
strcpy(destArray, srcArray,strlen(srcArray));
strcat(s1,s2);        //thêm (append) s2 vào s2
strncat(s1,s2,n);    //thêm (append) n kí tự đầu tiên của s2 vào s1
strlen(char *s);    //độ dài (length) của char array, không bao gồm "end of char array maker"
char *a;char b[];strcmp(a,b);        //trả về 0 nếu bằng,-1 nếu a<b,1 nếu a>b
atoi, atof, atoll convert một char array thành integer, float hay long, 3 hàm này trong stdlib.h
char *s = "123.45";
int i=atoi(s);
float f=atof(s);

Nhắc lại một chút về chuỗi (string)
Code:

using std::string;
*khởi tạo (constructor)
string s1;string s2("Hello boy");string s3(s2);
string s4(s2,3,4);    //sao chép từ kí tự thứ 3, sao chép 4 kí tự
string s5(8,'*');    //khởi tạo chuỗi gồm toàn dấu *
*toán tử gán (assignment)
string s4=s2;string s5.assign(s3);
*so sánh chuỗi (compare string)
if(s1==s2)        //bây giờ có thể dùng == rồi
if(s1.compare(s2))
*cộng chuỗi
string s1,s2;s1+=s2;s1+='o';
s1.append(s2);        //y nhu s1+=s2
s1.append(s2,3,string::npos);        //thêm vào s1 từ kí tự thứ 3 đến hết s2
s1.insert(7,s2);        //thêm s2 vào sau kí tự thứ 7 của s1
*kích cỡ (capacity)
s.capacity() trả về kích cỡ tối đa
if s.size()=15, s.capacity()=16 (16-byte)
if s.size()=17, s.capacity()=32 (two 16-byte)
*truy xuất chuỗi
#include <stdexcept>
try{
    cout<<s.at(100);
}catch(out_of_range& e){
    cout<<"invalid index";
}
Về Đầu Trang Go down
Xem lý lịch thành viên http://http:://thienthancntt.tk
connguoibian_tn_9
Thành viên bậc 1
Thành viên bậc 1


Tổng số bài gửi : 9
Points : 21
Reputation : 1
Join date : 24/07/2009
Age : 28
Đến từ : Thiên Đường Hạnh Phúc

Bài gửiTiêu đề: 1.Trình bày cơ chế thực hiện tính đa hình trong LTHDT.Giải thích vai trò của hàm ảo trong việc thực hiện tính đa hịnh   Tue Aug 04, 2009 12:43 pm

Đa hình là cơ chế tầm vực động (cơ chế gọi thực hiện phương thức thông qua con trỏ đối tượng), cho phép xác định đúng hành vi (phương thức) của đối tượng khi yêu cầu thực hiện. Việc xác định được thực hiện theo nguyên tắc tự nhiên, đối tượng thuộc lớp nào sẽ gọi thực hiện phương thức của lớp đối tượng đó.

Khái niệm hàm ảo:
Một phương thức của lớp.
Mang tính ảo.
==>Chuyển lời gọi hàm cho đúng đối tượng con trỏ đang trỏ đến.
==> Liên kết động.
Chỉ có ý nghĩa khi gọi thông qua con trỏ.
Sử dụng hàm ảo để làm gì?
Gọn gàng, đơn giản, uyển chuyển, linh động.
==>Chương trình có tính dễ mở rộng, nâng cấp.
Về Đầu Trang Go down
Xem lý lịch thành viên http://thuhuong.tk
Sponsored content




Bài gửiTiêu đề: Re: OOP trong C++ - cơ bản   Today at 1:24 am

Về Đầu Trang Go down
 
OOP trong C++ - cơ bản
Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang
 Similar topics
-
» Quy Định Về Cấp Bậc Trong Diễn Đàn
» Bán nhà trong HXH Nguyễn Minh Hoàng, nhà bán trong khu K300 giá 5.5 tỷ
» VÀNH NGOÀI BẢY CHỮ VÀNH TRONG TÁM NGHỀ
» Kho vũ khí khổng lồ trong Truy Kích
» Bán xe trượt scooter 3 trong 1 dành cho bé

Permissions in this forum:Bạn không có quyền trả lời bài viết
minhlap.allgoo.us :: Lập trình :: Lập Trình Hướng Đối Tượng,Đồ Họa OpenGL C, C++-
Chuyển đến