• C++中const的特性


    目录(作用):

      1:修饰变量,说明该变量不可以被改变;
      2:修饰指针,分为指向常量的指针和自身是常量的指针
      3:修饰引用,指向常量的引用,用于修饰形参,即避免了拷贝,有避免了函数对值的修改; 
      4:修改成员函数:说明该成员函数内不能修改成员变量。(但是成员变量加上mutable就可以了
     
     
    正文:
     
     以下是对各种情况的示例:
    #注:1:const修饰的引用cj的值且引用的对象无法修改,但是引用的i是可修改的
    #include <iostream>
    
    using namespace std;
    
    int main() {
    int i = 1;
    const int &cj = i;
    
    cout << "cj : " <<cj<< endl;(√)
    
    
     i=2;
     cout << "cj : " <<cj<< endl;(√)
    
     cj=3;
     cout << "cj : " <<cj<< endl;(×)//引用之后,cj类似于常量,不能做赋值操作,同样的重新引用也不行;只可读的
    
     int a=9;
     &cj=a; (×)
    
     return 0;
     }
    
    
    
     错误提示:
     /code/main.cpp: In function ‘int main()’:
     /code/main.cpp:15:4: error: assignment of read-only reference ‘cj’
     cj=3;
     ^
     /code/main.cpp:19:4: error: assignment of read-only reference ‘cj’
     cj=a;
     ^
     sandbox> exited with status 
    1 注:常量引用,本身也要是常量才行:
     2 
     3 #include <iostream>
     4 
     5 using namespace std;
     6 
     7 int main() {
     8     const int i = 4;
     9  
    10     const int &ck =  i; //正确,常量对象绑定到 const引用
    11      cout<< "ck="<<ck<<endl;
    12     
    13     const int b = 5;
    14  
    15     int &r = b;    //错误,
    16     
    17     return 0;
    18 }
    19 
    20 
    21 
    22 /code/main.cpp: In function ‘int main()’:
    23 /code/main.cpp:13:14: error: invalid initialization of reference of type ‘int&’ from expression of type ‘const int24     int &r = b;    //错误,
    25               ^
    26 sandbox> exited with status 0
     1 注:const 的隐式转换:
     2 
     3 #include <iostream>
     4 
     5 using namespace std;
     6 
     7 int main() {
     8     double b = 2.14;
     9     const int &a = b;
    10     // 会进行如下转换:
    11 //     int temp = b;
    12 //     const int &a=temp;
    13     // 所以,给b进行赋值,a可能
    14     cout<<"a="<<a<<endl;
    15     return 0;
    16 }
    17 
    18 运行结果:
    19 a=2
    20 sandbox> exited with status 0
     1 注:修饰成员函数_1:
     2 
     3 class Date
     4 {
     5     private:
     6     int m_year;
     7     int m_month;
     8     int m_day;
     9     public:
    10     int GetDay(void) const
    11     {
    12         m_day=7;
    13         return m_day;//修饰的情况下,不能对成员变量进行修改;
    14     }
    15 };
    16 
    17  
    22 
    23 int main() {
    24     double b = 2.14;
    25     const int &a = b;
    26     // 会进行如下转换:
    27     //     int temp = b;
    28     //     const int &a=temp;
    29     // 所以,给b进行赋值,a可能
    30     cout<<"a="<<a<<endl;
    31     return 0;
    32 }
    33 
    34 
    35 错误提示:
    36 /code/main.cpp: In member function ‘int Date::GetDay() const’:
    37 /code/main.cpp:16:8: error: assignment of member ‘Date::m_day’ in read-only object
    38   m_day=7;
    39         ^
    40 sandbox> exited with status 0

     1 注:修饰函数_2
     2 
     3 #include <iostream>
     4 
     5     using namespace std;
     6 
     7 
     8 
     9 class Date
    10 {
    11     private:
    12     int m_year;
    13     int m_month;
    14      mutable int m_day;//通过被mutable修改的成员变量,就可以被修改了
    15     public:
    16     int GetDay(void) const
    17     {
    18         m_day=7;
    19         return m_day;
    20     }
    21 };
    22 
    23 // void GetDay(void) const
    24 // {
    25 //     return m_day;
    26 
    27 // }
    28 
    29 int main() {
    30     double b = 2.14;
    31     const int &a = b;
    32     // 会进行如下转换:
    33     //     int temp = b;
    34     //     const int &a=temp;
    35     // 所以,给b进行赋值,a可能
    36     cout<<"a="<<a<<endl;
    37     return 0;
    38 }
    39 
    40 
    41 运行结果:
    42 a=2
    43 sandbox> exited with status 0
     1 注:const修饰的指针
     2 
     3 
     4 #include <iostream>
     5 
     6     using namespace std;
     7 
     8 
     9 int main() {
    10     const int* p = NULL;//这两种修饰的是*p指向的值
    11     //int const* p = NULL;
    12 
    13     int a=9;
    14     p=&a;//修改了p指向的地址,任然没有出错
    15     cout<<"*p="<<*p<<endl<<"p="<<p<<endl;
    16     
    17     
    18     int c=10;
    19     int* const b = &c;//这两种修饰的是p指向的地址
    20      c=45;
    21     *b=c;//修改了b指向的值,任然不会出错
    22     cout<<"*b="<<*b<<endl<<"b="<<b<<endl;
    23     
    24     b=&a;//这里有问题了,b指向的地址是不能修改的
    25     cout<<"*b="<<*b<<endl<<"b="<<b<<endl;
    26     return 0;
    27 }
    28 
    29 运行结果:
    30 /code/main.cpp: In function ‘int main()’:
    31 /code/main.cpp:21:3: error: assignment of read-only variable ‘b’
    32  b=&a;
    33    ^
    34 sandbox> exited with status 0
     1 注:const修饰的引用
     2 
     3 #include <iostream>
     4 
     5     using namespace std;
     6 
     7 
     8 int main() {
     9     int x = 3;
    10     const int& y = x;
    11     cout<<"y="<<y<<endl;
    12     x=9;
    13     cout<<"y="<<y<<endl;
    14     
    15     y=9;//const修饰的引用是不能够在更改引用指向的对象的
    16     cout<<"y="<<y<<endl;
    17     return 0;
    18 }
    19 
    20 
    21 运行结果:
    22 /code/main.cpp: In function ‘int main()’:
    23 /code/main.cpp:13:3: error: assignment of read-only reference ‘y’
    24  y=9;
    25    ^
    26 sandbox> exited with status 0
     
  • 相关阅读:
    旅行喵 React Native 技术实践
    微信、QQ这类IM App怎么做——谈谈Websocket
    IOS热更新-JSPatch实现原理+Patch现场恢复
    jquery 插件开发及extend
    JS Nice – JavaScript 代码美化和格式化工具
    ExtJS与jQuery的一点细节上的对比
    JQuery实现图片的预加载与延时加载
    十个实用但IE不支持的CSS属性
    如何通过预加载器提升网页加载速度
    遭遇Asp.Net长文件名下载的问题和解决办法
  • 原文地址:https://www.cnblogs.com/Jlord/p/12838387.html
Copyright © 2020-2023  润新知