努力學習c 的一天(九)

2021-10-14 06:07:35 字數 4485 閱讀 4940

參考:

參考:1. 建構函式怎麼寫

首先,當類被例項化後,會自動呼叫建構函式,由建構函式完成物件的初始化工作,建構函式的作用:初始化物件的資料成員;

因此,建構函式中的內容:初始化物件成員(包括public、private);

class student

使用變數、函式時要指明它們所在的命名空間。

li :: fp = fopen("one.txt", "r"); //使用小李定義的變數 fp

han :: fp = fopen("two.txt", "rb+"); //使用小韓定義的變數 fp

不建議全域性使用 using namepace ×,可能會引起問題:增加了命名衝突的風險,但是可以區域性使用,例如:在 main() 函式中宣告命名空間 std,它的作用範圍就位於 main() 函式內部,如果在其他函式中又用到了 std,就需要重新宣告

#include void func(){

//必須重新宣告

using namespace std;

cout<<""《不同的.h中可以使用相同名字的namespace嗎?可以,會自動合併為乙個名字空間,可以理解為追加

3. 常用的標頭檔案

4. 記憶體分配

在c語言中,動態分配記憶體用 malloc() 函式,釋放記憶體用 free() 函式;c++中使用new 和 delete:new 用來動態分配記憶體,delete 用來釋放記憶體。

int *p = new int; //分配1個int型的記憶體空間

delete p; //釋放記憶體

int *p = new int[10];  //分配10個int型的記憶體空間

delete p;

通常 new 和 delete、new 和 delete 操作符應該成對出現

5. 為什麼會有內聯函式?

函式呼叫是有時間和空間開銷的。如果函式體**比較多,需要較長的執行時間,那麼函式呼叫機制占用的時間可以忽略;如果函式只有一兩條語句,那麼大部分的時間都會花費在函式呼叫機制上,這種時間開銷就就不容忽視。

指定內聯函式的方法很簡單,只需要在函式定義處增加 inline 關鍵字。一般只將那些短小的、頻繁呼叫的函式宣告為內聯函式。在類體中定義的成員函式會自動成為內聯函式,在類體外定義的不會。

6. 建立類和物件

c++一般在 .**件中建立類,因為類只是乙個模板(template),編譯後不占用記憶體空間,所以在定義類時不能對成員變數進行初始化,因為沒有地方儲存資料。只有在建立物件以後才會給成員變數分配記憶體,這個時候就可以賦值了。

通常將類的宣告放在標頭檔案中,而將成員函式的定義放在原始檔中。

兩種建立物件的方式:一種是在棧上建立,

student stu;

student *pstu = &stu;

另外一種是在堆上建立,

student *pstu = new student;

delete pstu; //刪除物件
棧記憶體是程式自動管理的,不能使用 delete 刪除在棧上建立的物件;堆記憶體由程式設計師管理,物件使用完畢後可以通過 delete 刪除。

7. 訪問許可權

在類的內部(定義類的**內部,定義類的.h和.cpp),無論成員被宣告為 public、protected 還是 private,都是可以互相訪問的,沒有訪問許可權的限制。

在類的外部(定義類的**之外),只能通過物件訪問成員,並且通過物件只能訪問 public 屬性的成員,不能訪問 private、protected 屬性的成員。

成員變數大都以m_開頭,這是約定成俗的寫法,不是語法規定的內容。以m_開頭既可以一眼看出這是成員變數,又可以和成員函式中的形參名字區分開。

//類的宣告

