您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)C++中怎么聲明語(yǔ)法方法,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
一個(gè)聲明為每個(gè)聲明子都聲明一個(gè)實(shí)體(entity),同時(shí)為那個(gè)實(shí)體給出一個(gè)名字,并且隱含的給出存儲(chǔ)類,類型,和由說(shuō)明符給出的其它特性。說(shuō)明符和聲明子一起決定了名字是否是一個(gè)對(duì)象,數(shù)組,指針,引用或函數(shù)。例如,
聲明x為一個(gè)整型指針,f為一個(gè)函數(shù)返回一個(gè)整型。正是聲明子*x和f()使類型x和f產(chǎn)生區(qū)別。
int *x, f(); declarator: [ * [ const ] | & ]... direct-declarator direct-declarator: declarator-id | ( declarator ) | direct-declarator ( parameter-declaration-list ) | direct-declarator [ constant-expression ] A declarator-id is an identifier, possibly qualified: declarator-id: [ nested-name-specifier ] identifier nested-name-specifier: { class-or-namespace-name ::}...
如果聲明子是一個(gè)僅包含一個(gè)declarator-id的直接-聲明子,那么這說(shuō)明這個(gè)標(biāo)識(shí)符具有decl-specifiers隱含的屬性,而沒(méi)有進(jìn)一步的修飾。例如,在下面的C++聲明語(yǔ)法中
int n;
聲明子是n,這是一個(gè)只包含direct-declarator的declarator-id,因此根據(jù)含義,n的類型為整型。
如果聲明子為其它形式,那么你可以按照下面的方法確定標(biāo)識(shí)符的類型:首先,假設(shè)T為decl-specifiers隱含的類型,忽略friend或static等非類型屬性,同時(shí)假設(shè)D為聲明子。然后重復(fù)下面的步驟直到推導(dǎo)出D為一個(gè)declarator-id,此時(shí)T正是你所尋找的類型:
C++名字空間基本內(nèi)容講述
C++斷點(diǎn)無(wú)效解決方案
C++基本函數(shù)代碼示例
C++操作符重載不同方式區(qū)別
C++文件流應(yīng)用方法詳細(xì)介紹
1. 如果D形如(D1),那么用D1替換D。
2. 如果D形如* D1 或 * const D1,那么根據(jù)是否有const,用“指針,它指向T”或者“常量指針,它指向T”替換T,然后用D1替換D。
3. 如果D形如D1(參數(shù)-聲明-列表),那么用參數(shù)由參數(shù)-聲明-列表定義的、“返回T的函數(shù)”替換T,然后用D1替換D。
4. 如果D形如D1[常量-表達(dá)式],那么用元素個(gè)數(shù)由常量-表達(dá)式給出的“T數(shù)組”替換T,然后然后用D1替換D。
5. ***,如果聲明子形如&D,那么用“T引用”替換T,然后用D1替換D。
作為一個(gè)示例,考慮下面的C++聲明語(yǔ)法
int *f();
首先,T和D分別為int和*f(),因此D形如*D1,其中D1為f()。
你可能認(rèn)為D可以形如D1() 或者 *D1。然而,如果D形如D1(),那么D1將不得不為*f,D1將是一個(gè)direct-declarator(因?yàn)楸竟?jié)開始處的語(yǔ)法注1規(guī)定只有direct-declarator前面是())。但是如果我們看看direct-declarator的定義注2,很明顯它不能包含*。因此,D只能是*f(),它形如*D1,其中D為f()。
既然我們已經(jīng)確定D1為f(),那么我們知道必須用“指針,它指向T”替換T,即“指針,指向整型”,同時(shí)用f()替換D。
至此我們還沒(méi)有解析D為declarator-id,因此我們必須重復(fù)該過(guò)程。此時(shí),D1只能是f,因此我們用“返回T的函數(shù)”替換T,它是一個(gè)“返回整型指針不帶參數(shù)的函數(shù)”,然后用f替換D。
此時(shí),D為declarator-id,因此推導(dǎo)結(jié)束。我們已經(jīng)確定聲明
int *f();
聲明f的類型為“不帶參數(shù)返回整型指針的函數(shù)”。另一個(gè)例子,聲明
int* p, q;
具有兩個(gè)聲明子,*p和q。對(duì)于每個(gè)聲明子,T都是int。對(duì)于***個(gè)聲明子,D是*p,因此T變成“指針,它指向整型,”而D為p。聲明p類型為“指針,它指向整型”。
我們單獨(dú)分析第二個(gè)聲明子,T還是int,D是q。很明顯聲明q為整型。
***,讓我們分析§10.1.2/173中那個(gè)奇怪的例子:
double (*get_analysis_ptr())(const vector<Student_info>&);
分析C++聲明語(yǔ)法過(guò)程可以分為下面五個(gè)步驟
1. T: double D: (*get_analysis_ptr())(const vector<Student_info>&)
2. T: 返回double帶有 const vector<Student_info>& 參數(shù)的函數(shù) D: (*get_analysis_ptr())
3. T: function returning double... (如前所示) D: *get_analysis_ptr()
4. T: 指針,它指向一個(gè)返回double...的函數(shù) D: get_analysis_ptr()
5. T: 一個(gè)函數(shù),返回一個(gè)函數(shù)指針,它指向一個(gè)返回double...的函數(shù) D: get_analysis_ptr
get_analysis_ptr是一個(gè)函數(shù),它返回一個(gè)函數(shù)指針,它指向一個(gè)返回double,帶有const vector<Student_info>&參數(shù)的函數(shù)。我們將如何展開const vector<Student_info>&作為一個(gè)練習(xí)。幸運(yùn)的是,C++聲明語(yǔ)法如此令人迷惑;它們中的大多數(shù)看起來(lái)
declarator: declarator-id ( parameter-declaration-list )
以上就是C++中怎么聲明語(yǔ)法方法,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。