Sonek İfadeleri
Sonek ifadeleri, birincil ifadelerden veya içindeki son ek işleçlerinin bir birincil ifadeyi izlediği ifadelerden oluşur. Sonek işleçleri aşağıdaki tabloda listelenmiştir.
Sonek İşleçleri
İşleç Adı | İşleç Gösterimi |
---|---|
Alt simge işleci | [ ] |
İşlev çağrısı işleci | ( ) |
Açık tür dönüştürme işleci | type-name ( ) |
Üye erişim işleci | . veya -> |
Sonek artış işleci | ++ |
Sonek azaltma işleci | -- |
Aşağıdaki sözdizimi olası sonek ifadeleri açıklar:
primary-expression
postfix-expression[expression]postfix-expression(expression-list)simple-type-name(expression-list)postfix-expression.namepostfix-expression->namepostfix-expression++postfix-expression--cast-keyword < typename > (expression )typeid ( typename )
Yukarıdaki sonek-ifade birincil bir ifade veya başka bir sonek ifadesi olabilir. Soldan sağa sonek ifade grubu, bu şekilde ifadelerin aşağıdaki gibi zincirleme yapılmasına olanak verir:
func(1)->GetValue()++
Yukarıdaki ifadede birincil ifadedir, func
func(1)
bir işlev sonek ifadesidir, func(1)->GetValue
sınıfın bir üyesini belirten bir sonek ifadesidir, func(1)->GetValue()
başka bir işlev sonek ifadesidir ve ifadenin tamamı GetValue dönüş değerini artıran bir sonek ifadesidir. İfadenin bir bütün olarak anlamı, "call" işlevinin bağımsız değişken olarak 1 geçirmesi ve dönüş değeri olarak sınıfa yönelik bir işaretçi almaktır. Ardından bu sınıfta çağrısı GetValue()
yapın, ardından döndürülen değeri artırın.
Yukarıda listelenen ifadeler atama ifadeleridir, yani bu ifadelerin sonucu bir r-değeri olmalıdır.
Sonek ifade formu
simple-type-name ( expression-list )
oluşturucunun çağrılacağını belirtir. Basit tür adı bir temel tür ise, ifade listesi tek bir ifade olmalıdır ve bu ifade, ifadenin değerinin temel türe atanacağını belirtir. Bu tür bir atama ifadesi bir oluşturucuyu taklit eder. Bu form temel türlerin ve sınıfların aynı sözdizimini kullanılarak oluşturulmasına izin verdiğinden, bu form özellikle şablon sınıfları tanımlarken yararlıdır.
cast-keyword, static_cast
veya reinterpret_cast
şeklindedirdynamic_cast
. daha fazla bilgi , static_cast
ve reinterpet_cast
içinde dynamic_cast
bulunabilir.
işleci typeid
bir sonek ifadesi olarak kabul edilir. Bkz. typeid işleci.
Resmi ve gerçek bağımsız değişkenler
Çağıran programlar, "gerçek bağımsız değişkenler" içindeki çağrılan işlevlere bilgi geçirir. Çağrılan işlevler, ilgili "resmi bağımsız değişkenler" kullanılarak bilgilere erişir.
Bir işlev çağrıldığında, aşağıdaki görevler yerine getirilir:
Tüm gerçek bağımsız değişkenler (arayan tarafından sağlananlar) değerlendirilir. Bu bağımsız değişkenlerin değerlendirilmesine ilişkin herhangi bir sıralama yoktur, ancak işleve girmeden önce tüm bağımsız değişkenler değerlendirilir ve tüm yan etkiler tamamlanır.
Her biçimsel bağımsız değişken, ifade listesi içinde karşılık gelen gerçek bağımsız değişkeniyle başlatılır. (Resmi bağımsız değişken, işlev üst bilgisinde bildirilen ve işlevin gövdesinde kullanılan bir bağımsız değişkendir.) Dönüştürmeler başlatılarak yapılır; gerçek bağımsız değişken doğru türe dönüştürülürken hem standart hem de kullanıcı tanımlı dönüştürmeler gerçekleştirilir. Gerçekleştirilen başlatma aşağıdaki kodda kavramsal olarak gösterilmiştir:
void Func( int i ); // Function prototype ... Func( 7 ); // Execute function call
Çağrıdan önceki kavramsal başlatmalar şunlardır:
int Temp_i = 7; Func( Temp_i );
Başlatmanın, parantez sözdizimi yerine eşittir işareti sözdizimi kullanılıyormuş gibi yapıldığına dikkat edin. Değeri işleve geçirmeden önce
i
öğesinin bir kopyası oluşturulur. (Daha fazla bilgi için bkz. Başlatıcılar ve Dönüştürmeler).Bu nedenle, işlev prototipi (bildirim) türünde
long
bir bağımsız değişken çağırırsa ve çağıran program türündeint
gerçek bir bağımsız değişken sağlarsa, gerçek bağımsız değişken türülong
standart tür dönüştürmesi kullanılarak yükseltilir (bkz . Standart Dönüştürmeler).Kendisi için biçimsel bağımsız değişkenin türüne yönelik standart veya kullanıcı tanımlı bir dönüştürme bulunmayan bir gerçek bağımsız değişken sağlamak hatadır.
Sınıf türünde gerçek bağımsız değişkenler için, biçimsel bağımsız değişken, sınıfın oluşturucusu çağrılarak başlatılır. (Bkz. Bu özel sınıf üyesi işlevleri hakkında daha fazla bilgi için oluşturucular .)
İşlev çağrısı yürütülür.
Aşağıdaki program parçası, bir işlev çağrısı göstermektedir:
// 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'dan çağrıldığında func
, resmi parametre param1
değeriyle i
başlatılır (i
standart dönüştürme kullanılarak doğru türe long
karşılık gelen türe dönüştürülür) ve resmi parametre param2
değeriyle j
başlatılır (j
standart dönüştürme kullanılarak türe double
dönüştürülür).
Bağımsız değişken türlerinin işlenmesi
Tür olarak const
bildirilen resmi bağımsız değişkenler işlevin gövdesi içinde değiştirilemez. İşlevler türünde const
olmayan bağımsız değişkenleri değiştirebilir. Ancak, değişiklik işlevinde yereldir ve gerçek bağımsız değişken türünde const
olmayan bir nesneye başvuru olmadığı sürece gerçek bağımsız değişkenin değerini etkilemez.
Aşağıdaki işlevler bu kavramlardan bazılarını gösterir:
// 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;
}
Üç nokta ve varsayılan bağımsız değişkenler
İşlevler, iki yöntemden biri kullanılarak işlev tanımında belirtilenden daha az bağımsız değişken kabul etmek üzere bildirilebilir: üç nokta (...
) veya varsayılan bağımsız değişkenler.
Üç nokta, bağımsız değişkenlerin gerekli olabileceğini ancak sayı ve türlerin bildirimde belirtilmediğini belirtir. C++: tür güvenliği avantajlarından birini yendiğinden bu normalde kötü bir C++ programlama uygulamasıdır. Üç nokta ile bildirilen işlevlere, resmi ve gerçek bağımsız değişken türlerinin bilindiği işlevlerden farklı dönüştürmeler uygulanır:
Gerçek bağımsız değişken türündeyse
float
, işlev çağrısından önce yazacakdouble
şekilde yükseltilir.Herhangi bir
signed char
veyaunsigned char
,signed short
ya daunsigned short
, numaralandırılmış türü veya bit alanı, tam sayı yükseltme kullanılarak ya da birunsigned int
signed int
değerine dönüştürülür.Sınıf türündeki herhangi bir bağımsız değişken değere veri yapısı olarak geçirilir; kopya, sınıfın kopya oluşturucusunun çağrılarak (varsa) yerine ikili kopyalama tarafından oluşturulur.
Üç nokta kullanılırsa, bağımsız değişken listesinde en son bildirilmelidir. Değişken sayıda bağımsız değişken geçirme hakkında daha fazla bilgi için Çalışma Zamanı Kitaplığı Başvurusu'ndaki va_arg, va_start ve va_list tartışmalarına bakın.
CLR programlamadaki varsayılan bağımsız değişkenler hakkında bilgi için bkz . Değişken Bağımsız Değişken Listeleri (...) (C++/CLI).
Varsayılan bağımsız değişkenler, işlev çağrısında sağlanmadıysa bağımsız değişkenin varsayması gereken değeri belirtmenizi sağlar. Aşağıdaki kod parçası, varsayılan bağımsız değişkenlerin nasıl çalıştığını gösterir. Varsayılan bağımsız değişkenleri belirtme kısıtlamaları hakkında daha fazla bilgi için bkz . Varsayılan Bağımsız Değişkenler.
// expre_Ellipsis_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;
}
Yukarıdaki program, print
iki bağımsız değişken alan bir işlev bildirir. Ancak, ikinci bağımsız değişken olan sonlandırıcının varsayılan değeri vardır: "\n"
. içinde main
, varsayılan ikinci bağımsız değişkenin yazdırılan dizeyi sonlandırmak için print
yeni bir satır sağlamasına izin vermek için ilk iki çağrı. Üçüncü çağrı, ikinci bağımsız değişken için açık bir değer belirtir. Programın çıktısı şu şekildedir:
hello,
world!
good morning, sunshine.