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類型的,它可以在任何場景下被修正。