1. 程式人生 > >C++常物件,常變數,常成員函式詳解(含新增內容)

C++常物件,常變數,常成員函式詳解(含新增內容)

 既要使資料能在一定範圍內共享,又要保證它不被任意修改,可使用const。

·        用const修飾的宣告資料成員稱為常資料成員

·        用const修飾的宣告成員函式稱為常成員函式

·        用const修飾的定義物件稱為常物件

變數或物件被const修飾後其值不能被更新。因此被const修飾的變數或物件必須要進行初始化。
(一)用const修飾的宣告資料成員稱為常資料成員

有兩種宣告形式:

const int  cctwl;
int const  cctwl;
不能省略資料型別,可以新增 public private等訪問控制符。 

說明:

1. 任何函式能對常資料成員賦值

2. 建構函式對常資料成員進行初始化時也只能通過初始化列表進行。(只有此一種方法)

3. 常資料成員在初始化時必須賦值或稱其必須初始化.

4. 如果類有多個預設建構函式必須都初始化常資料成員。//沒明白

通過下面例子來理解常資料成員以上4點。

這樣也可以給常資料成員num賦值啊,而且可以不同的物件賦不同的值。


A、請指出下面程式的錯誤

錯誤一:不能對常資料成員在類中初始化、要通過類的建構函式,只有靜態常量才能這樣初始化。
錯誤二:沒有合適的預設建構函式可用。因為有常量cctwl沒有初始化必須初始化所有常資料成員。

更正後結果如下:

B、多個建構函式下的常資料成員

請指出下面程式的錯誤:


錯誤一:每個建構函式都要初始化常資料成員,應改為

(親測,這樣是可以的)
(二)用const修飾的宣告宣告成員函式稱為常成員函式

宣告:<型別標誌符>函式名(引數表)const;

說明: 

1. const是函式型別的一部分,在實現部分也要帶該關鍵字。

2. const關鍵字可以用於對過載函式的區分。

3. 常成員函式不能更新任何資料成員,也不能呼叫該類中沒有用const修飾的成員函式,只能調常成員函式常資料成員

A、通過例子來理解const是函式型別的一部分,在實現部分也要帶該關鍵字。

但是我測試的下面的程式可以執行啊,下面的錯誤在哪?似乎正確的,可能作者改過來之後的)

B

、通過例子來理解const關鍵字的過載


C、通過例子來理解常成員函式不能更新任何資料成員

D、通過例子來理解

1、常成員函式可以被其他成員函式呼叫。
2
、但是不能呼叫其他非常成員函式。
3、可以呼叫其他常成員函式。

(三)用const修飾的定義物件稱為常物件

常物件是指物件的資料成員的值在物件被呼叫時不能被改變。常物件必須進行初始化,且不能被更新。不能通過常物件呼叫普通成員函式,但是可以通過普通物件呼叫常成員函式。常物件只能呼叫常成員函式

常物件的宣告如下: 

     const  <類名>  <物件名>

     <類名>  const  <物件名>

兩種宣告完全一樣沒有任何區別。

1、通過下面例子來理解常物件:

A、請指出下面程式的錯誤


PS:

·        常成員函式可以引用const資料成員,也可以引用非const的資料成員;

·        const資料成員可以被const成員函式引用,也可以被非const的成員函式引用;

·        常成員函式不能呼叫另一個非const成員函式。

記住定義為const後,其值不能改變即可。對於常物件、常成員函式,肯定也不能呼叫能改變其他值得函式。(自己新增)

既要使資料能在一定範圍內共享,又要保證它不被任意修改,這時可以使用const。對於const  int *pa,指的是不能通過改變*pa的值來改變pa指向的變數的值,但可以通過改變pa指向的變數的值來改變*pa的值。設定為常引用,還是可以改變實際的值。(但不可用*pab來改變a的值)

指向物件的常指標,其指向始終不變。

指向常變數的指標變數:const 型別名 *指標變數名;(把變數換成物件,即指向常物件的指標變數同下)

1、如果一個變數已被宣告為常變數,只能用指向常變數的指標變數指向它,而不能用一般的(指向非const型變數的)指標變數指向它。

2、指向常變數的指標變數除了可以指向常變數外,還可以指向未被宣告為const的變數。此時不能通過此指標變數改變該變數的值

3、如果函式的形參是指向非const型變數的指標,實參只能用指向非const變數的指標,而不能用指向const變數的指標

在C++面向物件程式設計中,經常用常指標和常引用作函式引數。這樣既能保證資料安全,使資料不能被隨意修改,在呼叫函式時又不必建立實參的拷貝。用常指標和常引用作函式引數,可以提高程式執行效率。



相關推薦

C++物件變數成員函式新增內容

 既要使資料能在一定範圍內共享,又要保證它不被任意修改,可使用const。 ·        用const修飾的宣告資料成員稱為常資料成員 ·        用const修飾的宣告成員函式稱為常成員函式 ·        用const修飾的定義物件稱為常物件 變數或物件被c

C++物件變數成員函式

用const修飾的宣告資料成員稱為常資料成員用const修飾的宣告成員函式稱為常成員函式用const修飾的定義物件稱為常物件 變數或物件被const修飾後其值不能被更新。因此被const修飾的變數或物件必須要進行初始化。(一)用const修飾的宣告資料成員稱為常資料成員

當同時安裝Python2和Python3後如何兼容並切換使用比如pip使用

err 完美解決 執行文件 class 需要 提示 改名 launcher 順序查找 由於歷史原因,Python有兩個大的版本分支,Python2和Python3,又由於一些庫只支持某個版本分支,所以需要在電腦上同時安裝Python2和Python3,因此如何讓兩個版

