C++ const總結

先說結論ios

  • 非引用類型的賦值無所謂const。
  • const引用能夠指向const及非const。但非const引用只能指向非const。
  • 指向const的指針,能夠指向非const。但指向非const的指針,只能指向非const。

注意:上面說的都是變量賦值!express

     對於函數來講同理函數

    非const引用的形參只能接收非const引用的實參;const引用的形參能夠接收任意引用的實參。測試

    非const指針的形參只能接收非const指針的實參;const指針的形參能夠接收任意指針的實參。this

    對引用來講,const形參和非const形參,函數是不一樣的!!!指針沒這區別。spa

 

插一句指針

指針和引用,非const的不能指向const吧,爲何char *cc="abbc"就能夠?
網上說「是字面值常量的指針其實指向臨時對象,C++規定指向臨時對象的指針必須const」。
那這裏C++是怎麼處理的? 
  
this is not good wording...  
it starts from "temporary objects can be bound to const references and have their lifetimes extended to that of the bound reference",
and you can only get a pointer-to-const from such a ref but this is constraint is relaxed in C++11, with the addition of rvalue references

 

代碼說明一切code

#include <iostream>
#include <string>

using namespace std;

//test const
int main(){
    //------------測試非引用------------
    int no=10;
    const int no2=no; //OK
    int no3=no2; //OK!
    //上面得出結論:非引用類型的賦值無所謂const //------------測試引用------------ 
    int &noref=no;
    const int &noref1=no;

//    int &no2ref=no2;
    const int &no2ref1=no2;

    int &no3ref=no3; 
    const int &no3ref1=no3;
    // 上面得出結論:const引用能夠指向const及非const。但非const引用只能指向非const。 //------------測試指針------------
    int *pno=&no;
    const int *pno_1=&no;//指向const的指針,能夠指向非const 

//    int *pno2=&no2;//指向非const的指針,只能指向非const 
    const int *pno2_1=&no2;

    int *pno3=&no3;
    const int *pno3_1=&no3;
    // 上面得出結論:見備註    


    return 0;
}

 

函數測試代碼對象

#include <iostream>

using namespace std;

void print(int&);
void print2(const int& val);
void getx(char *c);
void getx2(const char *c);
int main(){
    
    int v1=2;
    const int v2=10;
    print(v1);
//    print(v2);//[Error] invalid initialization of reference of type 'int&' from expression of type 'const int'
    
    print2(v1);
    print2(v2);
    
    int& v3=v1;
    const int& v4=v2;
    
    print(v3);
//    print(v4);////[Error] invalid initialization of reference of type 'int&' from expression of type 'const int'
    
    print2(v3);
    print2(v4);
    
    //總結,非const的引用類型的形參,只能接收同類型的實參!
    
    // ------------------------
    char *c1="abc";
    const char *c2="xyz"; 
    getx(c1);
//    getx(c2);//[Error] invalid conversion from 'const char*' to 'char*' [-fpermissive]
    
    getx2(c1);
    getx2(c2);
    
    return 0;
}

void print(int& val){
    cout << val << endl;
} 

void print2(const int& val){
    cout<<val<<endl;
} 


void getx(char *c){
    cout<<c<<endl;
}
void getx2(const char *c){
    cout<<c<<endl;
}
相關文章
相關標籤/搜索