栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++常量、常對象、常函數辨析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++常量、常對象、常函數辨析

例1. 下列語句中,錯誤的是()
  • const int buffer = 256;
  • const int temp;
  • const double* point;
  • const double* rt = new double(5.5);

答案:B

解析:

  • const是一個C++語言的關鍵字,它限定一個變量不允許被改變
  • 使用const在一定程度上可以提高程序的安全性和可靠性
  • 限定符聲明變量只能被讀,必須初始化
  • B中沒有初始化

C++裡const和*的區分

規則:首先將const和旁邊的一個東西連起來(默認作用於左邊的東西,如果左邊沒有,則作用於右邊的東西),然後再從右往左讀

常量必須要初始化,但變量可以不用初始化

例如:

const int*

因為const只有右邊有東西,所以將const和int連起來,即(const int)*

故從右往左讀為a pointer to a constant integer

即對象為指向一個常量的指針

換言之,指針可以修改指向的地址,但不能修改指向地址的值。例如以下程序

#include 

int main() {
    const int* p;
    int a = 5;
    int b = 10;
    p = &a;
    p = &b;
    printf("%dn", *p); // 輸出10
    return 0;
}

但是不能用 *p = 5 這樣的語句修改指向地址的值,這種寫法會報錯

但是直接修改指向的那個變量的值不會報錯,例如下面的程序

#include 

int main() {
    const int* p;
    int a = 5;
    p = &a;
    a = 10;
    printf("%dn", *p); // 輸出10
    return 0;
}

即可以用a改裡面的值,但不能用p改值

int const*

利用上面的規則,應為(int const)*

故從右往左讀為a pointer to a constant integer

和第一個相同含義

int* const

連起來為int(* const)

從右往左讀為a constant pointer to an integer

即指向的地址不能變,但是可以修改指向地址的值

例如下面的程序

#include 

int main() {
    int a;
    int* const p = &a;
    *p = 5;
    *p = 10;
    printf("%dn", *p);
    return 0;
}

因為p是常指針,故必須在聲明時就要指向一塊地址

const int* const

連起來為(const int)(* const)

從右往左讀為a constant pointer to a constant integer

即地址和指向的值都不能變

int const* const*

連起來為(int const)(* const)*

從右往左讀為a pointer to a constant pointer to a constant integer

即指向前一個東西的指針

int const* const* const

連起來為(int const)(* const)(* const)

即前一題的指針為常指針


現在來看題目裡的C、D

const double* point

即point是一個指向double型常量的變指針,固是否初始化都沒有關係

例2 下列語句中,錯誤的是
  • const int buffer = 256;
  • const double* point;
  • int const buffer = 256;
  • double* const point;

答案:D

例3 由於常對象不能被更新,因此
  • 通過常對象只能調用它的常成員函數
  • 通過常對象只能調用靜態成員函數
  • 常對象的成員都是常成員
  • 通過常對象可以調用任何不改變對象值

答案:A

解析:

  • 使用const關鍵字說明的成員函數稱為常成員函數,如下
  • class node {
        int a;
    public:
        void func() const {
            printf("%dn", a);
        }
    };
    
    常成員函數不能更新對象的數據成員,否則會報錯
  • 常對象只能調用它的常成員函數
  • 常對象的成員函數不一定都是常成員函數
  • 公有的靜態數據成員可以直接訪問,但私有的或保護的靜態數據成員卻必須通過公有的接口進行訪問,一般將這個公有的接口定義為靜態成員函數
  • 使用static關鍵字聲明的成員函數就是靜態成員函數,靜態程艷函數也屬於整個類而不屬於類中的某個對象,它是該類的所有對象共享的成員函數
  • 靜態程艷函數可以在類體類定義,也可以在類外定義。擋在類外定義時,要注意不能使用static關鍵字作為前綴
  • 由於靜態成員函數在類中只有一個副本,因此它訪問對象的成員時要受到一些限制:靜態成員函數可以直接訪問類中說明的靜態成員,但不能直接訪問類中說明的非靜態成員。若要訪問非靜態成員,必須通過參數傳遞的方式得到相應的對象,在通過對象進行訪問
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994747.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号