欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中const修飾符的詳解及其作用介紹

 更新時(shí)間:2021年09月07日 14:15:36   作者:我是小白呀  
這篇文章主要介紹了C++中const修飾符的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

概述

const 是 constant 的縮寫(xiě), 是不變的意思. 在 C++ 中是用來(lái)修飾內(nèi)置類(lèi)型變量, 自定義對(duì)象, 成員函數(shù), 返回值, 函數(shù)參數(shù). const 可以幫我們避免無(wú)意之中的錯(cuò)誤操作.

在這里插入圖片描述

使用 const, 把有關(guān)的數(shù)據(jù)定義為常量 (常變量 / 常對(duì)象 / 常函數(shù)). const 既可以使數(shù)據(jù)在一定范圍內(nèi)共享, 又要保證它不被任意修改.

const 包括:

  • 常對(duì)象
  • 常指針
  • 常引用

常對(duì)象

我們可以將需要保證數(shù)據(jù)成員不改變的對(duì)象, 可以聲明為常對(duì)象. 常對(duì)象中的所有成員的值都不能被修改.

常變量的兩種格式:

類(lèi)名 const 對(duì)象名[(實(shí)參表列)];
const 類(lèi)名 對(duì)象名[(實(shí)參表列)];

常對(duì)象必須要有初始值. 例如:

Time const t1(12, 34, 46);
const Time t1(12, 34, 46);

試圖改變常對(duì)象的成員值會(huì)發(fā)生什么:

int main() {

    const Time t1(10, 10, 10);  // 定義const Time對(duì)象
    t1.set_time(2,2,2);  // 試圖改變t1對(duì)象的成員數(shù)據(jù), 報(bào)錯(cuò)

    return 0;
}

輸出:
C:\Users\Windows\CLionProjects\Project1\main.cpp: In function 'int main()':
C:\Users\Windows\CLionProjects\Project1\main.cpp:10:22: error: passing 'const Time' as 'this' argument discards qualifiers [-fpermissive]
     t1.set_time(2,2,2);
                      ^
In file included from C:\Users\Windows\CLionProjects\Project1\main.cpp:2:
C:\Users\Windows\CLionProjects\Project1\Time.h:12:10: note:   in call to 'void Time::set_time(int, int, int)'
     void set_time(int h, int m=0, int s=0);
          ^~~~~~~~
mingw32-make.exe[3]: *** [CMakeFiles\Project1.dir\build.make:81: CMakeFiles/Project1.dir/main.cpp.obj] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:94: CMakeFiles/Project1.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:101: CMakeFiles/Project1.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:136: Project1] Error 2

常對(duì)象成員

常成員函數(shù)

如果我們要引用常對(duì)象中的數(shù)據(jù)成員, 就需要將該成員函數(shù)聲明為 const 型函數(shù), 即常成員函數(shù). 常成員函數(shù)可以訪(fǎng)問(wèn)對(duì)象中的數(shù)據(jù)成員, 但不允許修改常對(duì)象中數(shù)據(jù)成員的值.

舉個(gè)栗子:

Time 類(lèi):

#ifndef PROJECT1_TIME_H
#define PROJECT1_TIME_H

class Time {
private:
    int minute;
    int second;
public:
    int hour;
    Time();  // 默認(rèn)構(gòu)造函數(shù)
    Time(int h, int m=0, int s=0);  // 有參構(gòu)造函數(shù)
    void set_time(int h, int m=0, int s=0);
    void show_time() const;  // 聲明為常成員函數(shù)
};

#endif //PROJECT1_TIME_H

Time.cpp:

#include "Time.h"
#include <iostream>
using namespace std;

// 默認(rèn)構(gòu)造函數(shù)
Time::Time() : hour(0), minute(0), second(0) {}

// 有參構(gòu)造函數(shù)
Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

void Time::set_time(int h, int m, int s) {
    hour = h;
    minute = m;
    second = s;
}

void Time::show_time() const {
    cout << hour << ":" << minute << ":" << second << endl;
}

main:

#include "Time.h"
#include <iostream>
using namespace std;

int main() {

    const Time t1(10, 10, 10);  // 定義const Time對(duì)象
    t1.show_time();  // 調(diào)用常成員函數(shù)

    return 0;
}

調(diào)試輸出:

10:10:10

注: const 是函數(shù)類(lèi)型的一部分, 在聲明函數(shù)和定義函數(shù)時(shí)都要有 const 關(guān)鍵字.

常數(shù)據(jù)成員

當(dāng)我們用關(guān)鍵字 const 來(lái)聲明常量數(shù)據(jù)成員, 可以限定其值不能改變.

Time 類(lèi):

#ifndef PROJECT1_TIME_H
#define PROJECT1_TIME_H

