中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

外匯期貨喊單網(wǎng)站怎么做的網(wǎng)絡(luò)營銷產(chǎn)品策略

外匯期貨喊單網(wǎng)站怎么做的,網(wǎng)絡(luò)營銷產(chǎn)品策略,福州網(wǎng)站運(yùn)營,.net開發(fā)大型網(wǎng)站開發(fā)6. 引用(引用就是取別名) 6.1 引用的概念和定義 引用不是新定義一個變量,而是給已存在變量取了?個別名,編譯器不會為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。比如:水滸傳中李逵&…

6.?引用(引用就是取別名)

6.1?引用的概念和定義

引用不是新定義一個變量,而是給已存在變量取了?個別名,編譯器不會為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。比如:水滸傳中李逵,宋江叫"鐵牛",江湖上人稱"黑旋風(fēng)";林沖,外號豹子頭;

類型& 引用別名 = 引用對象;

C++中為了避免引入太多的運(yùn)算符,會復(fù)用C語言的?些符號,比如前面的<< 和 >>,這里引用也和取地址使用了同?個符號&,大家注意使用方法角度區(qū)分就可以。

?int a = 0;

// 引?:bca的別名

int& b = a;

int& c = a;

// 也可以給別名b取別名,d相當(dāng)于還是a的別名

int& d = b;

這串代碼在底層的角度是這樣的?

對指針變量取別名:

int* p1 = &a;?

int*& p2 = p1;

?指針變量的使用:?

typedef struct ListNode

{

? ?int val;

? ?struct ListNode* next;

}LTNode, *PNode;

int main()

{

? ?PNode plist = NULL;

? ?ListPushBack(plist, 1);

? ?return 0;

}

?這里的*PNode是指把typedef struct ListNode* 定義為PNode。

6.2?引用的特性

? 引用在定義時必須初始化

? ?個變量可以有多個引用
? 引用一旦引用?個實體,就不能引用其他實體

這里的d的地址沒變,說明d還是a的別名,d沒有指向e,只是把e的值賦給了d。

當(dāng)我們實現(xiàn)鏈表的時候,我們要刪除一個結(jié)點,但這時的地址之間是相互關(guān)聯(lián)的,因為引用不能改變指向,所以就不可能完成。所以C++的指針引用不能完全替代指針。

6.3?引用的使用

? 引用在實踐中主要是用于引用傳參和引用做返回值中減少拷貝提高效率和改變引用對象時同時改變被引用對象。引用用作別名,沒有額外開辟空間,可減少拷貝效率。

減少拷貝的案例:

? 引用傳參跟指針傳參功能是類似的,引用傳參相對更方便一些。
? 引用返回值的場景相對比較復(fù)雜,我們在這里簡單講了一下場景,還有一些內(nèi)容后續(xù)類和對象章節(jié)中會繼續(xù)深入講解。
? 引用和指針在實踐中相輔相成,功能有重疊性,但是各有特點,互相不可替代。C++的引用跟其他語言的引用(如Java)是有很大的區(qū)別的,除了用法,最大的點,C++引用定義后不能改變指向,
Java的引用可以改變指向。
? ?些主要用C代碼實現(xiàn)版本數(shù)據(jù)結(jié)構(gòu)教材中,使用C++引用替代指針傳參,目的是簡化程序,避開復(fù)雜的指針,但是很多同學(xué)沒學(xué)過引用,導(dǎo)致一頭霧水。

傳值傳參會生成一個拷貝,傳值返回也會生成一個拷貝。C++中是這樣規(guī)定的,在紅線這里進(jìn)行一個傳值返回,返回這個對象的時候,?他不會引用這個對象做函數(shù)調(diào)用的返回值,不會返回要返回的東西,它會生成一個臨時對象,把這的值給臨時變量,再用臨時變量做這個整個表達(dá)式的返回值。STTop(st1)+=1;這是的加1就是加到臨時對象上面。臨時對象具有常性。

那臨時對象是什么呢?

臨時變量通常是指編譯器在棧里面臨時開一塊空間存儲中間值的這種,也有可能是用寄存器去存。

這里如何使用STTop(st1)+=1呢?只需要采用引用返回就可以了。傳引用返回就是返回他的別名,也就是這里的2。也就a數(shù)組指向的top-1這里的對象。這時候就把引用對象給改變了。

typedef int STDataType;
typedef struct Stack
{
?? ?STDataType* a;
?? ?int top;
?? ?int capacity;
}ST;

void STInit(ST& rs, int n = 4)
{
?? ?rs.a = (STDataType*)malloc(n * sizeof(STDataType));
?? ?rs.top = 0;
?? ?rs.capacity = n;
}