class student{

private: //私有的

char *m_name;

int m_age;

float m_score;

public: //共有的

void setname(char *name);

void setage(int age);

void setscore(float score);

void show();

根據c++軟體設計規範,實際專案開發中的成員變數以及只在類內部使用的成員函式(只被成員函式呼叫的成員函式)都建議宣告為 private,而只將允許通過物件呼叫的成員函式宣告為 public。

給成員變數賦值的函式通常稱為 set 函式,它們的名字通常以set開頭,後跟成員變數的名字;讀取成員變數的值的函式通常稱為 get 函式,它們的名字通常以get開頭,後跟成員變數的名字。

除了 set 函式和 get 函式,在建立物件時還可以呼叫建構函式來初始化各個成員變數

8. 析構函式

析構函式沒有引數,不能被過載,因此乙個類只能有乙個析構函式。

在所有函式之外建立的物件是全域性物件,它和全域性變數類似,位於記憶體分割槽中的全域性資料區,程式在結束執行時會呼叫這些物件的析構函式。

在函式內部建立的物件是區域性物件,它和區域性變數類似,位於棧區,在區域性函式執行結束時會呼叫這些物件的析構函式。

new 建立的物件位於堆區,通過 delete 刪除時才會呼叫析構函式;如果沒有 delete,析構函式就不會被執行。

9. this指標

this 是 const 指標,this 只能在成員函式內部使用,用在其他地方沒有意義,也是非法的

10. 靜態成員變數和靜態成員函式

使用靜態成員變數來實現多個物件共享資料的目標,就相當於類中的全域性變數

static 成員變數必須在類宣告的外部初始化,具體形式為:

type class::name = value;

static 成員變數既可以通過物件來訪問,也可以通過類來訪問

靜態成員函式只能訪問靜態成員,靜態成員函式與普通成員函式的根本區別在於:普通成員函式有 this 指標,可以訪問類中的任意成員;而靜態成員函式沒有 this 指標,只能訪問靜態成員(包括靜態成員變數和靜態成員函式)。

11. const關鍵字

const 可以用來修飾成員變數、成員函式以及物件。如果你不希望某些資料被修改,可以使用const關鍵字加以限定。

const 成員函式可以使用類中的所有成員變數,但是不能修改它們的值;常成員函式需要在宣告和定義的時候在函式頭部的結尾加上 const關鍵字

class student{
public:

student(char *name, int age, float score);

void show();

//宣告常成員函式

char *getname() const;

int getage() const;

float getscore() const;

private:

char *m_name;

int m_age;

float m_score;

//定義常成員函式

char * student::getname() const{

return m_name;

12. friend友元函式和友元類

在當前類以外定義的、不屬於當前類的函式也可以在類中宣告,但要在前面加 friend 關鍵字,這樣就構成了友元函式。

友元函式不同於類的成員函式,在友元函式中不能直接訪問類的成員,必須要借助物件。

class student{

public:

student(char *name, int age, float score);

public:

friend void show(student *pstu); //將show()宣告為友元函式

private:

char *m_name;

int m_age;

float m_score;

//非成員函式

void show(student *pstu){

cout

努力學習c 的一天(三)

盡力尊重原創 1.封裝成dll和lib的區別是什麼?首先,dll和lib都是鏈結庫,dll是動態鏈結庫,lib是靜態鏈結庫。靜態庫是指在鏈結的過程中,將該庫中的 完全複製到可執行檔案中 動態庫是指可以被不同程序呼叫但不屬於可執行檔案的函式,可由多個程式同時使用。總之,lib是編譯時用到的,dll是執...

努力學習C 的一天(五)

1.stdafx.h和stdafx.cpp是用來幹嘛的?stdafx.h,stdafx.cpp這些檔案用於生成名為.pch 的預編譯頭 pch 檔案和名為 stdafx.obj 的預編譯型別檔案。結構體定義 struct calib para 函式宣告 float compute angle cal...

努力學習c 的一天(十)

1.string類 使用 string 類需要包含標頭檔案 參考 2.c 引用 引用的定義方式類似於指標,只是用 取代了 語法格式為 type name data 引用必須在定義的同時初始化,並且以後也要從一而終,不能再引用其它資料,這有點類似於常量 const 變數 注意,引用在定義時需要新增 在...