zoukankan      html  css  js  c++  java
  • C++ const

    当const出现在函数定义的末尾

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Person
    {
    private:
        string name;
        string unit;
    public:
    
        Person(const string& name, const string& unit)
        {
            this->name = name;
            this->unit = unit;
        }
    
        void TryToChange1() const
        {
            //this->name = "name1"; //无法编译 没有与这些操作数匹配的 "="运算符
            //this->desc = "good guy"; //无法编译,表达式必须是可修改的左值
        }
        const void TryToChange2()
        {
            this->name = "IQ";
            this->unit = "GSG9";
        }
        void show() 
        {
            cout << "name: " << name << " unit: " << this->unit << endl;
        }
    };
    
    
    int main(void)
    {
        Person* person = new Person("Ash", "ddd");
        person->show();
        person->TryToChange2();
        person->show();
        cin.get();
        return 0;
    }

    思考:

    1.函数末尾加上const,该函数将不能改变类的属性

    2.这里没有讨论返回值加上const情况,如const string change()这样的情况,因为说起来其实很简单,就是返回值不能作为左值。

    当const修饰形参

    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    void change(int num1, int* num2, const int* num3, int* const num4, const int* const num5, const int num6, const int& num7, int &num8) {
    
        num1 = 0;
        num2 = new int(0);
        num3 = new int(0);
        *num4 = 0;
        num8 = 0;
        //*num3 = 0; //无法通过编译,表达式必须是可修改的左值
        //num4 = new int(0); //无法通过编译,表达式必须是可修改的左值
        //num5 = new int(5); //无法通过编译,表达式必须是可修改的左值
        //*num5 = 0; //无法通过编译,表达式必须是可修改的左值
        //num6 = 0; //无法通过编译,表达式必须是可修改的左值
        //num7 = 0; //无法通过编译,表达式必须是可修改的左值
    }
    
    int main(void)
    {    
        int num1 = 1;
        int* num2 = new int(2);
        int* num3 = new int(3);
        int* num4 = new int(4);
        int* num5 = new int(5);
        int num6 = 6;
        int num7 = 7;
        int num8 = 8;
        
        cout << "入参: num1=" << num1 << " num2=" << *num2 << " num3=" << *num3 << " num4=" << *num4 << " num5=" << *num5 << " num6=" << num6 << " num7=" << num7 << " num8=" << num8 << endl;
        change(num1, num2, num3, num4, num5, num6, num7, num8);
        cout << "入参: num1=" << num1 << " num2=" << *num2 << " num3=" << *num3 << " num4=" << *num4 << " num5=" << *num5 << " num6=" << num6 << " num7=" << num7 << " num8=" << num8 << endl;
    
        cin.get();
        return 0;
    }

    结果

    思考:

    1.如num6,const修饰的参数,是不可再次赋值的

    2.如num2,即使形参是指针,对num2的重新赋值,也不会改变实参的值

    除引用传递之外的参数传递方式,如num1和num2的参数传递方式,被称为值传递,根据网上的说法值传递由于存在变量拷贝,因而效率较低;引用传递效率较高,但为了能够避免修改实参,常常以const修饰,另外有时候实际项目中,实参本身就是const类型,所以设计模板函数时,需要考虑到这一情况,支持const引用参数传入

    3.如num3,const修饰的是 int* num3,这时num3这个指针的指向是可以改变的,但无法通过num3改变其指向的值。为了理解这一点,可以认为const修饰的是int类型的*num3 ,也就是说*num3是常量

    4.如num4,const修饰的是num4这个指针,因此指针的指向不能改变,但指针指向的内容可以改变

    5.如const int* const num5 ,num5的指向和指向地址保存的值,都是常量

  • 相关阅读:
    容器的注册
    context创建过程解析(三)之deployDirectories
    context创建过程解析(二)之deployWARs
    Redis数据类型
    Kafka常用命令
    使用Charles抓包微信小程序
    DO、DTO、BO、AO、VO、POJO定义
    主题样式之鼠标点击效果
    Mysql常用命令
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/heben/p/6015265.html
Copyright © 2011-2022 走看看