zoukankan      html  css  js  c++  java
  • C++中const的用法

    搬运大佬博客,方便以后查看

    https://www.cnblogs.com/xudong-bupt/p/3509567.html

    C++ const用法 尽可能使用const

      C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。

    1.const 修饰成员变量 

     1 #include<iostream>
     2 using namespace std;
     3 int main(){
     4     int a1=3;   ///non-const data
     5     const int a2=a1;    ///const data
     6 
     7     int * a3 = &a1;   ///non-const data,non-const pointer
     8     const int * a4 = &a1;   ///const data,non-const pointer
     9     int * const a5 = &a1;   ///non-const data,const pointer
    10     int const * const a6 = &a1;   ///const data,const pointer
    11     const int * const a7 = &a1;   ///const data,const pointer
    12 
    13     return 0;
    14 }

    const修饰指针变量时:

      (1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

      (2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

      (3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。

    2.const修饰函数参数

      传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。

    void testModifyConst(const int _x) {
         _x=5;   ///编译出错
    }

    3.const修饰成员函数

    (1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)

    (2)const成员函数不能调用非const成员函数,因为非const成员函数可以会修改成员变量

    #include <iostream>
    using namespace std;
    class Point{
        public :
        Point(int _x):x(_x){}
    
        void testConstFunction(int _x) const{
    
            ///错误,在const成员函数中,不能修改任何类成员变量
            x=_x;
    
            ///错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
            modify_x(_x);
        }
    
        void modify_x(int _x){
            x=_x;
        }
    
        int x;
    };

     4.const修饰函数返回值

    (1)指针传递

    如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。

    const int * mallocA(){  ///const data,non-const pointer
        int *a=new int(2);
        return a;
    }
    
    int main()
    {
        const int *a = mallocA();
        ///int *b = mallocA();  ///编译错误
        return 0;
    }

    (2)值传递

     如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。

    所以:

      不要把函数int GetInt(void) 写成const int GetInt(void)。
      不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。

      在编程中要尽可能多的使用const,这样可以获得编译器的帮助,以便写出健壮性的代码。

  • 相关阅读:
    HDU 3572 Task Schedule(拆点+最大流dinic)
    POJ 1236 Network of Schools(Tarjan缩点)
    HDU 3605 Escape(状压+最大流)
    HDU 1166 敌兵布阵(分块)
    Leetcode 223 Rectangle Area
    Leetcode 219 Contains Duplicate II STL
    Leetcode 36 Valid Sudoku
    Leetcode 88 Merge Sorted Array STL
    Leetcode 160 Intersection of Two Linked Lists 单向链表
    Leetcode 111 Minimum Depth of Binary Tree 二叉树
  • 原文地址:https://www.cnblogs.com/libin123/p/10394339.html
Copyright © 2011-2022 走看看