C++練習,引用本質,複雜資料型別示例等
#include <iostream>
using namespace std;
//第一點
/**
int main()
{
int a = 10;
int &b = a;
//b是a的別名,請問c++編譯器後面做了什麼工作
b = 11;
cout<<"b-->"<<a<<endl;
printf("a:%d\n",a);
printf("b:%d\n",b);
printf("&a:%d\n",&a);
printf("&a:%d\n",&b);
system("pause");
return 0;
//單獨定義的引用時,必須初始化,說明很像一個常量
//a和b均是同一個記憶體空間的門牌號
}
*/
//普通引用有自己的記憶體空間,且與指標所佔空間相同
struct Teacher
{
char name[64];//64
int age;//4
double &a;//很像指標所佔的記憶體空間大小 4,
int &b;
};
/**
void main()
{
printf("sizeof teacher:%d\n",sizeof(Teacher));
system("pause");
}
*/
/**
引用的本質
1、引用在C++中的內部實現,是一個常量指標
Type &name<-->Type *const name
2、C++編譯器在編譯過程中使用常量指標作為引用的內部實現,因此引用所佔用的空間大小與指標相同。
3、從使用的角度,引用會讓人誤會其只是一個別名,沒有自己的儲存空間。這是C++為了實用性而做出的
細節隱藏
**/
void modifyA3(int *p)
{
*p = 200;//*p 3
}
//間接賦值
/**
void main()
{
int a = 10;
int *p = NULL;//間接賦值成立的三個條件,1定義兩個變數
p = &a;
*p = 100;
{
*p = 200;
}
modifyA3(&a);//2,建立關聯
}
*/
/**
C++引用使用時的難點:
當函式返回值為引用時
若返回棧變數 不能成為其它引用的初始值 不能作為左值使用
若返回靜態變數或全域性變數
可以成為其他引用的初始值 既可以作為右值使用,也可作為左值使用
C++鏈式程式設計中,經常用到引用,運算子過載專題
*/
int getAA1()
{
int a;
a = 10;
return a;
}
//返回A的本身,返回a的一個副本
/**
int &getAA2()
{
int a;//如果是返回棧上的引用,有可能會有問題
a = 10;
return 0;//;
}
int *getAA3()
{
int a;
a = 10;
return &a;
}
*/
//若返回棧變數,不能成為其它引用的初始值
/**
void main()
{
int a1 = getAA1();
int a2 = getAA2();
// int &a3 = getAA2();
printf("a1:%d,a2:%d\n",a1,a2);
system("pause");
}
*/
//變數是static或者是全域性變數
int j1()
{
static int a = 10;
a ++;
return a;
}
int &j2()
{
static int a = 10;
a ++;
return a;
}
/**
void main()
{
int a1 = 10;
int a2 = 20;
a1 = j1();
a2 = j2();
int &a3 = j2();
printf("a1:%d,a2:%d,a3:%d\n",a1,a2,a3);
system("pause");
}
*/
//函式當左值
int g1()
{
static int a = 10;
a++;
return a;//返回變數的值
}
//返回變數本身,返回變數所標識的記憶體空間
int &g2()
{
static int a = 10;
a++;
return a;//返回變數本身
}
void main()
{
//g1() = 100;
g2() = 100;//函式返回值是一個引用並且當左值
g2();
printf("%d\n",g2());
system("pause");
}