// 棧頂
void STPush(ST& rs, STDataType x)
{
?? ?// 滿了, 擴(kuò)容
?? ?if (rs.top == rs.capacity)
?? ?{
?? ??? ?printf("擴(kuò)容\n");
?? ??? ?int newcapacity = rs.capacity == 0 ? 4 : rs.capacity * 2;
?? ??? ?STDataType* tmp = (STDataType*)realloc(rs.a, newcapacity *
?? ??? ??? ?sizeof(STDataType));
?? ??? ?if (tmp == NULL)
?? ??? ?{
?? ??? ??? ?perror("realloc fail");
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?rs.a = tmp;
?? ??? ?rs.capacity = newcapacity;
?? ?}
?? ?rs.a[rs.top] = x;
?? ?rs.top++;
}
int& STTop(ST& rs)
{
?? ?assert(rs.top > 0);

?? ?return rs.a[rs.top - 1];
}
int main()
{
?? ?ST st1;
?? ?STInit(st1);
?? ?STPush(st1, 1);
?? ?STPush(st1, 2);
?? ?cout << STTop(st1) << endl;
?? ?//修改棧頂?shù)臄?shù)據(jù)呢
?? ?(STTop(st1)) += 1;
?? ?cout << STTop(st1) << endl;
?? ?return 0;
}

?其實指針也可以做到:

并不是任何場景都能用引用返回(后面結(jié)合類和對象講),比如說:

ret是局部變量,這里類似于野引用。

int* fun( )

{

? ? ?int ret = 10;

? ? ?return *ret;

}

這里的指針就越界了,指針越界不一定報錯。?

?

在vs中設(shè)置了抽查位置,這兩個位置不分配給別人,給兩個固定的值,在程序運(yùn)行結(jié)束時看這兩個位置的值有沒有發(fā)生改變,沒有被修改就說明沒有越界。?

6.4?const引用

? 可以引用一個 const 對象,但是必須用 const 引用。const 引用也可以引用普通對象,因為對象的訪問權(quán)限在引用過程中可以縮小,但是不能放大。(const對象只能用const引用,普通對象可以用const引用,也可以普通引用。引用、指針存在權(quán)限的放大和縮小。)

?這里是把x的這塊空間拷貝給給y,x不能修改這塊空間。

下面這個也是經(jīng)典的權(quán)限放大:

下圖這個是權(quán)限的縮小:?

p1對于a的權(quán)限是只讀不能寫的,p1拷貝給給p2,p2又變成可讀可寫的了,p2的權(quán)限被放大,p5指向b的權(quán)限是可讀可寫的,p6指向p5也是可讀可寫的(這里不存在權(quán)限放大,因為const修飾的是p5本身不是指向的內(nèi)容)。?

? 需要注意的是類似 int&? rb = a*3; double? d = 12.34; int&? rd = d; 這樣?些場景下 a*3的和結(jié)果保存在一個臨時對象中, int&? rd = d 也是類似,在類型轉(zhuǎn)換中會產(chǎn)生臨時對象存儲中間值,也就是時,rb和rd引用的都是臨時對象,而C++規(guī)定臨時對象具有常性(所謂常性就像是被const修飾了一樣),所以這里就觸發(fā)了權(quán)限放大,必須要用常引用才可以。
? 所謂臨時對象就是編譯器需要一個空間暫存表達(dá)式的求值結(jié)果時臨時創(chuàng)建的?個未命名的對象,
C++中把這個未命名對象叫做臨時對象。

a * 3這里存在一個臨時變量,臨時變量具有常性,這里加個const就行了。

這里的d給給rd其實也不是直接給過去的,中間也會產(chǎn)生一個臨時變量來存儲中間的結(jié)果。d給給中間的臨時對象,這個臨時對象是int類型,臨時對象再給給rd。

類型轉(zhuǎn)換會產(chǎn)生臨時對象,d給了臨時對象,這里的臨時對象給給rd。也就是說rd引用了臨時對象。

那上面這些到底有什么用呢?

這里的傳值傳參就不說了,對于引用傳參

void fun(int& rx)如果變量 rx 不改變形參,建議前面加 const,void fun(const int& rx),加const的好處是什么呢?傳參就非常寬泛。

const引用的價值是什么?

1.可以引用const對象?

2.可以引用普通對象

3.可以引用臨時對象

6.5?指針和引用的關(guān)系

C++中指針和引用就像兩個性格迥異的親兄弟,指針是哥哥,引用是弟弟,在實踐中他們相輔相成,功能有重疊性,但是各有自己的特點,互相不可替代。(下面的結(jié)論面試官可能會問)
? 語法概念上引用是?個變量的取別名不開空間,指針是存儲?個變量地址,要開空間。
? 引用在定義時必須初始化,指針建議初始化,但是語法上不是必須的。
? 引用在初始化時引用一個對象后,就不能再引用其他對象;而指針可以在不斷地改變指向?qū)ο蟆?
? 引用可以直接訪問指向?qū)ο?#xff0c;指針需要解引用才是訪問指向?qū)ο蟆?
? sizeof中含義不同,引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個數(shù)(32位平臺下占4個字節(jié),64位下是8byte)
? 指針很容易出現(xiàn)空指針和野指針的問題,引用很少出現(xiàn),引用使用起來相對更安全一些。

