詳解C++編程中的主表達式與後綴表達式編寫基本。本站提示廣大學習愛好者:(詳解C++編程中的主表達式與後綴表達式編寫基本)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中的主表達式與後綴表達式編寫基本正文
主表達式
主表達式是更龐雜的表達式的結構塊。它們是文本、稱號和規模解析運算符 (::) 限制的稱號。主表達式可以具有以下任一情勢:
literal this :: name name ( expression )
literal 是常量主表達式。其類型取決於其標准的情勢。
this 症結字是指向類對象的指針。它在非靜態成員函數中可用,並指向為其挪用函數的類的實例。 this 症結字只能在類成員函數體的內部應用。
this 指針的類型是未特殊修正 this 指針的函數中的 type *const(個中 type 是類名)。以下示例演示成員函數聲明和 this 的類型:
// expre_Primary_Expressions.cpp // compile with: /LD class Example { public: void Func(); // * const this void Func() const; // const * const this void Func() volatile; // volatile * const this };
規模解析運算符 (::) 後跟稱號組成了主表達式。此類稱號必需是全局規模內的稱號,而不是成員稱號。此表達式的類型由稱號的聲明決議。假如聲明的稱號是左值,則該類型是左值(即,它可以湧現在賦值運算符表達式的左邊)。規模解析運算符許可援用全局稱號,即便該稱號隱蔽在以後規模中也如斯。
用括號括起的表達式是與不帶括號的表達式具有雷同的類型和值的主表達式。假如不帶括號的表達式是左值,則用括號括起的表達式也是左值。
在下面給出的主表達式語法的高低文中,name 表現為 name 描寫的語法中的任何內容,不外,當在稱號前應用規模解析運算符時,不許可應用只能在類中湧現的稱號的類型。這包含用戶界說的轉換函數稱號和析構函數稱號。
主表達式的示例包含:
100 // literal 'c' // literal this // in a member function, a pointer to the class instance ::func // a global function ::operator + // a global operator function ::A::B // a global qualified name ( i + 1 ) // a parenthesized expression
上面的示例是一切斟酌的 name 和各類情勢的主表達式:
MyClass // a identifier MyClass::f // a qualified name operator = // an operator function name operator char* // a conversion operator function name ~MyClass // a destructor name A::B // a qualified name A<int> // a template id
後綴表達式
後綴表達式包括主表達式或許個中的後綴運算符跟在主表達式以後的表達式。 下表列出了後綴運算符。
後綴運算符
運算符稱號
運算符表現法
下標運算符
[ ]
函數挪用運算符
( )
顯式類型轉換運算符
type-name ( )
成員拜訪運算符
. 或 –>
後綴遞增運算符
++
後綴遞加運算符
––
以下語法描寫了能夠的後綴表達式:
primary-expression postfix-expression [ expression ] postfix-expression ( expression-list) simple-type-name ( expression-list) postfix-expression . name postfix-expression –> name postfix-expression ++ postfix-expression –– cast-keyword < typename > (expression ) typeid ( typename )
下面的 postfix-expression 能夠是主表達式或另外一個後綴表達式。 請參閱主表達式。 後綴表達式從左到右停止分組,這許可表達式按以下方法鏈接起來:
func(1)->GetValue()++
在下面的表達式中,func 是主表達式,func(1) 是函數後綴表達式,func(1)->GetData 是指定類成員的後綴表達式,func(1)->GetData() 是另外一個函數後綴表達式,全部表達式是增長 GetData 的前往值的後綴表達式。 該表達式的全體寄義是作為參數傳遞 1 的 "call func,並作為前往值獲得一個指向類的指針。 然後挪用此類上的 GetValue(),接著遞增前往的值。
下面列出的表達式是賦值表達式,這意味著這些表達式的成果必需為右值。
後綴表達式情勢
simple-type-name ( expression-list )
指導結構函數的挪用。 假如 simple-type-name 是根本類型,則表達式列表必需是單個表達式,而且該表達式指導表達式的值將轉換為基本類型。 此類強迫轉換表達式模擬結構函數。 因為此情勢許可應用雷同的語法來結構根本類型和類,是以它在界說模板類時特殊有效。
cast-keyword 是 dynamic_cast、static_cast 或 reinterpret_cast 之一。 可在 dynamic_cast、static_cast 和 reinterpet_cast 中找到更多信息。
typeid 運算符被視為後綴表達式。 請參閱 typeid 運算符。
形參和實參
挪用法式會將信息傳遞到“實參”中的已挪用函數。 已挪用函數應用對應的“形參”拜訪信息。
當挪用函數時,將履行以下義務:
盤算一切實參(挪用方供給的參數)。 沒有盤算這些參數的隱含次序,但一切參數都邑盤算,而且一切反作用都邑在進入該函數前完成。
應用每一個形參在表達式列表中對應的實參來初始化該形參。 (形參是在函數頭中聲明並在函數體中應用的參數。) 轉換就像是經由過程初始化完成的一樣 - 尺度的和用戶界說的轉換在將實參轉換為准確的類型時履行。 以下代碼從概念演出示了所履行的初始化:
void Func( int i ); // Function prototype ... Func( 7 ); // Execute function call
挪用前的概念性初始化為:
int Temp_i = 7; Func( Temp_i );
請留意,初始化就像應用等號語法(而不是括號語法)一樣履行。 在將值傳遞到函數之前制造了 i 的正本。
是以,假如函數原型(聲明)對 long 類型的參數停止挪用,而且挪用法式供給了 int 類型的實參,則會應用到 long 類型的尺度類型轉換晉升該實參。
假如供給了一個實參,但它沒有到形參的類型的尺度的或用戶界說的轉換,則是一個毛病。
關於類類型的實參,將經由過程挪用類的結構函數初始化形參。
履行函數挪用。
以下法式片斷演示了函數挪用:
// expre_Formal_and_Actual_Arguments.cpp void func( long param1, double param2 ); int main() { long i = 1; double j = 2; // Call func with actual arguments i and j. func( i, j ); } // Define func with formal parameters param1 and param2. void func( long param1, double param2 ) { }
當從 main 挪用 func 時,將應用 param1(i 將轉換為類型 ilong 以對應應用尺度轉換的准確類型)的值初始化形參 ,並應用 param2(j 將轉換為應用尺度轉換的類型 jdouble)的值初始化形參 。
參數類型的處置
不克不及在函數主題內更改聲明為 const 類型的形參。 函數可以更改類型不是 const 的任何參數。 然則,更改關於函數而言是當地停止的,且不會影響實參的值,除非實參是對非 const 類型的對象的援用。
以下函數闡釋了個中的一些概念:
// expre_Treatment_of_Argument_Types.cpp int func1( const int i, int j, char *c ) { i = 7; // C3892 i is const. j = i; // value of j is lost at return *c = 'a' + j; // changes value of c in calling function return i; } double& func2( double& d, const char *c ) { d = 14.387; // changes value of d in calling function. *c = 'a'; // C3892 c is a pointer to a const object. return d; }
省略號和默許參數
經由過程應用以下兩種辦法之一,可以聲明函數以接收比函數界說中指定的參數更少的參數:省略號 (...) 或默許參數。
省略號表現能夠須要參數,但聲明中未指定命目和類型。 這平日是較差的 C++ 編程做法,由於它使您沒法取得 C++ 的一個長處,即類型平安。 分歧的轉換將運用於應用省略號聲明的函數,而不是運用於那些已知其形參和實參類型的函數:
假如實參的類型為浮點,則在函數挪用前將其晉升為雙精度類型。
應用整型晉升將一切有符號或無符號的 char、short、列舉類型或位域轉換為有符號或無符號的 int。
類類型的一切參數都作為數據構造經由過程值停止傳遞;正本是由二進制復制創立的,而不是經由過程挪用類的復制結構函數(假如存在)創立的。
假如應用省略號,則必需在參數列表中最初聲明它。
假如函數挪用中沒有供給值,則可經由過程默許參數指定參數應采取的值。 以下代碼片斷演示默許參數的任務方法。
// expre_Ellipses_and_Default_Arguments.cpp // compile with: /EHsc #include <iostream> // Declare the function print that prints a string, // then a terminator. void print( const char *string, const char *terminator = "\n" ); int main() { print( "hello," ); print( "world!" ); print( "good morning", ", " ); print( "sunshine." ); } using namespace std; // Define print. void print( const char *string, const char *terminator ) { if( string != NULL ) cout << string; if( terminator != NULL ) cout << terminator; }
下面的法式聲明一個采取兩個參數的函數 print。 而第二個參數 terminator 具有默許值 "\n"。 在 main 中,對 print 的前兩個挪用許可默許的第二個參數供給新行以終止打印的字符串。 第三個挪用為第二個參數指定顯式值。 該法式的輸入為
hello, world! good morning, sunshine.