【C++學習筆記一】C++類和對象詳解

類定義是以關鍵字class開頭,后面跟類的名稱。主體是包含在一對花括號中。類定義后必須跟著一個分號或一個聲明列表

類的對象的公共數據成員可以使用直接成員訪問運算符.來訪問。需要注意的是,私有的成員和受保護的成員不能直接使用成員訪問運算符來訪問

類成員函數

類的成員函數是指把定義和原型寫在類定義內部的函數。類成員函數是類的一個成員,他可以操作類的任意對象,可以訪問對象中的所有成員。

成員函數可以定義在類定義內部,或者單獨使用范圍解析運算符::來定義,在類定義中定義的成員函數把函數聲明為內聯的,即使沒有使用inline標識符。聲明必須寫在類的內部。

在類外定義的格式為:

數據類型 類名::方法名(參數列表) {}

類訪問修飾符

數據封裝是面向對象編程的一個重要特點,它防止函數直接訪問類類型的內部成員。類成員的訪問限制是通過在類主體內部對各個區域標記訪問修飾符public private protected來指定的。

一個類可以有多個訪問修飾符標記區域,每個標記區域在下一個標記區域開始之前或者遇到類主體結束右括號之前都是有效的

成員和類的默認訪問修飾符是private

  • 公有public:公有成員在程序中類的外部是可訪問的。您可以不適用任何成員函數來設置和獲取公有變量的值。
  • 私有private:已有成員變量或函數在類的外部是不可訪問的,甚至是不可查看的,只有類和友元函數可以訪問私有成員。默認情況下,類對所有成員都是私有的。
    實際操作中,我們一般會在私有區域定義數據,在公有區域定義相關的函數,以便在類的外部也可以調用這些函數。
  • 保護protected:保護成員變量或函數與私有成員十分相似,但有一點不同,保護成員在派生類(即子類)中是可訪問的。

對于一個空類,編譯器默認產生4個成員函數:默認構造函數、析構函數、拷貝構造函數和賦值函數。

還有關于繼承中訪問權限問題:傳送門

類構造函數&析構函數

類的構造函數時類的一種特殊的成員函數,他會在每次創建類的新對象時執行。
構造函數的名稱與類名是完全相同的,并且不會返回任何返回類型,也不會返回void,構造函數可用于為某些成員變量設置初始值。如果需要,構造函數也可以帶有參數。

當類中未定義構造函數時,編譯器會自動假設存在兩個默認構造函數。

類名:類名() {}
類名:類名(const 類名&a){} //沒有什么用

如果自己定義了構造函數,則默認的構造函數不會存在。

構造函數可以被重載。

可以使用初始化列表來初始化字段,例如:

class C
{T X,Y,Z;C();
}
C::C(T a,T b,T c):X(a),Y(b),Z(c)
{...
}

類的析構函數是類的一種特殊的成員函數,他會在每次刪除所創建的對象時執行。析構函數的名稱與類對 名稱是完全相同的,只是在前面加了~作為前綴,他不會返回任何值,也不能帶任何參數。

析構函數不能重載,如果沒有寫析構函數,C++會自動幫我們寫一個析構函數。

拷貝構造函數

拷貝構造函數是一種特殊的構造函數,在創建對象時,是使用同一類中之前創建的對象來初始化新創建的對象。拷貝構造函數通常用于

  • 復制對象把它作為參數傳遞給函數
  • 復制對象,并從函數返回這個對象
  • 通過使用另一個同類型的對象來初始化新建的對象(拷貝初始化)

如果類沒有定義拷貝構造函數,編譯器會自行定義一個,如果類帶有指針變量,并由動態分配內存,則它必須有一個拷貝構造函數(否則會引發錯誤)。
最常見的形式如下:

classname (const classname &obj)
{//主體
}

這里對拷貝初始化進行進一步的說明:

A x(y); //直接初始化,如果是類類型將調用構造函數
A x=y; //拷貝初始化,如果是類類型將調用拷貝構造函數

值包含類類型成員或者內置類型(不包含指針類型)成員的類無須顯式地定義拷貝構造函數也可以進行拷貝。當類的成員函數包含指針或者是成員表示在構造函數中分配的其他資源時,就必須定義拷貝構造函數。

友元函數

友元函數是定義在類外部,但是有權訪問類的所有私有成員和保護成員,如果不是static成員則需要對象作為參數,如果訪問static成員則不需要參數的函數,盡管友元函數的原型有在類的定義中出現過,但是友元函數并不是成員函數。
友元可以是一個函數,該函數稱為友元函數;友元可以是一個類,該類稱為友元類。在這種情況下,整個類及其所有成員都是友元。如果要聲明函數為一個友元函數,需要在類定義中該函數原型前使用關鍵字friend.

