1. 程式人生 > >C++筆記 第十二課 經典問題解析一---狄泰學院

C++筆記 第十二課 經典問題解析一---狄泰學院

#1024程式設計師節#

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第十二課 經典問題解析一

1.關於const的疑問

const什麼時候是隻讀變數?什麼時候是常量?
const常量的判斷準則
只有用字面量初始化的const常量才會進入符號表—真正意義上的常量
使用其他變數初始化的const常量仍然是隻讀變數—只讀變數
volatile修飾的const常量不會進入符號表(外部:多執行緒、中斷)—只讀變數
在編譯期間不能直接確認初始值的const識別符號,都被作為只讀變數處理。
const引用的型別與初始化變數的型別
相同:初始化變數稱為只讀變數


不同:生成一個新的只讀變數

12-1 const典型問題分析

#include <stdio.h>
int main()
{
    const int x = 1;//constant  Symbol table
    const int& rx = x;//rx represent read only variable
    
    int& nrx = const_cast<int&>(rx);//去除變數只讀屬性
    
    nrx = 5;
    
    printf("x = %d\n", x);
    printf("rx = %d\n", rx);
    printf("nrx = %d\n", nrx);
    printf("&x = %p\n", &x);
    printf("&rx = %p\n", &rx);
    printf("&nrx = %p\n", &nrx);
    
    volatile const int y = 2;
    int* p = const_cast<int*>(&y);
    
    *p = 6;
    
    printf("y = %d\n", y);
    printf("p = %p\n", p);
    
    const int z = y;
    
    p = const_cast<int*>(&z);  //通過指標P指向z的空間
    
    *p = 7;  //通過p改變z空間的值
    
    printf("z = %d\n", z);
    printf("p = %p\n", p);
    
//用不同型別變數來初始化const識別符號C
    char c = 'c';  //字元
    char& rc = c;  //char型別的引用
    const int& trc = c;  //定義const引用
    
    rc = 'a';
    
    printf("c = %c\n", c);
    printf("rc = %c\n", rc);
    printf("trc = %c\n", trc);//引用型別為int,初始化變數型別為char,兩者不同,則生成一個新的只讀變數trc,rc = 'a';語句改變了變數c和rc的值,無法改變trc變數的值,則輸出原始結果
    return 0;
}
執行結果
x = 1
rx = 5
nrx = 5
&x = 0x7ffe49326340
&rx = 0x7ffe49326340
&nrx = 0x7ffe49326340
y = 6
p = 0x7ffe49326344
z = 7
p = 0x7ffe49326348
c = a
rc = a
trc = c

2.關於引用的疑問

引用指標有什麼關係?如何理解“引用的本質就是指標常量”?
指標是一個變數
值為一個記憶體地址,不需要初始化,可以保持不同的地址
通過指標可以訪問對應記憶體地址中的值
指標可以被const修飾成常量或者只讀變數
引用只是一個變數的新名字
對引用的操作(賦值,取地址等)都會傳遞到代表的變數上
const引用使其代表的變數具有隻讀屬性
引用必須在定義時初始化,之後無法代表其它變數(不能複用)
從使用C++語言的角度來看
引用與指標沒有任何的關係
引用是變數的新名字,操作引用就是操作對應的變數
從C++編譯器的角度來看
為了支援新概念“引用”必須要一個有效的解決方案
在編譯器內部,使用指標常量來實現“引用”
因此“引用”在定義時必須初始化
在工程專案開發中


當進行C++程式設計時,直接站在使用的角度看待引用,與指標毫無關係,引用就是變數的別名
當對C++程式碼進行除錯分析時,一些特殊情況,可以考慮站在C++編譯器的角度看待引用
下面的程式碼有問題嗎?
在這裡插入圖片描述

12-2 引用典型問題分析—程式設計角度看

#include <stdio.h>
int a = 1;
struct SV
{
    int& x;
    int& y;
    int& z;
};
int main()
{
    int b = 2;
    int* pc = new int(3);
    SV sv = {a, b, *pc};
   	 int& array[] = {a, b, *pc}; // &array[1] - &array[0] = ?  Expected ==> 4
    //C++中不支援引用陣列
    printf("&sv.x = %p\n", &sv.x);
    printf("&sv.y = %p\n", &sv.y);
    printf("&sv.z = %p\n", &sv.z);
    
    delete pc;
    
    return 0;
}
執行結果
&sv.x = 0x601050
&sv.y = 0x7ffea5d06f74
&sv.z = 0x1cbdc20

小結
指標是一個變數
引用是一個變數的新名字
const引用能夠生成新的只讀變數
在編譯器內部使用指標常量實現“引用”
編譯時不能直接確定初始值的const識別符號都是隻讀變數