《C++语言教程》18章 const和mutable的使用


一、const修饰变量

在C++中,一般用const完全替代C语言的define,且功能更多。用const修饰变量,使之成为常量(或常数),这很简单,但结构体中成员如果用了const,需要注意,请看下面例子。


#include <iostream>
using namespace std;

typedef const double CONSTANT; 
CONSTANT pi = 3.14159265;

struct mytype {
    const int x;
    int y;
};

int main ( )
{
    //pi = 3.14;    //编译出错,常量不能赋值
    
    //常量定义必须有初始值
    //mytype s;    //编译出错,结构体中的x成员常量没有初始值
    mytype s1 = {15, 20};

    //s1.x = 3     //编译出错,常量不能赋值
    s1.y = 100;

    const mytype s2 = {25, 30};
    //s2.y = 125;  //编译出错,整个s2的所有成员都变成了常量

    cout << "s1: " << s1.x << ", " << s1.y << endl;
    cout << "s2: " << s2.x << ", " << s2.y << endl;

    return 0;
}

这一节的内容应该是C语言的内容,早期版本的C语言不支持const,现在已经完全支持。

二、const修饰类的成员函数

用const修饰类的成员函数,可以使函数内不能对任何成员变量修改。不是成员变量当然可以修改。


#include <iostream>
using namespace std;

class classA {
    int x;
    string y;
public:
    void get(int& i, string& s) const {
        int k;
        k = 10;       //非成员变量可以修改
        //x = k;      //成员变量不能修改
        //y = "小雅"; //成员变量不能修改
        i = x, s = y;
    }
    void set(int i, string s) { x = i; y = s; }
};

int main ( )
{
    classA ca;
    ca.set(100, "劝学网");

    int i;
    string s;
    ca.get(i, s);
    cout << s << "--" << i << endl;

    return 0;
}

三、mutable与const为敌

用mutable修饰成员变量,可以使该成员变量即使在const成员函数中也能被修改。


#include <iostream>
using namespace std;

class classA {
    int x;
    mutable string y;
public:
    void get(int& i, string& s) const {
        int k;
        k = 10;      //非成员变量可以修改
        //x = k;     //成员变量不能修改
        y = "小雅";  //mutable变量可以修改
        i = x, s = y;
    }
    void set(int i, string s) { x = i; y = s; }
};

int main ( )
{
    classA ca;
    ca.set(100, "劝学网");

    int i;
    string s;
    ca.get(i, s);
    cout << s << "--" << i << endl;

    return 0;
}