一、常对象
概述
常对象是指声明为 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(); // 常对象可以调用常成员函数
主要区别总结
-
修饰符:
- 常成员函数在声明和定义时使用
const
关键字。 - 普通成员函数没有
const
关键字。
- 常成员函数在声明和定义时使用
-
修改成员变量:
- 常成员函数不能修改类的成员变量。
- 普通成员函数可以修改类的成员变量。
-
调用权限:
- 常成员函数可以被常对象和非常对象调用。
- 普通成员函数只能被非常对象调用,不能被常对象调用。
-
保证不变性:
- 常成员函数承诺不会修改对象的状态,提供了一种编译时的保证。
- 普通成员函数没有这样的承诺,可以修改对象的状态。