百戰c++(1)

Public和private的區別

public和private是類里的關鍵字,用于規定類內數據或者成員函數的訪問權限。private類型的數據或者函數,只能在相應的類內被訪問,而public類型的數據或者函數被訪問的權限比較寬,還可以在其它類或者其它函數中被訪問。

可以通過友元函數的方式在其他類中訪問私有成員函數。

構造函數可以私有嗎?

可以。

私有構造函數意味著只能在自身內部創建實例,加上static可以保證改類只有一個實例。

這種方式常用語單例模式。

什么是多態,什么是動態綁定。

多態是指同一個函數可以根據對象的不同而采用多種不同的行為方式.與之相對應是靜態綁定,即在函數編譯的時候決定要調用的函數。動態綁定,只有當程序運行的時候才能根據具體的對象來調用相應的函數。

多態存在的三個必要條件
一、要有繼承;
二、要有重寫;
三、父類引用指向子類對象。

回調函數和回調機制

⑴定義一個回調函數;

⑵提供函數實現的一方在初始化的時候,將回調函數的函數指針注冊給調用者;

⑶當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理。

被調用的函數。

Static 關鍵字的作用

1. 全局靜態變量

在全局變量前加上關鍵字static,全局變量就定義成一個全局靜態變量.

靜態存儲區,在整個程序運行期間一直存在。

初始化:未經初始化的全局靜態變量會被自動初始化為0(自動對象的值是任意的,除非他被顯式初始化);

作用域:全局靜態變量在聲明他的文件之外是不可見的,準確地說是從定義之處開始,到文件結尾。

2. ?局部靜態變量

在局部變量之前加上關鍵字static,局部變量就成為一個局部靜態變量。

內存中的位置:靜態存儲區

初始化:未經初始化的全局靜態變量會被自動初始化為0(自動對象的值是任意的,除非他被顯式初始化);

作用域:作用域仍為局部作用域,當定義它的函數或者語句塊結束的時候,作用域結束。但是當局部靜態變量離開作用域后,并沒有銷毀,而是仍然駐留在內存當中,只不過我們不能再對它進行訪問,直到該函數再次被調用,并且值不變;

3. 靜態函數

在函數返回類型前加static,函數就定義為靜態函數。函數的定義和聲明在默認情況下都是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其他文件所用。

函數的實現使用static修飾,那么這個函數只可在本cpp內使用,不會同其他cpp中的同名函數引起沖突;

warning:不要再頭文件中聲明static的全局函數,不要在cpp內聲明非static的全局函數,如果你要在多個cpp中復用該函數,就把它的聲明提到頭文件里去,否則cpp內部聲明需加上static修飾;

4. 類的靜態成員

在類中,靜態成員可以實現多個對象之間的數據共享,并且使用靜態數據成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有對象中共享的成員,而不是某個對象的成員。對多個對象來說,靜態數據成員只存儲一處,供所有對象共用

5. 類的靜態函數

靜態成員函數和靜態數據成員一樣,它們都屬于類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。

在靜態成員函數的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員(這點非常重要)。如果靜態成員函數中要引用非靜態成員時,可通過對象來引用。從中可看出,調用靜態成員函數使用如下格式:<類名>::<靜態成員函數名>(<參數表>);

?說一下C++中static關鍵字的作用

對于函數定義和代碼塊之外的變量聲明,static修改標識符的鏈接屬性,由默認的external變為internal,作用域和存儲類型不改變,這些符號只能在聲明它們的源文件中訪問。

對于代碼塊內部的變量聲明,static修改標識符的存儲類型,由自動變量改為靜態變量,作用域和鏈接屬性不變。這種變量在程序執行之前就創建,在程序執行的整個周期都存在。

對于被static修飾的普通函數,其只能在定義它的源文件中使用,不能在其他源文件中被引用

對于被static修飾的類成員變量和成員函數,它們是屬于類的,而不是某個對象,所有對象共享一個靜態成員。靜態成員通過<類名>::<靜態成員>來使用。

?說一說c++中四種cast轉換

C++中四種類型轉換是:static_cast, dynamic_cast, const_cast, reinterpret_cast

??? static_cast<double>(a) / static_cast<double>(b);

1、const_cast

用于將const變量轉為非const

