1. 程式人生 > >C++常量詳解(一)常量指標與常量引用的初始化

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:ospfrip的區別

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的演算法題,所以自己就刷了一遍,並且做些筆記,以後再來複習好了,悲催的