Hiển thị các bài đăng có nhãn hàm. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn hàm. Hiển thị tất cả bài đăng

Chủ Nhật, 31 tháng 3, 2019

[Học C++] Bài6 - Hàm và các keyword trong C++ (static,)

1. Các hàm thành viên trong Class
- Simple functions
- Static functions
- Const functions
- Inline functions
- Friend functions

1.1 Hàm đơn giản
Khai báo giống như 1 hàm bình thường.
[Kiểu trả về] [tên hàm] (tham số)
{
 //thân hàm
}
vi du:
void Neb {
 cout<<" Neb is handsome!";
}

1.2 Static function

1.5 Friend function
Friend function không phải là một thành viên của class. Như đã biết các class,hàm bên ngoài
không thể truy cập vào thành viên private... Do đó friend function được ra đời.
Mục đích là để giúp truy cập vào đối tượng private.
Ta có thể định nghĩa 1 hàm gobal như friend hay 1 thàm thành viên của class khác là friend.
Ví dụ
class WithFriend
{
    int i;
    public:
    friend void fun(); // global function as friend
};
void fun()
{
    WithFriend wf;
    wf.i=10;  // access to private data member
    cout << wf.i;
}
int main()
{
    fun(); //Can be called directly
}


--- Cách 2
Khi cấu hình 1 class là friend thì tất cả các hàm thành viên sẽ tự động trở thành hàm bạn...
class Other
{
    void fun();
};
class WithFriend
{
    private:
    int i;
    public:
    void getdata();  // Member function of class WithFriend
   
    // making function of class Other as friend here
    friend void Other::fun();  
   
    // making the complete class as friend
    friend class Other; 
};

2. Static Keyword

2.1 Static function

class COGE {
private:
 int x; //data member
public:
 int y;
 static void fun() {
  //x = 1; //error
  y = 1;
  cout<<"Neb";
 }
 void f() {
  //x = 1; //error,khong thể
  y = 1;
 }
};
int _tmain(int argc, _TCHAR* argv[])
{
 //void COGE::f(); //error,may not define outside of class
 COGE::fun();
 COGE obj1;
 COGE obj2.
 cout<<obj1.fun();
 cout<<obj2.fun();
 system("pause");
 return 0;
}
Cả 2 objects đều dùng chung 1 hàm fun() => Dùng static để đỡ phải khai báo 2 hàm.
Chú ý: Hàm static không thể truy cập vào data members và member function.
Chỉ có static data hoặc static function thôi.

2.2 Static data member
- Chia sẻ với tất cả các đối tượng.Và nó chỉ được lưu trữ 1 lần,do đó nó không hề copy riêng biệt cho mỗi đối tượng như
các biến thông thường.
- Biến static member (data members) không được khởi tạo bằng Constructor,bởi vì không có sự khởi tạo đối tượng.
- Nó có thể được khởi tạo giá trị bên ngoài class. Nếu không khởi tạo Linker sẽ báo lỗi.
- Một khi đã định nghĩa giá trị cho biến static,sau đó ra không thể khởi tạo lại giá trị cho biến nữa.
Vậy khi nào cần sử dụng?
Khi mà tất cả các đối tượng đều truy cập chung vào 1 biến . Thì ta nên sử dụng static.
Nếu không dùng static,thì mỗi đối tượng sẽ gọi 1 lần hàm COnstructor => Lãng phí hơn so với gọi 1 biến tĩnh.
Ví dụ:
class X
{
    public:
    static int i;
    X()
    {
        // construtor
    };
};
int X::i=1;
int main()
{
    X obj;
    cout << obj.i;   // in ra 10
}

2.3 Static Class Object
- Static objects cũng được khởi tạo bằng Constructor như các Objects bình thường.
- Lifetime của static Object là khi kết thúc chương trình. Ví dụ dưới sec chứng minh rằng hàm Destructor
không được gọi khi ra khỏi if{} và đến tận lúc kết thúc chương trình...
Ví dụ:
class Abc
{
    int i;
    public:
    Abc()
    {
        i=0;
        cout << "constructor";
    }
    ~Abc()
    {
        cout << "destructor";
    }
};
void f()
{
    static Abc obj;
}
int main()
{
    int x=0;
    if(x==0)
    {
        f();
    }
    cout << "END";
}// gọi hàm hủy ở đây

OUTPUT
constructor END destructor

Thứ Bảy, 30 tháng 3, 2019