野引用的案例:?

從底層匯編的角度看,引用也是用指針實現(xiàn)的。?

?

7.?inline

? inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù)(通常放到返回值的前面),編譯時C++編譯器會在調(diào)用的地方展開內(nèi)聯(lián)函數(shù),這樣調(diào)用內(nèi)聯(lián)函數(shù)就不需要建立棧幀了,就可以提高效率。

inline在這里的作用就是沒有宏函數(shù)的坑,也不用建立棧幀,提效。
? inline對于編譯器而言只是?個建議,也就是說,加了inline編譯器也可以選擇在調(diào)用的地方不展
開,不同編譯器關(guān)于inline什么情況展開各不相同,因為C++標(biāo)準(zhǔn)沒有規(guī)定這個。inline適用于頻繁
調(diào)用的短小函數(shù),對于遞歸函數(shù),代碼相對多?些的函數(shù),加上inline也會被編譯器忽略。
? C語言實現(xiàn)宏函數(shù)也會在預(yù)處理時替換展開,但是宏函數(shù)實現(xiàn)很復(fù)雜很容易出錯的,且不方便調(diào)
試,C++設(shè)計了inline目的就是替代C的宏函數(shù)。
? vs編譯器 debug版本下面默認(rèn)是不展開inline的(release版本下默認(rèn)是展開inline的),這樣方便調(diào)試,debug版本想展開需要設(shè)置一下以下兩個地方。

可執(zhí)行程序是一個文件,它會以一個進(jìn)程的角度來進(jìn)行運(yùn)行(可執(zhí)行程序會生成一個進(jìn)程),進(jìn)程才會給它分配內(nèi)存,進(jìn)程會把可執(zhí)行程序的那個指令加載到內(nèi)存的里面。

10000*100是指10000行指令*100行Add的指令總和的指令,10000+100是指10000行指令+100行Add的指令總和的指令。內(nèi)聯(lián)展開會導(dǎo)致一個問題:代碼膨脹,代碼膨脹會導(dǎo)致可執(zhí)行程序變大,可執(zhí)行程序變大,加載到進(jìn)程也會變大,加載到內(nèi)存導(dǎo)致內(nèi)存變大。(可執(zhí)行程序就是安裝包)

? inline不建議聲明和定義分離到兩個文件,分離(分離會找這個鏈接的地址)會導(dǎo)致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址,鏈接時會出現(xiàn)報錯。鏈接就是聲明的函數(shù)要找它的地址,去其它文件找它的地址。
// F.h
# include <iostream>
using namespace std;
inline void f ( int i);
// F.cpp
# include "F.h"
void f ( int i)
{
cout << i << endl;
}
// text.cpp
# include "F.h"
int main ()

{

// 鏈接錯誤:?法解析的外部符號 "void __cdecl f(int)" (?f@@YAXH@Z)
f ( 10 );
return 0 ;
}
//那要怎么做呢?
把// F.cpp這個文件中的f(int i)給注釋掉
# include "F.h"
//void f ( int i)
//{
//cout << i << endl;
//}
在// F.h中定義
inline void f ( int i)
{
cout << i << endl;
}

?// 實現(xiàn)?個Add宏函數(shù)的常見問題

//#define Add(int a, int b) return a + b;
//#define Add(a, b) a + b;
//#define Add(a, b) (a + b)
// 正確的宏實現(xiàn)(宏本質(zhì)是一種替換)
//宏函數(shù)坑很多,但是由于替換機(jī)制,調(diào)用函數(shù)時不用建立函數(shù)棧幀,能做到提效的作用。
# define Add(a, b) ((a) + (b))
// 為什么不能加分號 ?
int main()
{
int ret = Add(1,2);//這里是將a替換成1,b替換成2;//int ret = Add(1,2);;
//在這種場景下不會有問題
cout? <<? Add(1,2)? <<? endl;
//如果加分號在這種情況下就會報錯,還有下面這種
if(Add(1,2))
{
//...
}
cout? <<? ret? <<? endl;
}
// 為什么要加外?的括號 ?
//有下面這種情況
int main()
{
int ret = Add(1,2);//這里是將a替換成1,b替換成2;//int ret = Add(1,2);;
cout? <<? Add(1,2)*3??<<? endl;
//cout? <<? (1)? +? (2) * 3? <<? endl;
}
// 為什么要加里面的括號 ?
int main()
{
int x =1,y = 2;
Add(x?&?y ,x | y);? // ->? (x & y + x | y)
}