class Time {
private:

public:
    const int hour;  // 定義hour為常數(shù)據(jù)成員
    int minute;
    int second;

    Time();  // 默認(rèn)構(gòu)造函數(shù)
    Time(int h, int m=0, int s=0);  // 有參構(gòu)造函數(shù)
    void set_time(int m=0, int s=0);
    void show_time() const;  // 聲明為常成員函數(shù)
};

#endif //PROJECT1_TIME_H

因?yàn)?hour 為常數(shù)據(jù)成員, 所以我們只能通過(guò)構(gòu)造函數(shù)的參數(shù)初始化表對(duì)常數(shù)據(jù)成員進(jìn)行初始化.

// 默認(rèn)構(gòu)造函數(shù)
Time::Time() : hour(0), minute(0), second(0) {}

// 有參構(gòu)造函數(shù)
Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

我們不能再構(gòu)造函數(shù)中用賦值的方法對(duì)常數(shù)據(jù)成員初始化. 例如:

Time::Time(int h){hour=h;}  // 非法

不能用成員函數(shù)改變常數(shù)據(jù)成員的值. 例如:

void Time::setHour(int h){hour=h;}  // 非法

數(shù)據(jù)成員訪(fǎng)問(wèn)限制

常對(duì)象中的成員函數(shù)未加 const, 編譯系統(tǒng)認(rèn)為其是非 const 成員函數(shù).

在這里插入圖片描述

常對(duì)象修改的限制

如果一個(gè)對(duì)象被聲明為常對(duì)象, 則不能調(diào)用該對(duì)象的非 const 型的成員函數(shù), 除了由系統(tǒng)自動(dòng)調(diào)用的隱式的構(gòu)造函數(shù)和析構(gòu)函數(shù).

要點(diǎn):

  • 編輯系統(tǒng)只檢查函數(shù)的聲明, 只要發(fā)現(xiàn)調(diào)用了常對(duì)象的成員函數(shù), 而該函數(shù)未被聲明為 const, 就報(bào)錯(cuò)
  • 防止函數(shù)修改常對(duì)象中數(shù)據(jù)成員的值
  • 編譯系統(tǒng)對(duì)不安全的因素予以攔截, 為我們開(kāi)發(fā)人員省了不少心
  • 用常成員函數(shù)引用常變量

常指針

將指針變量聲明為 const 型, 指針值始終保持為其初始值, 不能改變.

指向?qū)ο蟮某V羔樃袷?

類(lèi)名 *const 變量名;
Time time1(10, 12, 15), t2;
Time * const pt = &t1  // pt 是常指針
pt = &t2; // 將一個(gè)指針固定

常見(jiàn)用途: 將一個(gè)指針固定地與一個(gè)對(duì)象聯(lián)系. 將常指針作為函數(shù)的形參, 目的是不允許在函數(shù)執(zhí)行過(guò)程中改變指針變量的值.

void doSomething(Test * const p1){
    p1 -> setX(5);
    p1 -> printxy();
} 

指向常變量的指針

定義指向常變量的指針變量的一般形式為:

const 類(lèi)名 *變量名 / 類(lèi)型名 const *變量名;

只有常變量的指針能指向常變量:

在這里插入圖片描述

指向常變量的指針變量可以指向未被聲明為 const 的變量, 但不能通過(guò)此指針變量改變?cè)撟兞康闹?

在這里插入圖片描述

重點(diǎn):

  • 如果一個(gè)變量已被聲明為常變量 / 對(duì)象. 我們就只能用指向常變量的指針指向他, 而不能用非 const 型的變量 / 對(duì)象的指針去指向它.

指向?qū)ο蟮闹羔?/h3>

定義指向?qū)ο蟮闹羔樧兞康囊话阈问綖?

const 類(lèi)名 *變量名 / 類(lèi)名 const *變量名;

舉個(gè)栗子:

在這里插入圖片描述

如果一個(gè)對(duì)象已經(jīng)被聲明為常對(duì)象, 我們就只能用指向常對(duì)象的指針指向他. 而不能用指向非 const 型變量 / 對(duì)象的指針指向他.

指向常對(duì)象的指針變量可以指向未被聲明為 const 的對(duì)象, 但不能通過(guò)此指針來(lái)改變?cè)搶?duì)象的值. 例如:

在這里插入圖片描述

小結(jié)

指向常對(duì)象的指針最常用語(yǔ)函數(shù)的形參, 以保護(hù)形參指針?biāo)赶虻膶?duì)象在函數(shù)執(zhí)行過(guò)程中不被修改.

當(dāng)我們希望在調(diào)用函數(shù)時(shí)對(duì)象的值不被修改, 就應(yīng)當(dāng)把形參定義為指向常對(duì)象的指針變量. 同時(shí)用對(duì)象的地址作為實(shí)參 (對(duì)象可以是 const 或非 const 型).