佇列實現棧兩個佇列實現一個棧方法實現程式碼

本節介紹一下如何用兩個佇列實現棧。 棧的主要操作就是入棧和出棧,其特點就是後進先出。我們先將兩個佇列分別定義為 queue1 與 queue2。 方案 1 入棧和出棧,都在 queue1 中完成,而 queue2 作為中轉空間。 入棧:直接入 queue1 即可。 出棧:把 queue1 中除最後一

棧實現佇列用兩個棧實現佇列方法實現程式碼

棧怎樣才能實現和佇列一樣從棧的底層抽出元素呢?一般會用兩個棧來實現佇列。 首先,我們將兩個棧分別定義為 stack1 與 stack2。 實現方案 1 我們讓入隊操作在 stack1 中執行,而出隊操作在 stack2 中執行。執行方式如下。 入隊:直接向 stack1 中入棧。 出隊:將 stac

C/C++高精度運算(大整數運算)壓位

1.高精度加法1.1 高精度加法        高精度運算的基本運算就是加和減。和算數的加減規則一樣,模擬豎式計算,考慮錯位運算與進位處理。下面是我老師給的程式碼,目前比網上其他的程式碼要精簡和巧妙。#include <cstdio> #include <c

C++繼承之二——派生類成員函式函式隱藏、建構函式與相容覆蓋規則

  在這一篇文章開始之前,我先解決一個問題。   在上一篇C++繼承詳解之一——初探繼承中,我提到了在派生類中可以定義一個與基類成員函式同名的函式,這樣派生類中的函式就會覆蓋掉基類的成員函式。   在譚浩強的C++程式設計這本書第十一章,351頁最下面有這麼

C++之物件成員變數成員函式

一、常物件說明:常物件是指物件的資料成員的值在物件被呼叫時不能被改變。常物件必須進行初始化,且能被更新。不能通過常物件呼叫普通成員函式,但是可以通過普通物件呼叫常成員函式。常物件只能呼叫常成員函式

Linux基本常用命令之lsdatecal

Linux基礎【1】顯示日期的指令:date示例:(1)#date +%Y/%m/%d結果:2018/02/27(2)#date +%H:%M結果:10:48【2】顯示日歷的指令:cal格式:cal [month] [year]示例:(1)#cal 2 2018(2)#cal 13 2018結果:cal:il

malloc和free函式轉載只是為了查閱方便若侵權立刪

malloc和free函式詳解   本文介紹malloc和free函式的內容。   在C中,對記憶體的管理是相當重要。下面開始介紹這兩個函式:     一、malloc()和free()的基本概念以及基本用法: 1、函式原型及說明: void *malloc(lon

scala-val物件例項化變數卻可以更改之深度解析小白適用

類和物件可能都很熟悉了,這裡僅供小白參考,大神請虐過。一開始學的時候物件是類的藍圖,啥,藍圖,什麼鬼?我們直接看程式碼吧~ import scala.io.Source class ChecksumAccumulator(){ var sum = 0 }

當同時安裝Python2和Python3後如何相容並切換使用比如pip使用

由於歷史原因,Python有兩個大的版本分支,Python2和Python3,又由於一些庫只支援某個版本分支,所以需要在電腦上同時安裝Python2和Python3,因此如何讓兩個版本的Python相容,如何讓指令碼在對應的Python版本上執行,這個是值得總結的。對於Ubu

同時安裝Python2和Python3如何相容並切換使用比如pip使用

對於Ubuntu 16.04 LTS版本來說,Python2(2.7.12)和Python3(3.5.2)默認同時安裝,預設的python版本是2.7.12。 用python2時,輸入:python2;用python3時,輸入:python3 對於

Jvm堆記憶體的劃分結構和優化垃圾回收詳細解答篇

1.S0與S1的區間明顯較小,有效新生代空間為Eden+S0/S1,因此有效空間就大,增加了記憶體使用率 2.有利於物件代的計算,當一個物件在S0/S1中達到設定的XX:MaxTenuringThreshold值後,會將其分到老年代中,設想一下,如果沒有S0/S1,直接分成兩個區,該如何計算物件經過了多少次G

C#漢字轉換拼音技術高性能

rim none pie 存在 asp pub net 如果 pinyin public static class ChineseToPinYin { private static readonly Dictionary<<span class=

C/C++ typedef用法真的很詳細

是p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文字替換。上述程式碼中const pStr p2並不等於const char * p2。const pStr p2和const long x本質上沒有區別,都是對變數進行只讀限制,只不過此處變數p2的資料型別是我們自

C語言中二維陣列名與陣列地址、首行地址、首行首元素地址關係與區別初學者必須掌握

C語言作為很多大學理工科都會學習的語言,作為一種程式設計入門語言。但是相對於其他高階程式語言來說相對是比較難,尤其是指針,不知道有多少莘莘學子都是因為它,從C語言入門到放棄。想當年,筆者在大一學習C語言

nginx 的安裝和gcc gcc-c++配置新手必看

首先玩linux的話, gcc gcc-c++,fast-cgi,wget,yum 這些包請確保已經安裝好了, #下載nginx openssl,pcre,zlib  wget http://nginx.org/download/nginx-1.12.0.tar.gz&nb

C++檔案讀寫ofstream,ifstream,fstream

在看C++程式設計思想中,每個練習基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含義,在看了幾位大牛的博文後,進行整理和總結: 這裡主要是討論fstream的內容: #include <fstream> ofstrea

C程式中對時間的處理——time庫函式

  功 能:將時間格式化,或者說:格式化一個時間字串。我們可以使用strftime()函式將時間格式化為我們想要的格式。   原 型:size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timept