class A
{friend 返回類型 函數名B(參數列表);
};
返回類型 B(參數列表)//請注意,A不是任何類的成員函數
{}
int main()
{A a; B(參數列表);//對友元函數的調用不需要對象和類
}

聲明類B的所有成員為另一個類A的友元則需要在A的定義專用加上以下聲明:

class A
{...friend class B;
}

同樣在友元類中我們也可以通過對象參數訪問保護和私有成員。

內聯函數

內聯函數通常與類一起使用,如果一個函數是內聯的,那么在編譯時,編譯器會把該函數的代碼副本放置在每個調用該函數的地方。對內聯函數進行修改都要重新編譯函數的所有客戶端,因為編譯器需要更換一次所有的代碼。

如果想要把一個函數定義為內聯函數,則需要在函數定義前面放置關鍵字inline如果已定義的函數多于十行,編譯器會忽略inline限定符

在類定義中的函數都是內聯函數,即使沒有使用內聯函數。

  • 在內聯函數內不允許使用循環語句和開關語句

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言實現的簡單的線程池

http://www.linuxidc.com/Linux/2013-01/77619.htm 有時我們會需要大量線程來處理一些相互獨立的任務,為了避免頻繁的申請釋放線程所帶來的開銷,我們可以使用線程池。下面是一個C語言實現的簡單的線程池。 頭文件: 1: #ifndef THREAD_POOL_H_…

C++獲取當前時間

可以使用windowsAPI直接獲取。 例如&#xff1a; #include<windows.h> #include<cstdio>using namespace std;int main() {SYSTEMTIME now;GetLocalTime(&now);printf("現在是%02d時%02d分%02d秒\n",now.wHour,now.wMinute,now.wSecond);printf(&…

成員函數后面加上const的作用

const表示成員函數不會修改類中的數據成員。 規則&#xff1a; 在類中被const 聲明的函數只能訪問const 函數&#xff0c;而非const 函數可以訪問任意成員函數。在成員函數中不管數據是否具有const 屬性&#xff0c;編譯器檢查的的是是否有修改&#xff08;賦值&#xff0c;自…

簡單Linux C線程池

http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html 大多數的網絡服務器&#xff0c;包括Web服務器都具有一個特點&#xff0c;就是單位時間內必須處理數目巨大的連接請求&#xff0c;但是處理時間卻是比較短的。在傳統的多線程服務器模型中是這樣實現的&#xff1…

C++創建對象:棧和堆的區別

首先我們應該了解棧和堆的差別&#xff1a; 詳細信息&#xff1a;傳送門 棧相當于函數自帶的存儲空間&#xff0c;在windows下一般為2M,在Linux下一般為8M&#xff0c;存取速度稍微快一點。堆是系統的空間&#xff0c;相對較大&#xff0c;一般為2G&#xff0c;效率稍微慢一點…

IO多路復用之poll總結

http://www.cnblogs.com/Anker/p/3261006.html 1、基本知識 poll的機制與select類似&#xff0c;與select在本質上沒有多大差別&#xff0c;管理多個描述符也是進行輪詢&#xff0c;根據描述符的狀態進行處理&#xff0c;但是poll沒有最大文件描述符數量的限制。poll和select同…

【C++學習筆記二】C++繼承

繼承 繼承允許我們一句另一個類來定義一個類&#xff0c;這使得繼承和維護一個程序變得更加容易&#xff0c;也達到了重用代碼功能和提高執行效率的效果。 一般格式為&#xff1a; class 派生類名 :訪問修飾符 基類名{};其中訪問修飾符是public protected private中的一個&a…

處理大并發之二 對epoll的理解,epoll客戶端服務端代碼

http://blog.csdn.net/wzjking0929/article/details/51838370 序言&#xff1a; 該博客是一系列的博客&#xff0c;首先從最基礎的epoll說起&#xff0c;然后研究libevent源碼及使用方法&#xff0c;最后研究nginx和node.js&#xff0c;關于select,poll這里不做說明&#xff0c…

C++基類指針指向派生類(指針)

我們常用基類指針指向派生類對象來實現多態性。 私有繼承不允許基類指針指向派生類 基類指針只能訪問到基類中含有的公有成員。 當用基類指針指向派生類對象在動態分配堆上內存的時候&#xff0c;析構函數必須是虛函數! 成員如果是數據成員的話訪問的是基類的版本&#xff…

