zoukankan      html  css  js  c++  java
  • C++ const修饰不同类型的用法

    const取自constant的缩写,本意是不变的,不易改变的意思
     

    一.修饰普通变量

    const int a = 7;
    int b = a;         //正确
    a = 8;             // 错误,不能赋值

    二.修饰指针

    int b = 500;
    const int* a = &b;                     
    int const *a = &b;   
                    
    这两种一样的,const修饰的是*a ,无法修改*a的值,*a指的其实是b的值
    就是无法给*a赋值,*a=10会报错
    但是能给b赋值,而且赋值后*a也会跟着变,但是不管如何只能读取*a,而不能给*a赋值

    int* const a = &b;
    const修饰的是a,既指针本身,就是a(地址)无法被修改,但是*a可以变,b也可以变


    const int* const a = &b;  
    为指针本身和指向的内容均为常量

    三.修饰类的成员函数时

    为什么仅仅说是类中的成员函数?因为非成员函数不能用const修饰,在cpp文件下直接写一个函数带const会报错

    在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。

    class A
    {
    private:
    	int i;
    public:
    	void setnum(int n) //set函数需要设置i的值,所以不能声明为const
    	{
    		i = n;
    	}
    
    	int getnum() const //get函数返回i的值,不需要对i进行修改,则可以用const修饰。防止在函数体内对i进行修改。
    	{
    		//i = 30;  会报错,这句要删掉
                    //Func();  这句也会报错,不能调非constd的函数,“对象含有与成员 函数 "A::func" 不兼容的类型限定符
    		return i;
    	}
            
            int Func()
            {
                return 0;
            }
    };

     

    四.const修饰函数参数

    1.防止传入的参数代表的内容在函数体内被改变,但仅对指针和引用有意义。

    因为如果是按值传递,传给参数的仅仅是实参的副本,即使在函数体内改变了形参,实参也不会得到影响。如:
    void fun(const int  i)
    {
        i = 10;
    }
    在函数体内是不能改变 i 的值的,但是没有任何实际意义,因为按值传递实参的值本来就不会改变,加不加const没有区

    2.const修饰的函数参数是指针时,代表在函数体内不能修改该指针所指的内容,起到保护作用

    如下:在字符串复制的函数中保证不修改源字符串的情况下,实现字符串的复制
    void fun(const char * src, char * des) //保护源字符串不被修改,若修改src则编译出错。
    {                    
         strcpy(des,src);
    }
    而且const指针可以接收非const和const指针,而非const指针只能接收非const指针

    3.const修饰引用时

    当传参的类型为自定义类型,比如A是自定义的类,如下:
    void fun(A a)
    {

    那么此时,传递进来的参数a是实参对象的副本,
    要调用构造函数来构造这个副本,而且函数结束后要调用析构函数来释放这个副本,在空间和时间上都造成了浪费
    所以函数参数为类对象的情况,推荐用引用。
    但是按引用传递,又可能会造成安全隐患,通过函数参数的引用可以修改实参的内部数据成员,所以用const来保护实参,如下:
    void fun(A& a)
    {

    五.修饰函数返回值

    也是用const来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。归根究底就是使得函数调用表达式不能作为左值。

    class A 
    {
    private:
    	int i;
    public:
    	A() 
    	{ 
    		i = 0;
    	}
        int & get() 
    	{
    		return i;
    	}
    
    	const int & get_i()
    	{
    		return i;
    	}
    };
    
    void main()
    {
    	A a;
    	cout << a.get() << endl; //数据成员值为0
    	a.get() = 1; //尝试修改a对象的数据成员为1,而且是用函数调用表达式作为左值。
    	cout << a.get() << endl; //数据成员真的被改为1了,返回指针的情况也可以修改成员i的值,所以为了安全起见最好在返回值加上const,使得函数调用表达式不能作为左值
    
    	a.get_i() = 1;//这一句会报错,因为是const修饰,不能修改函数返回值
    }
    
     
  • 相关阅读:
    浮点数大于0
    坐标变换
    实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
    计算sigma
    ECharts 在winform中使用(访问JS)
    Linux用户锁定、解锁及锁定查看
    vue或者js中平均分割数组
    python 文件读写with open模式r,r+,w,w+,a,a+的区别
    vue 三元表达式当出现elif
    后端排序时去掉element表格排序的null状态
  • 原文地址:https://www.cnblogs.com/kevinWu7/p/10163449.html
Copyright © 2011-2022 走看看