c++ 內存,虛函數,運算函數,三角函數

2020-12-04 zhangjiqun

棧內存:在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配,存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。

堆內存:用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。

C++ 動態內存

棧:在函數內部聲明的所有變量都將佔用棧內存。

堆:這是程序中未使用的內存,在程序運行時可用於動態分配內存。

很多時候,您無法提前預知需要多少內存來存儲某個定義變量中的特定信息,所需內存的大小需要在運行時才能確定。

在 C++ 中,您可以使用特殊的運算符為給定類型的變量在運行時分配堆內的內存,這會返回所分配的空間地址。這種運算符即 new 運算符。

如果您不再需要動態分配的內存空間,可以使用 delete 運算符,刪除之前由 new 運算符分配的內存。

new 和 delete 運算符

== 與equal,簡單的說「equal」比較的是指基本類型比較的是指針最終指向的是數值,"=="比較的是對象地址。這是根本的區別。

複合函數:由兩個函數複合而成的複合函數,當裡層的函數是偶函數時,複合函數的偶函數,不論外層是怎樣的函數;當裡層的函數是奇函數、外層的函數也是奇函數時,複合函數是奇函數,當裡層的函數是奇函數、外層的函數是偶函數時,複合函數是偶函數。只有奇奇是奇奇,別的都是偶。

三角函數:

sin^2(x)+cos^2(x)=1;

1+tan^2(x)=sec^2(x);

1+cot^2(x)=csc^2(x);

cos(2x)=1-2sin^2 (x) = 2cos^2x-1 = cos^2(x)-sin^2(x);

(tan(x))'=sec^2(x) = 1+tan^2(x);

sin(2x)=2sin(x)cos(x);

虛函數和純虛函數:就是java中的抽象,純虛函數只有聲明沒有具體實現就是空方法,在子類中必須重新寫,虛函數就是在基類中寫了有實現。他們都得用關鍵字 virtual(虛擬的) 聲明的函數

1. 虛函數和純虛函數可以定義在同一個類(class)中,含有純虛函數的類被稱為抽象類(abstract class),而只含有虛函數的類(class)不能被稱為抽象類(abstract class)。

2. 虛函數可以被直接使用,也可以被子類(sub class)重載以後以多態的形式調用,而純虛函數必須在子類(sub class)中實現該函數才可以使用,因為純虛函數在基類(base class)只有聲明而沒有定義

3. 虛函數和純虛函數都可以在子類(sub class)中被重載,以多態的形式被調用。

4. 虛函數和純虛函數通常存在於抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個統一的接口。

C++ 中的運算符重載

重載的運算符是帶有特殊名稱的函數,函數名是由關鍵字 operator和其後要重載的運算符符號構成的。與其他函數一樣,重載運算符有一個返回類型和一個參數列表。

Box operator+(const Box&);

聲明加法運算符用於把兩個 Box 對象相加,返回最終的 Box 對象。大多數的重載運算符可被定義為普通的非成員函數或者被定義為類成員函數。如果我們定義上面的函數為類的非成員函數,那麼我們需要為每次操作傳遞兩個參數,如下所示:

Box operator+(const Box&, const Box&);

數據封裝是一種把數據和操作數據的函數捆綁在一起的機制

數據抽象是一種僅向用戶暴露接口而把具體的實現細節隱藏起來的機制

C++ 接口(抽象類):

如果類中至少有一個函數被聲明為純虛函數,則這個類就是抽象類。純虛函數是通過在聲明中使用 "= 0" 來指定的,如下所示:

class Box { public: // 純虛函數

virtual double getVolume() = 0;

#和##運算符

#是預處理?是的,你可以這麼認為。那怎麼用它呢? 別急,先看下面例子:

#define SQR(x) printf("The square of x is %d.\n", ((x)*(x)));

The square of x is 64.

注意到沒有,引號中的字符 x 被當作普通文本來處理,而不是被當作一個可以被替換的語言符號。

假如你確實希望在字符串中包含宏參數,那我們就可以使用「#」 ,它可以把語言符號轉

化為字符串。上面的例子改一改:

#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));

The square of 8 is 64.

##運算符可以用於宏函數的替換部分。這個運算符把兩個語言符號組合成單個語言符號。看例子:

#define XNAME(n) x ## n

則會被展開成這樣:

x8

也就是說,##就是個粘合劑,將前後兩部分粘合起來

const const 類型的對象在程序執行期間不能被修改改變。

volatile 修飾符 volatile 告訴編譯器不需要優化volatile聲明的變量,讓程序可以直接從內存中讀取變量。對於一般的變量編譯器會對變量進行優化,將內存中的變量值放在寄存器中以加快讀寫效率。

restrict 由 restrict 修飾的指針是唯一一種訪問它所指向的對象的方式。只有 C99 增加了新的類型限定符 restrict。

總結排序:認準1.數組規模。2.數組是否基本有序3.是否要求穩定

記住:冒泡以及歸併是穩定的。

快排不穩定,基本就能解決問題

(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。

當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。

(2)若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;

(3)若n較大,則應採用時間複雜度為O(nlgn)的排序方法:快速排序、堆排序或歸併排序。

快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;

堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。

若要求排序穩定,則可選用歸併排序。但本章介紹的從單個記錄起進行兩兩歸併的 排序算法並不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子文件,然後再兩兩歸併之。因為直接插入排序是穩定 的,所以改進後的歸併排序仍是穩定的。

計算機原理中的位向量表示集合:

a=[01101001]表示{0,3,5,6}

b=[01010101]表示{0,2,4,6}

最終a&b={01000001}={0,6}

以題目的例子來講,a=[01101001],從右邊數起,第0、3、5、6位是1,所以就表示了0、3、5、6這4個數,b的話同理,對應的是0、2、4、6這4個數。之後的併集就不用再說了吧。

結構體解釋:

typedef struct LNode{ //此行的LNode是一個結構標籤

ElemType data;

struct LNode *next;

}LNode,*LinkList; //此行的LNode是結構體struct LNode的一個別名

//*LinkList也是結構體struct LNode的一個別名

//換言之LinkList是結構體struct LNode類型的指針的別名

//也就是說 struct LNode *p;這條語句等同於LinkList p;使用:p->date

逗號運算符和逗號表達式

3+5,6+8上式稱為逗號表達式。逗號表達式的一般形式為

表達式1,表達式2

逗號表達式的求解過程是:先求解表達式1,再求解表達式2。整個逗號表達式的值是表達式2的值

switch的default問題。不同位置結果不同

#include <iostream>

using namespace std;

int main()

{

int a=1,b=2,c=3,d=4,y=10;

switch(y){

case 1:a++;break;

default:d=1;

case 2:b++;break;//b是可以跑進去的

case 4:c++;break;

}

cout << a<<b<<c<<d<< endl;

return 0;

}

結果:

1331

友元不是成員函數,只有成員函數才可以是虛擬的,因此友元不能是虛擬函數。但可以通過讓友元函數調用虛擬成員函數來解決友元的虛擬問題。

析構函數(destructor) 與構造函數相反,當對象結束其生命周期,如對象所在的函數已調用完畢時,系統自動執行析構函數。析構函數往往用來做「清理善後」 的工作(例如在建立對象時用new開闢了一片內存空間,delete會自動調用析構函數後釋放內存)。

析構函數應當是虛函數,將調用相應對象類型的析構函數,因此,如果指針指向的是子類對象,將調用子類的析構函數,然後自動調用基類的析構函數。

相關焦點

  • C++中的虛函數(virtual function)
    正在閱讀:C++中的虛函數(virtual function)C++中的虛函數(virtual function)2005-07-15 10:36出處:作者:unknow>一.簡介   虛函數是C++中用於實現多態(polymorphism)的機制。核心理念就是通過基類訪問派生類定義的函數。
  • 重要的三角函數公式,複合函數奇偶性
    重要的三角函數公式強烈的糾正x ,1/x之間不是反函數的關係,這是由於定義給的公式造成的。重要的三角函數公反函數一般來說,你認準:關於y=x對稱。在補充一點三角函數導數關係式 :sin 與csc;cos與sec。
  • 三角函數不僅是特殊的函數,還是每年高考數學的香餑餑
    我們對全國各省市的高考數學試題進行分類整理,通過對這些試題的分析和研究,特別是對有關三角函數、三角恆等變換和解三角形的試題進行整理和分析,總結這部分試題的命題特點,發現高考對三角函數的考查,一方面注重考查基礎知識和基本方法,另一方面注重化歸與轉化的思想方法的滲透,注重整體思想的運用
  • 一起來討論特殊函數、三角函數誘導公式、基本初等函數圖像的性質
    大家好,我是專升本數學學霸,這次我們繼續來討論分段函數、三角函數誘導公式、基本初等函數圖像的性質。那你知道分段函數、三角函數誘導公式、基本初等函數圖像的性質嗎?學霸來幫你來了。首先,我們來看看幾個特殊函數。
  • 關於函數、反函數、三角函數、反三角函數、雙曲函數的補充知識
    本文由公眾號「數學學習之友」原創, 歡迎 分享最近幾年高中數學教材教學改革後,導致一些省、區的同學在高中學到的三角函數
  • 函數存在反函數的條件是什麼?
    一個函數的定義域若是一個區間,則該函數存在反函數的充要條件是函數在定義域內嚴格單調。請看圖1,根據定義,不妨嘗試判斷下哪個函數具有反函數?這是因為假設一個函數就一個點,如f(x)=x,定義域為x=1,那沒有所謂的嚴格單調之說了,這個函數也存在反函數。當然在現實中,討論一個點的函數沒有多大意義。2.三角函數的反函數三角函數的反函數,稱為反三角函數。以正弦函數、餘弦函數、正切函數、餘切函數為例進行說明。圖2是上述四個三角函數的圖像。
  • 一個簡單的「貓吃老鼠」例子,5分鐘徹底弄懂C++中的虛函數
    初學者剛接觸C++語言中的 virtual 函數(虛函數)時,常常會感覺到迷惑,比如,書上說虛函數定義在基類中,其他繼承此基類的派生類都可以重寫該虛函數,因此虛函數是C++語言多態特性中非常重要的概念。但是派生類也可以重寫基類中的其他的常規函數(非虛函數)呀,那為什麼還要引入虛函數這樣看起來很複雜的概念呢?
  • excel函數技巧:如何用三角函數製作環形氣泡圖
    相信即便是一些「認為自己函數玩的不錯」的同學,看到上圖中的函數也是「懵」的。存在即合理,既然微軟有這些函數,就一定是多年使用EXCEL的客戶,對於使用體驗反饋中所涉及的,例如財務函數,在財務工作中大部分的計算都是「加減乘除」,可是對於真正的財務分析師來說,單純的四則運算是遠遠不夠的。
  • 必備知識 | 三角函數與反三角函數
    其他聯繫方式:(QQ郵箱)2589867447@qq.com三角函數是基本初等函數之一三角函數將直角三角形的內角和它的兩個邊的比值相關聯,也可以等價地用與單位圓有關的各種線段的長度來定義。三角函數在研究三角形和圓等幾何形狀的性質時有重要作用,也是研究周期性現象的基礎數學工具。
  • 指數函數和對數函數的運算法則
    指數函數和對數函數在高考中也經常考到,首先我們要了解指數函數和對數函數的運算法則,來體會法則背後的故事,一切法則背後的實質是運算法則。學習指數函數和對數函數,是將抽象的概念變為具體的應用,慢慢變得更加精緻,更加完整的學習過程。
  • 【指數函數和對數函數】圖解普林斯頓微積分 08
    第 9 章指數函數和對數函數本章的主要內容:9.1 基礎知識首先需要掌握三點:指數運算法則、對數和指數的關係
  • 對數運算與對數函數
    對數運算是指數運算的逆運算,啥叫逆運算?
  • 連續函數的運算與初等函數的連續性
    (複合函數的連續性)若函數f在點x0處連續,g在u0處連續,u0=f(x0),則複合函數g[f(x)]在點x0處連續,即連續函數的複合函數仍然連續。說 明:1、根據連續性的定義,上述結論可以表示為:2、若複合函數g[f(x)]的內函數f當
  • 數據分析之數學基礎(函數乾貨大全)
    標籤:數據分析、數學、基礎基本初等函數初等函數是由基本初等函數經過有限次的四則運算和複合運算所得到的函數。基本初等函數和初等函數在其定義區間內均為連續函數。其函數表達式和圖形如下:在上圖中,紫色的是a=2,灰色的是a=0.5。分別指的是0<a<1和a>1兩種情況的圖形。5.三角函數三角函數是數學中常見的一類關於角度的函數。
  • 指數運算與指數函數
    ……在整個指對運算和指對函數中,要記住兩個基本兩原則:質數原則和同底數原則。  多了一次平方運算,所謂的複合函數就是先做一個基本函數運算,在一個基本函數運算。先做的運算,如上圖的u(x)叫做內函數,f(u)叫外函數。從函數形式來看,一定是有先算和後算的關係
  • 三角函數與反三角函數(圖像)
    在三角函數的前面加上 arc ,表示它們的反函數
  • 高中數學:三角函數知識點總結,附特殊角的三角函數值,建議收藏
    三角函數是數學中屬於初等函數,進入高中學習,同學們應該都知道,三角函數是與我們整個高中學習生活都分不開的。但單單三角函數的公式就會讓初學者混淆,不容易記住,如此多且複雜的公式,又該如何去掌握好它們呢?其實學好三角函數並不困難,重要的是掌握好方法,掌握其本質,就一定會發現各個公式間的聯繫。 初中學到的只是三角函數的「皮毛」,高中在初中的基礎上增加了許多公式及運算規律,一下子,三角函數的知識構架就豐富了起來。
  • 超越函數的突破應對策略
    超越函數是指那些不滿足任何以多項式作係數的多項式方程的函數。說的更技術一些,單變量函數若為代數獨立於其變量的話,即稱此函數為超越函數。例如,對數函數和指數函數即為超越函數。超越函數這個名詞通常被拿來描述三角函數,例如正弦、餘弦、正割、餘割、正切、餘切、正矢、半正矢等。函數的不定積分運算是超越函數的豐富來源,如對數函數便來自代數函數的不定積分。在微分代數裡,人們研究不定積分如何產生與某類「標準」函數代數獨立的函數,例如將三角函數與多項式的合成取不定積分。
  • 小米有品開賣69元函數計算器:支持498種複雜運算
    9月13日,小米有品上架了一款得力函數計算器,採用高清LCD中文點陣顯示屏,支持498種複雜運算功能,原價72元,首發價69元。好用的計算器面板,按鍵排布合理設計。得力函數計算器,面板設計排列簡單易上手,分割式設計,防止手指尖按動失誤,減少失誤。大屏的設計,給眼睛造成更多負擔。
  • 對數函數及其運算
    很多同學認為對數函數,對數運算很難。其實對數很簡單。只要記住對數的定義,運算法則和函數圖像,就可以解決一切對數問題。