C++ primer 第7章 類

成員函數的聲明必須在類的內部,定義則既可以在類的內部,也可以在類的外部。
作為接口組成部分的非成員函數,它們的定義和聲明都在類的外部。

類可以允許其他類或者函數訪問它的非公有成員,方法是令其他類或函數成為它的友元。如果類想把一個函數作為它的友元,只需要增加一條以friend關鍵字開始的函數聲明語句即可。

友元聲明只能出現在類定義的內部,但是在類內出現的具體位置不限。友元不是類的成員,不受所在區域訪問控制級別的約束。一般來說,最好在類定義開始或結束前的位置集中聲明友元。
如果一個類指定了友元類,聲明形式friend class 類名,則友元類的成員函數可以訪問此類包括非公有成員在內的所有成員。
友元關系不存在傳遞性。

可變數據成員,是在變量的聲明中加入mutable關鍵字,任何成員函數,包括const成員函數,都可以修改可變數據成員的值。

含有指針數據成員的類一般不宜使用默認的拷貝和賦值操作,如果類的數據成員都是內置類型的,則直接使用類對象執行拷貝和賦值操作是可以的。

要想把類的成員函數定義成內聯函數,有幾種不同的途徑。第一種是直接把函數定義放在類的內部,第二種是把函數定義放在類的外部,并且在定義之前顯示地指定inline。

類允許包含指向它自身類型的引用或指針。

如果類的數據成員是const、引用,或者屬于某種未提供默認構造函數的類類型,我們必須通過構造函數初始值列表為這些成員提供初值,示例如下:
類名(參數列表...):i(ii),ci(ii),ri(i){}
在很多類中,初始化和賦值的區別事關底層效率問題:前者直接初始化數據成員,后者則先初始化再賦值。除了效率問題外更重要的是,一些數據成員必須被初始化。
成員的初始化順序與它們在類定義中的出現順序一致:第一個成員先被初始化,然后第二個,以此類推。構造函數初始值列表中初始值的前后位置關系不會影響實際的初始化順序。

如果一個構造函數為所有參數都提供了默認實參,則它實際上也定義了默認構造函數。

將構造函數聲明為explicit可抑制構造函數的隱式轉換。關鍵字explicit只對一個實參的構造函數有效,需要多個實參的構造函數不能用于執行隱式轉換,所以無需將這些構造函數指定為explicit。只能在類內聲明構造函數時使用explicit關鍵字,在類外部定義時不應加explicit關鍵字。

聚合類使得用戶可以直接訪問其成員,并且具有特殊的初始化語法形式。當一個類滿足如下條件時,我們說它是聚合的:

  • 所有成員都是public的
  • 沒有定義任何構造函數
  • 沒有類內初始值
  • 沒有基類也沒有虛函數

除了靜態常量成員之外,其他靜態成員不能在類的內部初始化。

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

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

相關文章

codeforces 705A-C語言解題報告

題目網址 題目解析 1.重點:結尾是it,中間使用that連接,所以使用for循環,奇數輸出I hate,偶數輸出I love,i!n時,輸出that 代碼 #include<stdio.h> #include<stdlib.h> #define SIZE 100000 int main() {int n0;scanf("%d",&n);if(n1){printf(&quo…

牛客網 鏈表結構 算法相關內容

鏈表結構 單鏈表的節點結構 由以下結構的節點依次連接起來所形成的鏈叫單鏈表結構 Clas Node<V>{ V value; Node next; } 雙鏈表的節點結構 由以下結構的節點依次連接起來所形成的鏈叫雙鏈表結構 Clas Node<V>{ V value; Node next; Node last; } 單鏈表和雙…

C++ primer 第8章 IO庫

文章目錄IO庫類型和頭文件IO對象無拷貝或賦值IO流的條件狀態文件輸入輸出ifstream 示例ofstream 示例文件模式以out模式打開文件會丟棄已有數據每次調用open時都會確定文件模式ofstream 保留源文件 追加數據 示例string流istringstream示例ostringstream示例IO庫類型和頭文件 …

codeforces 486A-C語言解題報告

題目網址 題目解析 1.f(n)(-1)^nn 2.使用long long int 3.總結找出規律: if(i%2!0) return -1(i1)/2; else return i/2; 直接暴力求解—超時 #include<stdio.h> #include<stdlib.h> // TIME_LIMIT_EXCEEDED,此方法不行,超時 //注意規律&#xff01;&#xff01…

C++面試寶典 基本語言(三)

如果同時定義了兩個函數&#xff0c;一個帶const&#xff0c;一個不帶&#xff0c;會有問題嗎&#xff1f; 不會&#xff0c;這相當于函數的重載 #include<iostream> class A{ public:void print()const{std::cout << "Hello" << std::endl;}void…

C++ primer 第9章 順序容器

文章目錄順序容器類型確定使用哪種順序容器容器庫概覽容器操作迭代器迭代器支持的所有操作迭代器支持的所有運算迭代器范圍對構成范圍的迭代器的要求標準庫迭代器范圍左閉右開的三種性質容器定義和初始化將一個新容器創建為另一個容器的拷貝將array拷貝到vector中的代碼與順序容…

常用單位換算