2、static_cast

??(1)用于類層次結構中基類和派生類之間指針或引用的轉換
? ??? 進行上行轉換(把派生類的指針或引用轉換成基類表示)是安全的
? ??? 進行下行轉換(把基類的指針或引用轉換為派生類表示),由于沒有動態類型檢查,所以是不安全的
? ? (2)用于基本數據類型之間的轉換,如把int轉換成char。這種轉換的安全也要開發人員來保證
? ? (3)把空指針轉換成目標類型的空指針
? ? (4)把任何類型的表達式轉換為void類型

3、dynamic_cast

用于動態類型轉換。只能用于含有虛函數的類,用于類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,如果是非法的對于指針返回NULL,對于引用拋異常。要深入了解內部轉換的原理。

向上轉換:指的是子類向基類的轉換

向下轉換:指的是基類向子類的轉換

它通過判斷在執行到該語句的時候變量的運行時類型和要轉換的類型是否相同來判斷是否能夠進行向下轉換。

4、reinterpret_cast

幾乎什么都可以轉,比如將int轉指針,可能會出問題,盡量少用;

5、為什么不使用C的強制轉換?

C的強制轉換表面上看起來功能強大什么都能轉,但是轉化不夠明確,不能進行錯誤檢查,容易出錯。

請說一下C/C++ 中指針和引用的區別?

1.指針有自己的一塊空間,而引用只是一個別名;

2.使用sizeof看一個指針的大小是4,而引用則是被引用對象的大小;

3.指針可以被初始化為NULL,而引用必須被初始化且必須是一個已有對象 的引用;

4.作為參數傳遞時,指針需要被解引用才可以對對象進行操作,而直接對引 用的修改都會改變引用所指向的對象;

5.可以有const指針,但是沒有const引用;

6.指針在使用中可以指向其它對象,但是引用只能是一個對象的引用,不能 被改變;

7.指針可以有多級指針(**p),而引用至于一級;

8.指針和引用使用++運算符的意義不一樣;

9.如果返回動態內存分配的對象或者內存,必須使用指針,引用可能引起內存泄露。

1、引用:

C++是C語言的繼承,它可進行過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。引用就是C++對C語言的重要擴充。引用就是某一變量的一個別名,對引用的操作與對變量直接操作完全一樣。引用的聲明方法:類型標識符 &引用名=目標變量名;引用引入了對象的一個同義詞。定義引用的表示方法與定義指針相似,只是用&代替了*。

2、指針:

指針利用地址,它的值直接指向存在電腦存儲器中另一個地方的值。由于通過地址能找到所需的變量單元,可以說,地址指向該變量單元。因此,將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內存單元。

虛函數表

一個類只有一個虛函數表存放在只讀數據段,。每個類的實例化對象有一個虛函數表指針指向虛函數表。

只要父類有虛函數表,不論子類有沒有虛函數,都有虛函數表。基類的虛函數表和子類的虛函數表不是同一個表

單繼承中父類一個虛函數表,子類一個虛函數表,如子類重寫父類虛函數,子類虛函數表相應內容會被覆蓋,指向子類函數。

多次單繼承中 子類在父類的基礎上進行修改。

多基繼承:有多少個基類類就有多少個虛函數表

1.子類虛函數會覆蓋每一個父類的每一個同名虛函數。

2.父類中沒有的虛函數而子類有,填入第一個虛函數表中,且父類指針是不能調用。

3.父類中有的虛函數而子類沒有,則不覆蓋。僅子類和該父類指針能調用。

4.如果子類有新的虛函數,那么就添加到第一個虛函數表的末尾。

Explicit的作用是

C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換構造函數進行的隱式轉換的發生。聲明為explicit的構造函數不能在隱式轉換中使用。

Const關鍵字

int i = 0;

const int* p1 = &i;??? 指向的值不能改變,但是指針可以改變

int const* p2 = &i;?????? 指向的值不能改變,但是指針可以改變

int* const p3 = &i;???? 指針不能改變 ?,值可以改變

const int* const p4 = &i;? 都不能變

?const?常量作為參數傳入時,該常量一定需要是引用類型???

void setName(const string& name); 引用傳遞才能真正起到 const 的作用

void setName(const string name);? 值傳遞 傳進來是副本 不會造成更改

