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 <stdio.h>

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

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

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

#include <stdio.h>

int main() {
    const int* p;
    int a = 5;
    p = &a;
    a = 10;
    printf("%d\n", *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 <stdio.h>

int main() {
    int a;
    int* const p = &a;
    *p = 5;
    *p = 10;
    printf("%d\n", *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("%d\n", a);
        }
    };
    
    常成員函數不能更新對象的數據成員,否則會報錯
  • 常對象只能調用它的常成員函數
  • 常對象的成員函數不一定都是常成員函數
  • 公有的靜態數據成員可以直接訪問,但私有的或保護的靜態數據成員卻必須通過公有的接口進行訪問,一般將這個公有的接口定義為靜態成員函數
  • 使用static關鍵字聲明的成員函數就是靜態成員函數,靜態程艷函數也屬於整個類而不屬於類中的某個對象,它是該類的所有對象共享的成員函數
  • 靜態程艷函數可以在類體類定義,也可以在類外定義。擋在類外定義時,要注意不能使用static關鍵字作為前綴
  • 由於靜態成員函數在類中只有一個副本,因此它訪問對象的成員時要受到一些限制:靜態成員函數可以直接訪問類中說明的靜態成員,但不能直接訪問類中說明的非靜態成員。若要訪問非靜態成員,必須通過參數傳遞的方式得到相應的對象,在通過對象進行訪問
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DoubleQ666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值