[Học C++] Bài2 - Hàm trong C++

Hàm giúp cho chương trình dễ hiểu,rõ ràng và dễ check errors

1. Cú phám cơ bản
[kiểu trả về]  [tên hàm] (tham số 1,tham số 2,...)
{
// thân hàm
}
- Kiểu trả về: Kiểu dữ liệu mà hàm trả về.. Nó có thể là int,char,con trỏ hay class..
Và nếu hàm không trả về giá trị,bạn nên dùng kiểu trả về là void.
- Tên hàm: Tên hàm (Chú ý không đặt trùng với từ khóa)..
- Tham số : Là các biến giữ giá trị khi hàm được gọi.Một hàm có thể có hoặc không có
tham số... Khi gọi hàm,hàm có bao nhiêu tham số thì lúc gọi hàm ta phải truyền vào bấy
nhiêu tham số... ví dụ dưới: hàm sum có 2 tham số x,y...trong hàm main() khi gọi hàm sum()
ta cũng phải truyền vào 2 biến..
Ví dụ: Hàm tính tổng 2 số
// hàm sum có 2 tham số đầu vào x,y
void sum(int x, int y)
{
    int z;
    z = x + y;
    cout << z;
}
int main()
{
    int a = 10;
    int b = 20;
    //gọi hàm sum ở trên,và truyền vào 2 đối số a,b
    sum (a, b);
}

2. Định nghĩa hàm
Hãy nhớ rằng Compiler thực thi chương trình trong hàm main() trước... Sau đó.nếu trong
hàm main() có gọi đến 1 hàm nào đó bạn tự khai báo.
Với các project nhỏ thì ta viết luôn hàm tự khởi tạo ở phía trên hàm main(),nhưng với các
chương trình lớn mà ta cần include rất nhiều các file như .h,.c thì không khả thi và sẽ sinh lỗi
... Vì khi hàm main() chạy thì hàm tự khởi tạo của chúng ta chưa hề được định nghĩa trước đó.
Mặc dù khi Compile chương trinhg vẫn OK,không lỗi :D
Để khắc phục: Người ta dùng phương pháp "Lời gọi hàm"
ví dụ với hàm sum() ở trên:
#include <iostream>
using namespace std;
int sum(int x,int y); //copy y nguyên hàm sum() thôi
void main ()
{
 int a,b = 1;
 int sum_val = sum(a,b);
}
// ham sum khai báo sau hàm main()
int sum (int x,int y) {
 int sum = x + y;
 return sum;
}

3. Gọi hàm
Hàm được gọi bởi tên hàm... Nếu hàm không có tham số,nó có thể được gọi trực tiếp thông qua tên hàm.
Với những hàm có tham số,chúng ta có 2 cách gọi:
- gọi bởi tham trị
- gọi bởi tham chiếu

3.1 Gọi hàm bằng tham trị
Là kĩ thuật gọi hàm,chúng ta truyền vào giá trị cho đối số cái sẽ được lưu trữ hoặc copy trong hàm.. Khi ra khỏi hàm giá trị đó không có tác dụng nữa.
Do đó,giá trị ban đầu KHÔNG THAY ĐỔI...
void calc(int x);
int main()
{
    int x = 10;
    calc(x);
    printf("%d", x); //in ra 10
}
int calc(int x)
{
    x = x + 10 ;
    return x;
}
Giải thích:
Giá trị thực của biến x không thay đổi,bởi vì ta truyền vào giá trị,do đó 1 biến copy của x sẽ được truyền vào.
Biến copy này sẽ bị hủy sau khi ra khỏi hàm calc().

* Cach 2:
int calc(int x);
int main()
{
    int x = 10;
    x = calc(x);
    printf("%d", x); //in ra 20-ok
}
int calc(int x)
{
    x = x + 10 ;
    return x;
}

3.2 Gọi hàm bằng tham chiếu
Khi muốn thay đổi giá trị của biến sau khi gọi hàm...
Ta truyền vào địa chỉ của biến,trong phương pháp này tham số chính thức có thể được thực hiện
như là tham chiếu hay con trỏ,cả 2 phương pháp đều giúp thay đổi giá trị biến ban đầu.
void calc(int *p);
int main()
{
    int x = 10;
    calc(&x);     // truyền địa chỉ của x,như 1 đối số
    printf("%d", x);
}
void calc(int *p)
{
    *p = *p + 10;
}



Author: Cong Neb
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tks