8.?nullptr

(C++里面空指針都用NULL)NULL實際是?個宏,在傳統(tǒng)的C頭文件(stddef.h)中,可以看到如下代碼:
#ifndef NULL
????????#ifdef __cplusplus
????????????????#define NULL 0//C++
????????#else
????????????????#define NULL ((void *)0)//C語言
????????#endif
#endif
? C++中NULL可能被定義為字面常量0,或者C中被定義為無類型指針(void*)的常量。不論采取何種定義,在使用空值的指針時,都不可避免的會遇到?些麻煩,本想通過f(NULL)調(diào)用指針版本的
f(int*)函數(shù),但是由于NULL被定義成0,調(diào)用了f(int x),因此與程序的初衷相悖。f((void*)NULL);
調(diào)用會報錯。
下面的代碼我們普遍認(rèn)為f(0)調(diào)用f(int x),f(NULL)調(diào)用f(int *ptr),但實際調(diào)用的都是f(int x)。

? C++11中引入nullptr,nullptr是?個特殊的關(guān)鍵字,nullptr是?種特殊類型的字?量,它可以轉(zhuǎn)換 成任意其他類型的指針類型。使用nullptr定義空指針可以避免類型轉(zhuǎn)換的問題,因為nullptr只能被 隱式地轉(zhuǎn)換為指針類型,而不能被轉(zhuǎn)換為整數(shù)類型。

?

http://www.risenshineclean.com/news/65919.html

相關(guān)文章:

  • WordPress手機(jī)縮略圖過大優(yōu)化關(guān)鍵詞的公司
  • 電子 網(wǎng)站建設(shè)申請過程網(wǎng)站排名seo培訓(xùn)
  • 網(wǎng)頁設(shè)計怎么做網(wǎng)站西安網(wǎng)站建設(shè)方案優(yōu)化
  • 做網(wǎng)站大概要多搜索引擎競價排名
  • 對電子商務(wù)網(wǎng)站與建設(shè)的心得谷歌瀏覽器下載安裝2022最新版
  • 政府網(wǎng)站建設(shè)內(nèi)容保障機(jī)制建網(wǎng)站的軟件
  • 網(wǎng)站開發(fā)后怎么上線推廣app平臺
  • 外貿(mào)網(wǎng)站推廣軟件提高工作效率總結(jié)心得
  • 東莞網(wǎng)站建設(shè)圖表搜索引擎優(yōu)化的各種方法
  • 大氣的網(wǎng)站設(shè)計常見的系統(tǒng)優(yōu)化軟件
  • 做視頻網(wǎng)站新手教學(xué)近期國際新聞
  • 建設(shè)專業(yè)網(wǎng)站電話咨詢百度推廣效果
  • 深圳微商城網(wǎng)站制作聯(lián)系電話南寧百度推廣代理商
  • 網(wǎng)站總體規(guī)劃設(shè)計說明南京seo建站
  • 網(wǎng)站建設(shè)好的廣州seo推廣培訓(xùn)
  • 網(wǎng)站開發(fā) 定制 合同范本qq群推廣鏈接
  • 網(wǎng)站建設(shè)流程草圖企業(yè)網(wǎng)站開發(fā)制作
  • 虛擬服務(wù)器建網(wǎng)站2023最新15件重大新聞
  • 做網(wǎng)站的專業(yè)什么軟件可以推廣
  • 做古玩的網(wǎng)站google play 應(yīng)用商店
  • 網(wǎng)站不在首頁顯示出來企業(yè)官網(wǎng)定制設(shè)計
  • 大連住建局官網(wǎng)網(wǎng)站國內(nèi)手機(jī)怎么上google瀏覽器
  • 有效的網(wǎng)站建設(shè)網(wǎng)址大全實用網(wǎng)址
  • 公眾號小程序開發(fā)公司seo診斷分析工具
  • 東莞中堂網(wǎng)站建設(shè)百度助手app免費(fèi)下載
  • 順德網(wǎng)站建設(shè)策劃seo全網(wǎng)營銷的方式
  • 網(wǎng)站建設(shè)咋做企業(yè)網(wǎng)站建設(shè)服務(wù)
  • 網(wǎng)站設(shè)計模板素材競價服務(wù)托管價格
  • 直播網(wǎng)站怎么建設(shè)長春網(wǎng)站制作計劃
  • 如何鑒賞網(wǎng)站論文做外貿(mào)推廣