const對象只能訪問const成員函數,而非const對象可以訪問任意的成員函數,包括const成員函數;
const對象的成員是不能修改的,而通過指針維護的對象確實可以修改的;
const成員函數不可以修改對象的數據,不管對象是否具有const性質。編譯時以是否修改成員數據為依據進行檢查。

任何不會修改數據成員的函數都應該聲明為const類型。如果在編寫const成員函數時,不慎修改了數據成員,或者調用了其它非const成員函數,編譯器將指出錯誤。

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

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

相關文章

一學就廢的三種簡單排序【冒泡、插入、選擇】

文章目錄其他排序算法冒泡排序算法實現代碼實例插入排序算法實現代碼實例選擇排序算法實現代碼實例其他排序算法 一學就廢的歸并排序 冒泡排序 排列順序從前到后或者從后往前都可&#xff0c;本文選擇從后到前的順序&#xff0c;升序排列&#xff1a;比較相鄰兩個元素&#x…

百戰c++(2)

delete 和 delete []的真正區別 delete 對應 new delete[]對應new[]對于簡單類型包括簡單類型數組&#xff0c;delete 與delete[]沒有區別。對于自定義類型數組&#xff0c;delete 只會刪除一個元素&#xff0c;delete 則會刪除所有元素。 指針和數組的區別 野指針是什么 野指…

shell預先定義的特殊變量

文章目錄$#$*$$$# 表示命令行上參數的個數&#xff0c;但不包括shell腳本名本身 為腳本ex1賦予兩個變量&#xff0c;測試$#的輸出結果 [cmybogon test2]$ . ex1 ma.c mb.c 2 # echo $# 7 # cat $1 $2 $3 | wc -l 2 # echo $#腳本ex1的具體內容 [rootlocalhost test]$ cat ex1…

Linux實驗一:常用的Linux命令

文章目錄一、實驗目的二、實驗要求三、實驗內容1、系統的使用2、命令的使用3、文件操作4、系統詢問與權限口令5、其它常用命令四、實驗操作1、基本命令的使用2、文件和目錄操作3、創建用戶帳戶一、實驗目的 1、熟悉Linux的桌面環境&#xff1b; 2、了解Linux所安裝的軟件包 3、…

Linux實驗二:vi編輯器的使用

文章目錄一、實驗目的二、實驗要求三、實驗內容1、創建文件2、編輯文件一、實驗目的 1、練習并掌握Linux提供的vi編輯器來編譯C程序 2、學會利用gcc、gdb編譯、調試C程序 3、本次實驗的目的是讓同學們了解如何使用vi編輯器進行創建和編輯文件 二、實驗要求 1、文件編輯器vi…

百戰c++(os1)

Linux中的鎖 互斥鎖&#xff1a;mutex&#xff0c;用于保證在任何時刻&#xff0c;都只能有一個線程訪問該對象。當獲取鎖操作失敗時&#xff0c;線程會進入睡眠&#xff0c;等待鎖釋放時被喚醒 讀寫鎖&#xff1a;rwlock&#xff0c;分為讀鎖和寫鎖。處于讀操作時&#xff0…

Linux實驗三:Shell編程

文章目錄一、實驗目的二、實驗要求三、實驗內容1、通配符的使用2、重定向3、管道4、shell變量5、建立下面的腳本&#xff0c;運行并分析輸出結果&#xff0c;并給出代碼注釋。6、編寫腳本一、實驗目的 1.為文件擴展名使用通配符 2.標準輸入、標準輸出和標準錯誤的重定向 3.使…

a href=#與 a href=javascript:void(0) 的區別

a href"#"> 點擊鏈接后&#xff0c;頁面會向上滾到頁首&#xff0c;# 默認錨點為 #TOP<a href"javascript:void(0)" onClick"window.open()"> 點擊鏈接后&#xff0c;頁面不動&#xff0c;只打開鏈接<a href"#" οnclick&…

Linux實驗四:編譯和調試工具的使用

文章目錄一、實驗目的&#xff1a;二、實驗要求三、實驗內容四、實驗操作1、用gcc編譯程序&#xff0c;寫出編譯過程&#xff0c;并給出運行結果。2、調試程序&#xff0c;要求用gdb進行調試并給出修改方案。3、make的使用一、實驗目的&#xff1a; 1、練習并掌握Linux提供的v…