字節單位換算 B(byte)字節 bit 位 1B 8 bit 1KB&#xff08;Kilobyte&#xff0c;千字節&#xff09;1024B 2^10 B&#xff1b; 1MB&#xff08;Megabyte&#xff0c;兆字節&#xff0c;百萬字節&#xff0c;簡稱“兆”&#xff09;1024KB 2^20 B&#xff1b; 1GB&#xf…

牛客網C++面經 容器和算法

原文網址 參考網址 C語言中文網 請你來說一下map和set有什么區別&#xff0c;分別又是怎么實現的&#xff1f; map和set都是C的關聯容器&#xff0c;其底層實現都是紅黑樹&#xff08;RB-Tree&#xff09;。由于 map 和set所開放的各種操作接口&#xff0c;RB-tree 也都提供…

C語言指針-字符指針整型指針char*s int*a

案例代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {//字符指針char *pstr"good dog ww";printf("字符指針指向的字符串內容:%s\n",pstr);printf("字符指針本身的地址:%p\n",&pstr);printf…

C++ primer 第10章 泛型算法

文章目錄概述findcount初識泛型算法只讀算法只讀算法accumulate只讀算法equal寫容器元素的算法算法fill算法fill_nback_inserter算法copy算法replace replace_copy重排容器元素的算法sortuniqueunique_copy定制操作向算法傳遞函數謂詞算法stable_sort算法partitionlambda表達式…

C語言常用字符串函數

概括 代碼 #include<stdlib.h> #include<stdio.h> #include<string.h> int main() {//常用字符串函數char a[]"abcSDFbnm";char b[]"SD";printf("a的字符串長度:%d\n",strlen(a));printf("b的字符串長度:%d\n",str…

C++ primer 第11章 關聯容器

文章目錄使用關聯容器map示例關聯容器概述定義關聯容器關聯容器值初始化multimap和multiset關鍵字類型的要求pair類型pair上的操作關聯容器操作關聯容器額外的類型別名關聯容器迭代器map迭代器set迭代器關聯容器和算法添加元素向map添加元素檢測insert的返回值使用insert代替下…

C++ primer 第12章 動態內存

文章目錄前言動態內存與智能指針shared_ptr類shared_ptr和unique_ptr都支持的操作shared_ptr獨有的操作make_shared 函數shared_ptr的拷貝和賦值shared_ptr自動銷毀所管理的對象shared_ptr還會自動釋放相關聯的內存程序使用動態內存出于以下原因直接管理內存使用new動態分配和初…

C語言順序查找二分查找

介紹 順序查找 按照順序一個個查找 #include<stdio.h> //順序查找 int search(int arr[],int len,int aim) {int i;for(i0;i<len;i){if(arr[i]aim){return i;//返回下標 }}return -1;//表示未查詢到} int main() {int arr[]{13,355,256,65,234,-1,35,-6,-3,-4,0};…

C++ primer 第12章 12.3 使用標準庫:文本查詢程序

文章目錄使用標準庫&#xff1a;文本查詢程序文本查詢程序設計數據結構在類之間共享數據自己的文本查詢程序書中的文本查詢程序使用標準庫&#xff1a;文本查詢程序 我們將實現一個簡單的文本查詢程序&#xff0c;作為標準庫相關內容學習的總結。 我們的程序允許用戶在一個給…

C語言二維數組 int arr[2][3]

基礎使用 先遍歷行再遍歷列 #include<stdio.h> //二維數組的基本使用 int main() {//二維數組的初始化int arr1[2][2]{{2,2},{0,0}};int arr2[2][3]{2,2,2,8,8,8};int arr3[6][9];int i,j;for(i0;i<6;i){for(j0;j<9;j){arr3[i][j]1;}}arr3[2][5]0;//打印printf(&…

牛客網C++面經 類和數據抽象

請你來說一下C中struct和class的區別 在C中&#xff0c;可以用struct和class定義類&#xff0c;都可以繼承。區別在于&#xff1a;structural的默認繼承權限和默認訪問權限是public&#xff0c;而class的默認繼承權限和默認訪問權限是private。另外&#xff0c;class還可以定義…

C++ primer 第13章 拷貝控制

文章目錄前言拷貝、賦值與銷毀拷貝構造函數合成拷貝構造函數拷貝初始化和直接初始化拷貝初始化的發生&#xff1a;參數和返回值拷貝初始化的限制拷貝賦值運算符重載賦值運算符合成拷貝賦值運算符析構函數析構函數完成的工作什么時候會調用析構函數合成析構函數代碼片段調用幾次…

C語言 指針自增自減加減運算 p++ p+i

介紹 自增自減代碼 #include<stdio.h> #include<string.h> //指針自增--short void increase(short *arr,int len) {int i;arr&arr[0];for(i0;i<len;i){printf("arr[%d]%d,address%p\n",i,*arr,arr);arr;} }//指針自減--char void decrease(char…

C++ 編譯與底層

原文鏈接 編譯與底層請你來說一下一個C源文件從文本到可執行文件經歷的過程&#xff1f; 對于C源文件&#xff0c;從文本到可執行文件一般需要四個過程&#xff1a;預處理階段&#xff1a;對源代碼文件中文件包含關系&#xff08;頭文件&#xff09;、預編譯語句&#xff08;…