Aracılığıyla paylaş


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_castiçinde dynamic_castbulunabilir.

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 longbir bağımsız değişken çağırırsa ve çağıran program türünde intgerç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 constolmayan 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 constolmayan 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 yazacak double şekilde yükseltilir.

  • Herhangi bir signed char veya unsigned char, signed short ya da unsigned short, numaralandırılmış türü veya bit alanı, tam sayı yükseltme kullanılarak ya da bir unsigned 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, printiki 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.

Ayrıca bkz.

İfade Türleri