1. 程式人生 > >C++練習,引用本質,複雜資料型別示例等

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");
}