在這里插入圖片描述

在這里插入圖片描述

對(duì)象的常引用

一個(gè)變量的應(yīng)用就是變量的別名. 變量名和引用名都指向同一段沒(méi)存單元.

函數(shù)的形參可以是對(duì)象的引用. 如果不希望在函數(shù)中修改實(shí)參的值, 可以將形參聲明為常引用. 例如:

void fun(Time &t); 
void fun(const Time &);  // 常引用

我們應(yīng)該盡量使用常引用作為函數(shù)參數(shù), 原因有二:

  1. 既能保證數(shù)據(jù)安全, 使數(shù)據(jù)不能被隨意修改
  2. 在調(diào)用函數(shù)時(shí)不必建立實(shí)參的copy, 可以提高程序運(yùn)行效率

總結(jié)

在這里插入圖片描述

到此這篇關(guān)于C++中const修飾符的詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++ const內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)YUV文件轉(zhuǎn)JPEG格式

    C語(yǔ)言實(shí)現(xiàn)YUV文件轉(zhuǎn)JPEG格式

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)將YUV文件轉(zhuǎn)為JPEG格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C++?auto關(guān)鍵字的小知識(shí)點(diǎn)分享

    C++?auto關(guān)鍵字的小知識(shí)點(diǎn)分享

    這篇文章主要是來(lái)和大家介紹一些C++中的小知識(shí)點(diǎn),本文將從auto關(guān)鍵字開(kāi)始講起,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • floyd算法實(shí)現(xiàn)思路及實(shí)例代碼

    floyd算法實(shí)現(xiàn)思路及實(shí)例代碼

    這篇文章主要介紹了floyd算法實(shí)現(xiàn)思路及實(shí)例代碼,有需要的朋友可以參考一下
    2014-01-01
  • C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng)

    C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)寵物商店信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言中的操作符優(yōu)先級(jí)的詳細(xì)介紹

    C語(yǔ)言中的操作符優(yōu)先級(jí)的詳細(xì)介紹

    這篇文章主要介紹了C語(yǔ)言中的操作符優(yōu)先級(jí)的詳細(xì)介紹的相關(guān)資料,希望通過(guò)本文能幫助到大家,大家通過(guò)本文能徹底掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • Qt實(shí)現(xiàn)鬧鐘小程序

    Qt實(shí)現(xiàn)鬧鐘小程序

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)鬧鐘小程序,利用Qt的designer設(shè)計(jì)需要的鬧鐘界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C++?超詳細(xì)講解stack與queue的使用

    C++?超詳細(xì)講解stack與queue的使用

    C++?Stack(堆棧)?是一個(gè)容器類(lèi)的改編,為程序員提供了堆棧的全部功能,也就是說(shuō)實(shí)現(xiàn)了一個(gè)先進(jìn)后出(FILO)的數(shù)據(jù)結(jié)構(gòu),許多程序都使用了?queue?容器。queue?容器可以用來(lái)表示超市的結(jié)賬隊(duì)列或服務(wù)器上等待執(zhí)行的數(shù)據(jù)庫(kù)事務(wù)隊(duì)列
    2022-03-03
  • C++?Boost?Assign超詳細(xì)講解

    C++?Boost?Assign超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-12-12
  • 使用Matlab制作大富翁小游戲的過(guò)程詳解

    使用Matlab制作大富翁小游戲的過(guò)程詳解

    大富翁大家都玩過(guò),走到建筑的位置可以買(mǎi)地,第二圈走到買(mǎi)過(guò)的地可以升級(jí),別人經(jīng)過(guò)后需要付過(guò)路費(fèi),每次經(jīng)過(guò)起點(diǎn)都會(huì)獲得一定資金,玩到最后還沒(méi)破產(chǎn)的就是勝者,本文將制作一個(gè)Matlab版的大富翁小游戲,需要的可以參考一下
    2022-02-02
  • C++面向?qū)ο笳Z(yǔ)言自制多級(jí)菜單功能實(shí)現(xiàn)代碼

    C++面向?qū)ο笳Z(yǔ)言自制多級(jí)菜單功能實(shí)現(xiàn)代碼

    菜單類(lèi)主要負(fù)責(zé)菜單的創(chuàng)建、修改、刪除,是包含菜單結(jié)構(gòu)組織和響應(yīng)函數(shù)的模型,用戶(hù)擁有充分的自主性,可根據(jù)需要自定義菜單顯示和響應(yīng)函數(shù),這篇文章主要介紹了C++面向?qū)ο笳Z(yǔ)言自制多級(jí)菜單,需要的朋友可以參考下
    2024-06-06

最新評(píng)論