C++常量詳解(一)常量指標與常量引用的初始化
1、常量
1.1、常量的初始化:
const物件一旦建立後其值就不能再改變,所以const物件必須初始化。這裡我們要注意一點,像const int *p和const int &r都並不是const物件。因為const int *p只是表示不能通過p改變p所指的物件的值,p的值是可以變的,所以p可以不用初始化。至於r ,引用本身就不是物件,所以r也並不是const物件,r之所以一定初始化,是因為引用必須初始化。對於以上內容,你也可以理解為底層const 修飾的並不是const物件,還要注意像const int *const p1這種,這是一定要初始化的,這是const物件,因為它有一個頂層const。
1.1.1分清了const物件後,讓我們先把目光聚集到const物件這裡。
const物件可以分為大致三類:
const int m
int *const p
const int *const q
而這前兩類都可以用來給非const物件或者const物件初始化,因為這前兩類都是頂層const,初始化時的拷貝是不會對他們的自身值做出什麼改變,即以下程式碼均正確。
//第一類
int m1=m;//正確
const int m2=m;//正確
//第二類
int *p1=p;//正確
int *const p2=p;//正確
const int *p3=p;//正確
const int *const p4=p;//正確
而第三類則需要我們注意一下,因為第三類還有一個底層const。
const int *const q
int *q1=q;//報錯
int *const q2=q;//報錯
const int *q3=q;//正確
const int *const q4=q;//正確
底層const有一個限制:當執行物件的拷貝操作時,拷入和拷出的物件必須具有相同的底層const。
我們可以這樣理解:const int *const q如果可以拷貝初始化給q1、q2,那麼意味著我們可以通過q1、q1來改變q所指的物件的值,那這樣q的底層const還有什麼意義呢?
以上,是說這三類可以給哪些物件初始化,現在我們看看哪些可以給這三類初始化
第一類const int m
//以下一些變數不初始化,我把重點落在型別。
int m1;
const int m2;
const int m=m1;//正確
const int m=m2;//正確
第二類int *const p
//以下一些變數不初始化,我把重點落在型別。
int *p1;
int *const p2;
const int *p3;
const int *const p4;
int *const p=p1;//正確
int *const p=p2;//正確
int *const p=p3;//錯誤
int *const p=p4;//錯誤
這裡的報錯同樣因為底層const有一個限制:當執行物件的拷貝操作時,拷入和拷出的物件必須具有相同的底層const
第三類 const int *const q
//以下一些變數不初始化,我把重點落在型別。
int *q1;
int *const q2;
const int *q3;
const int *const q4;
const int *const q=q1;//正確
const int *const q=q2;//正確
const int *const q=q3;//正確
const int *const q=q4;//正確
1.1.2 現在讓我們把目光轉回非const物件的初始化
這裡主要有兩類:
//以下一些變數不初始化,我把重點落在型別。
const int *p;
const int &r;
先考慮他們可以給哪些物件初始化
第一類 const int *p
//以下一些變數不初始化,我把重點落在型別。
int *p1=p;//報錯
int *const p2=p;//報錯
const int *p3=p;//正確
const int *const p4=p;//正確
此處同樣由於低層const的限制
第二類 const int &r
//以下一些變數不初始化,我把重點落在型別。
int &r1=r;//錯誤
const int &r2=r;//正確
這裡強調一下,引用不是物件,所以沒有像 int *const &r或者const int *const &r這種形式
好,再考慮哪些可以給他們初始化
第一類 const int *p
//以下一些變數不初始化,我把重點落在型別。
int *p1;
int *const p2;
const int *p3;
const int *const p4;
const int *p=p1;//正確
const int *p=p2;//正確
const int *p=p3;//正確
const int *p=p4;//正確
因為const int *p意義在於表明不可以通過p改變它所指的物件的值,這個物件可以不是常量,只是p所指的物件對於p來說是常量,所以它所指的物件是否const 其實並沒有關係。
第二類 const int &r
//以下一些變數不初始化,我把重點落在型別。
int &r1;
const int &r2;
const int &r=r1;//正確
const int &r=r2;//正確
這裡const同樣是指不能通過r改變它所引用的物件,所以它所引用的物件本身是不是const無關緊要。
縱觀以上的錯誤,都是試圖把底層const拷貝初始化給沒有底層const的物件。
以上就是關於涉及到常量的指標和引用的初始化的解釋了。
相關推薦
C++常量詳解(一)常量指標與常量引用的初始化
1、常量 1.1、常量的初始化: const物件一旦建立後其值就不能再改變,所以const物件必須初始化。這裡我們要注意一點,像const int *p和const int &r都並不是const物件。因為const int *p只是表示
C++ 模板詳解(一)
C++模板 模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。 模板是一種對型別進行引數化的工具; 通常有兩種形式:函式模板和類模板; 函式模板針對僅引
c++模板詳解(一)
轉載自http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、
C# LINQ詳解(一)
1 using System.Collections; 2 3 using System.Collections.Generic; 4 5 using System.Linq; 6 7 8 9 namespace Chapter_5 10 11 { 12 1
vue組件詳解(一)——組件與復用
pla ron 詳解 eth bsp strong sage html cti 一、什麽是組件 組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。 二、組件用法 組件需要註冊後才可以使用,註冊有全局註冊和局
UE4移動元件詳解(一)——移動框架與實現原理
前言 關於UE4的移動元件,我寫了一篇非常詳細的分析文件。由於篇幅比較大,我將其拆分成三個部分。分別從移動框架與實現原理,移動的網路同步,移動元件的優化與改造三個方面來寫。這三篇文件中難免有問題和漏洞,所以我也會在發現問題時及時更新和修改,也希望大家能給出一些
OSPF詳解(一):ospf與rip的區別
ospf-open shortest path first,開發最短路徑優先協議,是一種基於鏈路狀態的路由協議。ospf與rip存在的本質區別是:rip是基於距離向量演算法的路由協議,而ospf是基於鏈路狀態演算法的路由協議。 使用rip協議的網路容易產生路由自環而使用os
【小白學PyTorch】21 Keras的API詳解(上)卷積、啟用、初始化、正則
【新聞】:機器學習煉丹術的粉絲的人工智慧交流群已經建立,目前有目標檢測、醫學影象、時間序列等多個目標為技術學習的分群和水群嘮嗑答疑解惑的總群,歡迎大家加煉丹兄為好友,加入煉丹協會。微信:cyx645016617. 參考目錄: [TOC] 我們對Keras應該已經有了一個直觀、巨集觀的認識了。現在,我們來系
Python C AP的使用詳解(一)
nds 項目 namespace 以及 int float 數據大小 mem else 簡介 介紹一下Python虛擬機的初始化及退出,Python基本數據類型的對象創建以及C和Python之間的數據類型互相轉換。 Python虛擬機的初始化及退出 初始化Python虛擬機
C/C++陣列詳解(一維和二維)
陣列這東西,說說都懂,但是似乎並沒有完全吃透,導致很多地方有疑惑。所以再梳理一遍。 陣列定義 陣列是存放型別相同的物件的容器,這些物件本身沒有名字,需要通過其所在位置訪問。 從定義中可以看出,陣列存放的是物件且型別相同。所以不存在引用的物件(引用不是物件)
C++學習:list容器詳解(一)
list容器詳解 首先說說STL STL就是Standard Template Library,標準模板庫。這可能是一個歷史上最令人興奮的工具的最無聊
C程式設計|用函式實現模組化程式設計詳解(一)
目錄 一、為什麼要用函式 使用函式可使程式清晰、精煉、簡單、靈活。 函式就是功能。每一個函式用來實現一個特定的功能。函式名應反映其代表的功能。 在設計
C++之模板詳解(一)
C++模板 模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。 模板是一種對型別進行引數化的工具; 通常有兩種形式:函式模板和類模板; 函式模板針對僅引數型別不同的函式; 類模板針對僅資料成
C++之類模板詳解(一)
C++ 除了支援函式模板,還支援類模板(Class Template)。函式模板中定義的型別引數可以用在函式宣告和函式定義中,類模板中定義的型別引數可以用在類宣告和類實現中。類模板的目的同樣是將資料的型別引數化。 宣告類模板的語法為: template<typenam
嵌入式C語言實戰開發詳解(一)
一、概述 1、嵌入式開發中為什麼選擇C語言? 因為作業系統的核心都是使用的C語言,而且C語言也有如下幾個優點: (1)出色的移植性,能在多種不同體系結構的軟/硬平臺上執行(修改量越小,移植性越好);
c++迭代器詳解(一):back_inserter, front_inserter,inserter
1.stl迭代器之配接器( Iterator Adapters) 迭代器(Iterators)是一個純抽象的概念:任何東西,只要其行為類似迭代器,它就是一個迭代器.也就是說,只有具備有迭代器的四種基本操作:取值(*),遞增(++) 比較(== !=) 賦值(=)它就是迭代器
C++----字符集詳解(一看就懂系列)
寫的太好,不敢更改:https://blog.csdn.net/qq_28098067/article/details/53486032一、編碼歷史與區別 一直對字元的各種編碼方式懵懵懂懂,什麼ANSI UNICODE UTF-8 GB2312 GBK DBCS UCS……是不是看的很暈,假如您
C++標準模板庫 迭代器 iterator 詳解(一)
[cpp] view plaincopyprint? #include <vector> #include <iostream> #include <list> #include <
c++11多執行緒詳解(一)
原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/10914162.html 最近是恰好寫了一些c++11多執行緒有關的東西,就寫一下筆記留著以後自己忘記回來看吧,也不是專門寫給讀者看的,我就想到哪就寫到哪吧 &nbs
c++ LeetCode(陣列篇簡單級別)演算法例題程式碼詳解(一)
原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/10940636.html 唉!最近忙著面試找實習,然後都是面試的很多是leetcode的演算法題,所以自己就刷了一遍,並且做些筆記,以後再來複習好了,悲催的