Linux實驗五:Linux環境下的C語言編程

文章目錄一、實驗目的&#xff1a;二、實驗要求三、實驗內容1、編寫一段C語言程序使其完成&#xff1a;父進程創建兩個子進程&#xff0c;每個進程都在屏幕上顯示自己的進程ID號。2、上機調試下面的程序&#xff0c;觀察運行結果&#xff0c;分析原因。3、利用兩個管道進行雙向…

百戰c++(4)

1.求下面函數的返回值&#xff08;微軟&#xff09; int func(x) { int countx 0; while(x) { countx ; x x&(x-1); } return countx; } 假定x 9999。 答案&#xff1a;8 思路&#xff1a;將x轉化為2進制&#xff0c;看含有的1的個數。 2. 什么是“引用”&…

ndarray對象的建立

文章目錄ndarray&#xff08;別名array&#xff09;常用屬性創建NumPy數組使用array()函數使用zeros()函數使用ones()函數使用empty()函數使用arange()函數注意ndarray&#xff08;別名array&#xff09; 常用屬性 import numpy as np # Numpy工具包data np.arange(12).res…

百戰c++(5)

11. 已知strcpy的函數原型&#xff1a;char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串&#xff0c;strSrc 是源字符串。不調用C/C 的字符串庫函數&#xff0c;請編寫函數 strcpy。 答案&#xff1a; char *strcpy(char *strDest, const char *strS…

Numpy數組的廣播機制

文章目錄前言數組廣播廣播機制的使用條件前言 Numpy數組不需要循環遍歷&#xff0c;即可對每個元素執行批量的算術運算操作&#xff08;矢量化運算&#xff09;。當兩個數組大小&#xff08;Numpy.shape&#xff09;不同時&#xff0c;進行算術運算會出現廣播機制。 數組廣播…

百戰c++(6)

26. 描述內存分配方式以及它們的區別? 1&#xff09; 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好&#xff0c;這塊內存在程序的整個運行期間都存在。例如全局變量&#xff0c;static 變量。 2&#xff09; 在棧上創建。在執行函數時&#xff0c;函數內局部變量的…

Spring3.1.0+Quartz1.8.6整合實現計劃任務

1.首先要加入任務計劃的相關的jar包&#xff0c;這里除了需要加Spring3.1.0的jar&#xff0c;還需要加quartz-all-1.8.6.jarslf4j-api-1.5.8.jar slf4j-log4j12.jar這三個包&#xff0c;如果你是SSH整合的項目&#xff0c;里面有下面的兩個包了&#xff0c;就可以不加&#xff…

百戰c++(7)

40. 鏈表題&#xff1a;一個鏈表的結點結構 struct Node { int data ; Node *next ; }; typedef struct Node Node ; (1)已知鏈表的頭結點head,寫一個函數把這個鏈表逆序 ( Intel) Node * ReverseList(Node *head) //鏈表逆序 { if ( head NULL || head->next NU…

數組的轉置和軸對稱

文章目錄T屬性transpose()方法swapaxes()方法T屬性 import numpy as np # Numpy工具包data np.arange(12).reshape(3, 4) # 創建一個3行4列的數組 print(data)# 數組的轉置和軸對稱 data1 data.T print(data1)print(data) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] print(dat…

百戰c++(8)

43. 寫一個在一個字符串(n)中尋找一個子串(m)第一個位置的函數。 KMP算法效率最好&#xff0c;時間復雜度是&#xff2f;(nm)。 44. 多重繼承的內存分配問題&#xff1a; 比如有class A : public class B, public class C {} 那么A的內存結構大致是怎么樣的&#xff1f; 這…

管道實現父子進程的信息傳遞(一)【fork函數、pipe函數、write/read操作、wait函數】

文章目錄題目描述代碼實現關于pipe函數關于讀寫操作關于讀寫端口關于wait函數功能&#xff1a;注意&#xff1a;關于fork函數題目描述 編寫一個程序&#xff0c;利用管道實現父子進程的通信&#xff0c;父進程向子進程發送信息&#xff0c;由子進程輸出顯示。 代碼實現 #inclu…