程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ const潤飾變量和潤飾函數引見

C++ const潤飾變量和潤飾函數引見

編輯:關於C++

C++ const潤飾變量和潤飾函數引見。本站提示廣大學習愛好者:(C++ const潤飾變量和潤飾函數引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ const潤飾變量和潤飾函數引見正文


const潤飾變量

關於const最多見的一個面試題是如許的:char *const和const char*有甚麼差別,年夜家都曉得const潤飾符代表的是常量,即const潤飾的變量一旦被初始化是不克不及被更改的,這兩個類型一個代表的是指針弗成變,一個代表指針指向內容弗成變,但詳細哪一個對應哪一個,許多人一向弄不清晰。

有如許一個紀律,const潤飾的是它後面一切的數據類型,假如const在最後面,那末把它和它前面第一個數據類行交流.好比下面的const char*交流以後就是char const *,如許一來就很清晰了,char *const p中的const潤飾的是char *(留意,我們這裡把char和*都算作一品種型,這時候候const潤飾的是char和*的組合,也就是字符串指針),是一個指針類型,所以這時候候指針p是不克不及變的,好比上面這段代碼就會報錯

char str1[]="str1"; 
char str2[]="str2"; 
char *const p = str1; 
p = str2; 

這時候候p是一個指針常量,它是不克不及指向其余處所的,然則它自己指向的內容是可以變的,好比上面的操作就是許可的

char str1[]="str1"; 
char *const p = str1; 
p[0] = 'X'; 
printf("%s", str1); 

這時候候str1的值就釀成了"Xtr1"
我們再來看const char *p,依據後面提到的紀律,將const和它前面一個類型交流釀成char const *p(其實這類寫法也是許可的,只是人們習氣將const寫在最後面),這時候候const潤飾的是char,也就是說p指向的字符內容是不克不及變的。將下面兩個例子的char *const p全體改成const char *p,則成果正好相反,第一個可以編譯經由過程,第二個會報錯。

其它時刻就很好辨別了,好比const int ,const string等等,總之,const潤飾的是甚麼類型,這個類型的變量就不克不及被轉變。

const潤飾函數

先來看如許一個函數

const char * func(const char *str) const;

如許的函數比擬誇大,有三個const,我們從左到右來逐個解釋:

1、第一個const潤飾的是前往值,後面曾經說過,這裡的const潤飾的是char,也就是說前往值的內容是不克不及被更改的
2、第二個const和第一個是一樣的,這類用的比擬多,它作為函數參數,表現的是這個參數在函數體內是不克不及被修改的(被傳出去的實參其實不請求是const類型),如許做是為了避免函數對實參做一些不測的操作,你試想下,當你挪用一個函數時,你傳出來一個變量是"hello world!",調完函數以後釀成了"fuck the world!",這其實是弗成忍的,所以我們在設計函數的時刻,假如傳出去的參數只作為讀取應用,最好是將參數設成const類型。許多公司在面試讓寫代碼的時刻都邑看中這個細節,你留意了這個細節紛歧定解釋你牛逼,但你若沒留意那確定是會減分的。
3、再來講第三個const,依照我們最開端說的紀律,const潤飾的是它後面的一切數據類型,這裡它後面的一切數據類型組合起來就是一個函數,這類類型普通湧現在類成員函數裡,固然,這裡其實不是說這個函數是不克不及變的,它代表的時這個函數不克不及轉變類的成員變量,不論是public的照樣private的

我們上面舉例重要解釋第三種情形,來看如許一個簡略的法式

#include<stdio.h> 
 
class A 

public: 
    A() : x(0), y(0){} 
    void func(const int p) 
    { 
        x = p; 
        y = p; 
    } 
    int getY() 
    { 
        return y; 
    } 
    int x; 
private: 
    int y; 
}; 
 
int main(int argc, char* argv[]) 

    A a; 
    printf("x:%d y:%d\n", a.x, a.getY()); 
    a.func(2); 
    printf("x:%d y:%d\n", a.x, a.getY()); 
    return 0; 


這段代碼是可以直接編譯過的,運轉成果是

x:0 y:0 
x:2 y:2 

我們稍作修正,將void func(const int p)改成void func(const int p) const再編譯,就會直接報錯,報錯的兩行代碼是

x = p; 
y = p;

也就是說const類型的函數試圖去修正類的成員變量長短法的,然則有一種情形破例,我們再在下面修正的基本上做一點修正,將int x改成mutable int x,將int y改成mutable int y,這時候候法式又可以正常運轉了,也就是說,假如成員變量是mutable類型的,它可以在任何場景下被修正。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved