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的指向和指向地址保存的值,都是常量

原文地址:https://www.cnblogs.com/heben/p/6015265.html