C++虛繼承中構造函數和析構函數順序問題以及原理

多重繼承的問題&#xff1a;多個類B,C,…繼承同一個類A導致如果X繼承了B,C,…那么在X中將還有多個A中成員的拷貝&#xff0c;如果想要訪問A中的成員如果不加名字空間將會導致二義性&#xff0c;這種拷貝大多是沒有實際意義的&#xff0c;為了避免這種空間浪費&#xff0c;C有虛…

一個簡單的linux線程池

http://blog.csdn.net/wzjking0929/article/details/20312675 線程池&#xff1a;簡單地說&#xff0c;線程池 就是預先創建好一批線程&#xff0c;方便、快速地處理收到的業務。比起傳統的到來一個任務&#xff0c;即時創建一個線程來處理&#xff0c;節省了線程的創建和回收的…

【C++學習筆記三】C++多態、抽象(接口)

當類之間存在多種層次結構&#xff0c;并且類之間通過繼承關聯時就會用到多態。 虛函數在子類中的覆蓋版本和該函數在基類中的原始版本必須有相同的函數簽名、函數名、形參名、常屬性。如果返回值為非類類型&#xff0c;則必須相同&#xff0c;如果是類類型A的指針或者引用&am…

C++重載和重寫的條件以及重寫后對基類函數的覆蓋

重載&#xff1a;同一個類中名字相同&#xff0c;參數列表不同的方法構成重載函數&#xff0c;和返回值沒有關系。這就意味著就算返回值不同&#xff0c;只要名字相同參數列表相同編譯器還是會報錯&#xff0c;覺得一函數被定義了兩次。 重寫&#xff1a;派生類中只要函數名字…

C++靜態成員和靜態方法

在類中&#xff0c;靜態成員可以實現多個對象之間共享數據&#xff0c;同時保證了安全性。靜態數據對該類的所有對象是公有的&#xff0c;存儲一處供所有對象使用。 注意&#xff1a; 靜態成員定義時需要在前面加上關鍵字static靜態成員必須初始化且必須在類外進行&#xff0…

基于epoll的簡單的http服務器

http://blog.csdn.net/fangjian1204/article/details/34415651 http服務器已經可以處理并發連接&#xff0c;支持多個客戶端并發訪問&#xff0c;每個連接可以持續讀寫數據&#xff0c;當然&#xff0c;這只是一個簡單的學習例子&#xff0c;還有很多bug&#xff0c;發表出來只…

C++單例模式簡單實現

有時候我們需要某個類只能被實例化一次&#xff0c;并且其他類都可以訪問到這個類&#xff0c;就需要這種設計模式。 例如我們想要做個資源管理器&#xff0c;顯然這個管理器只能有一個。 這種模式有很多實現方式&#xff0c;這里介紹最簡單的一種&#xff0c;想要了解更多可…

Linux C++ 實現線程池

http://blog.csdn.net/qq_25425023/article/details/53914609 線程池中的線程&#xff0c;在任務隊列為空的時候&#xff0c;等待任務的到來&#xff0c;任務隊列中有任務時&#xff0c;則依次獲取任務來執行&#xff0c;任務隊列需要同步。 Linux線程同步有多種方法&#xff…

C++制表符

制表符的轉義字符為\t&#xff0c;一般情況下長度為8個空格&#xff0c;這里的8個指的是從上一個字符串的開頭開始算&#xff0c;往后數8個&#xff0c;不夠的話就補空格。 如果前面的字符串的長度大于等于8個&#xff0c;例如前面字符串的長度為x,那么就會補(8-x%8)個空格 例…

C++派生類含有成員對象構造函數析構函數順序

參考博客&#xff1a;傳送門1 當類中含有對象成員時&#xff1a; 類的構造函數要包含對成員對象的初始化&#xff0c;如果構造函數的成員初始化列表沒有包含對成員對象的初始化&#xff0c;系統會自動調用成員對象的無參構造函數。順序上&#xff1a;先調用成員對象的構造函數…

c,c++中字符串處理函數strtok,strstr,strchr,strsub

http://blog.csdn.net/wangqing_12345/article/details/51760220 1&#xff0c;字符串切割函數 函數原型&#xff1a;char *strtok(char *s, char *delim); 函數功能&#xff1a;把字符串s按照字符串delim進行分割&#xff0c;然后返回分割的結果。 函數使用說&#xff1a; 1…