C++函數返回局部變量


1. 不可返回的局部變量

1.1 函數不能返回指向棧內存的指針

【示例】:

int * get()
{
    int a = 10; // 屬於局部變量,存儲在棧中,在函數結束后,內存被釋放,函數返回的指向a的內容也不確定
    return &a;
}
// 或
char *GetMemory(void)
 {
     char p[] = "hello world!"; // p是一個數組名,屬於局部變量
     return p;
 }

2 可返回的局部變量

2.1 返回局部變量本身

【示例】:

int sum(int a, int b)
{
    int s = a + b; // 
    return s;
}

2.2 常量

【常量】

char *GetMemory(void)
{
    char *p = "hello world!"; // 字符串常量,,不能p[1]=‘a’. 常量不能修改。hello world是const char *
    return p; //函數返回p存儲的地址
}

2.3 靜態局部變量

【示例】:

const char *GetMemory(void)
{
    static char p[] = "hello world!";
    return p;// 改為靜態變量,存儲在靜態存儲區,在程序結束后釋放
}

或者
int* returnValue()
{
    static int value[3]={1,2,3};
    return value;
}

2.4 堆內存中的局部變量

【示例】:

int *sum(int a, int b)
{
    int *s=new int();
    *s=a+b;
    return s;
}

2.5 返回值為值類型的函數

【示例】:

int func()
{
    return 1;
}
int i = func();
//有一個臨時對象來保存func()函數的返回值1,之后將臨時對象的值賦給i。
//編譯器將所有的臨時對象自動成為const。所以,對於返回值為值類型的函數,其返回值func()為右值。

2.6 返回值為引用類型的函數

當函數的返回值是引用類型時,其返回值即為返回的變量,不需要臨時對象保存其返回值。所以,對於返回值為引用類型的函數,其返回值為左值。
【示例】:

int &sum(int a, int b)
{
    int s = a+b;
    return s;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM