Referanslar fonksiyon parametresi olarak kullanılabilirler. Madem ki bir referans aynı türden bir nesneyle ilk değer verilerek tanımlanmak zorundadır, o halde parametresi referans olan fonksiyonlar aynı türden bir nesnenin kendisiyle çağırılmak zorundadır.
/* fonksiyon parametresi olan referans örneği */
#include
#if 1 /* parametresi referans */
**** fonk(int &a)
{
a = 20;
}
**** main(****)
{
int x = 10;
fonk(x);
printf("%d\n", x);
}
#endif
#if 0 /* gösterici karşılığı */
**** fonk(int *a)
{
*a = 20;
}
**** main(****)
{
int x = 10;
fonk(&x);
printf("%d\n", x);
}
#endif
/*------------------------------------------------------------*/
Bir C programında fonk(a) gibi bir çağırma işlemiyle a değiştirilemez. Oysa C++ta böyle bir çağırma fonksiyonun parametre değişkeni bir referans ise a paametresini değiştirebilir. Klasik bir C bakış açısıyla parametre olan anın değiştirilmeyeceği sanılabilir. Okunabilirliği kuvvetlendirmek için eğer parametreyi değiştirecek bir fonksiyon tasarlanacaksa bunun için referans değil gösterici kullanılmalıdır. Fonksiyonun parametre değişkeni referans ise derleyici tarafından otomatik olarak yapılan bir adres aktarımı söz konusudur.
Referans uygulaması
int a = 10;
int &r1 = a;
int &r2 = r1;
r2 = 20;
printf(%d\n, r1);
Gösterici eşdeğeri
int a = 10;
int *r1 = &a;
int r2 = &r1;
*r2 = 20;
printf(%d\n, *r1);
/*-----referans.cpp-----*/
#include
#if 1 /* referans örneği */
**** main(****)
{
int a = 10;
int &a1 = a;
int &a2 = a1;
a2 = 20;
printf("%d\n", a1);
}
#endif
#if 0 /*gösterici eşdeğeri */
**** main(****)
{
int a = 10;
int *a1 = &a;
int *a2 = a1;
*a2 = 20;
printf("%d\n", *a1);
}
#endif
/*-------------------------*/
/*-----referan1.cpp-----*/
#include
**** main(****)
{
int a = 10;
int &b = a;
printf("%p %p\n", &a, &b);
}
/*--------------------------*/
Bir referans & operatörüyle adres alma işlemine sokulabilir. Bu durumda elde edilen değer referans içerisinde bulunan adreste bulunan nesnenin adresidir. Bu da referans içerisindeki adresle aynı olmak zorundadır. Bir referansın da bir adresi vardır. Ama o adres değeri geçerli bir ifdade ile elde edilemez. r bir referans olmak üzere & &r; ifadesi geçerli değildir. Çünkü bu ifadenin eşdeğer gösterici karşılığı & &*p;dir ve &*p bir nesne değildir.
/* fonksiyon parametresi olan referans örneği */
#include
#if 1 /* parametresi referans */
**** fonk(int &a)
{
a = 20;
}
**** main(****)
{
int x = 10;
fonk(x);
printf("%d\n", x);
}
#endif
#if 0 /* gösterici karşılığı */
**** fonk(int *a)
{
*a = 20;
}
**** main(****)
{
int x = 10;
fonk(&x);
printf("%d\n", x);
}
#endif
/*------------------------------------------------------------*/
Bir C programında fonk(a) gibi bir çağırma işlemiyle a değiştirilemez. Oysa C++ta böyle bir çağırma fonksiyonun parametre değişkeni bir referans ise a paametresini değiştirebilir. Klasik bir C bakış açısıyla parametre olan anın değiştirilmeyeceği sanılabilir. Okunabilirliği kuvvetlendirmek için eğer parametreyi değiştirecek bir fonksiyon tasarlanacaksa bunun için referans değil gösterici kullanılmalıdır. Fonksiyonun parametre değişkeni referans ise derleyici tarafından otomatik olarak yapılan bir adres aktarımı söz konusudur.
Referans uygulaması
int a = 10;
int &r1 = a;
int &r2 = r1;
r2 = 20;
printf(%d\n, r1);
Gösterici eşdeğeri
int a = 10;
int *r1 = &a;
int r2 = &r1;
*r2 = 20;
printf(%d\n, *r1);
/*-----referans.cpp-----*/
#include
#if 1 /* referans örneği */
**** main(****)
{
int a = 10;
int &a1 = a;
int &a2 = a1;
a2 = 20;
printf("%d\n", a1);
}
#endif
#if 0 /*gösterici eşdeğeri */
**** main(****)
{
int a = 10;
int *a1 = &a;
int *a2 = a1;
*a2 = 20;
printf("%d\n", *a1);
}
#endif
/*-------------------------*/
/*-----referan1.cpp-----*/
#include
**** main(****)
{
int a = 10;
int &b = a;
printf("%p %p\n", &a, &b);
}
/*--------------------------*/
Bir referans & operatörüyle adres alma işlemine sokulabilir. Bu durumda elde edilen değer referans içerisinde bulunan adreste bulunan nesnenin adresidir. Bu da referans içerisindeki adresle aynı olmak zorundadır. Bir referansın da bir adresi vardır. Ama o adres değeri geçerli bir ifdade ile elde edilemez. r bir referans olmak üzere & &r; ifadesi geçerli değildir. Çünkü bu ifadenin eşdeğer gösterici karşılığı & &*p;dir ve &*p bir nesne değildir.