c++常对象与常成员函数

发布于:2024-05-20 ⋅ 阅读:(144) ⋅ 点赞:(0)

一、常对象

概述

常对象是指声明为 const 的对象。常对象在声明后,其成员变量不能被修改,也不能调用非常量成员函数。

声明与调用

#include <iostream>
using namespace std;

class MyClass {
private:
    int value;

public:
    MyClass(int v) : value(v) {}

    void setValue(int v) {
        value = v;
    }

    int getValue() const {
        return value;
    }

    void display() const {
        cout << "Value: " << value << endl;
    }
};

int main() {
    const MyClass obj(10); // 声明一个常对象
    // obj.setValue(20); // 错误:不能调用非常量成员函数
    cout << obj.getValue() << endl; // 可以调用常成员函数
    obj.display(); // 可以调用常成员函数
    return 0;
}

二、常数据成员

概述

常数据成员在类定义中用 const 关键字声明。这些成员变量必须在构造函数的初始化列表中进行初始化,并且一旦初始化后,其值不能被改变。

声明与调用

#include <iostream>
using namespace std;

class MyClass {
private:
    const int value; // 声明常数据成员

public:
    MyClass(int v) : value(v) {} // 必须在初始化列表中初始化

    int getValue() const {
        return value;
    }
};

int main() {
    MyClass obj(10); // 声明一个对象并初始化常数据成员
    cout << obj.getValue() << endl;
    // obj.value = 20; // 错误:常数据成员不能被修改
    return 0;
}

声明:在类定义中使用 const 关键字声明数据成员,并在构造函数的初始化列表中初始化。

class MyClass {
    const int value;
public:
    MyClass(int v) : value(v) {}
};

调用:常数据成员的值在对象的生命周期内不能被修改。

MyClass obj(10);
// obj.value = 20; // 错误:常数据成员不能被修改

三、常成员函数

概述

常成员函数是在成员函数的声明和定义中使用 const 关键字,表示该成员函数不会修改对象的成员变量,并且可以被常对象调用。

声明与调用

#include <iostream>
using namespace std;

class MyClass {
private:
    int value;

public:
    MyClass(int v) : value(v) {}

    void setValue(int v) {
        value = v;
    }

    int getValue() const {
        return value;
    }

    void display() const { // 声明常成员函数
        cout << "Value: " << value << endl;
    }
};

int main() {
    MyClass obj(10); // 声明一个普通对象
    obj.display(); // 可以调用常成员函数
    obj.setValue(20); // 可以调用非常量成员函数
    obj.display();

    const MyClass constObj(30); // 声明一个常对象
    constObj.display(); // 常对象也可以调用常成员函数
    // constObj.setValue(40); // 错误:不能调用非常量成员函数
    return 0;
}

声明:在成员函数的声明和定义中使用 const 关键字。

class MyClass {
public:
    int getValue() const;
};

调用:常成员函数可以被常对象和普通对象调用,常成员函数不能修改成员变量。

const MyClass obj(10);
obj.getValue(); // 常对象可以调用常成员函数

主要区别总结

  1. 修饰符

    • 常成员函数在声明和定义时使用 const 关键字。
    • 普通成员函数没有 const 关键字。
  2. 修改成员变量

    • 常成员函数不能修改类的成员变量。
    • 普通成员函数可以修改类的成员变量。
  3. 调用权限

    • 常成员函数可以被常对象和非常对象调用。
    • 普通成员函数只能被非常对象调用,不能被常对象调用。
  4. 保证不变性

    • 常成员函数承诺不会修改对象的状态,提供了一种编译时的保证。
    • 普通成员函数没有这样的承诺,可以修改对象的状态。