c++ const可以修饰函数吗
时间: 2023-12-10 13:05:15 浏览: 267
是的,C++中的const可以修饰函数。被const修饰的函数称为常量成员函数。常量成员函数有以下特点:
1. 常量成员函数不能修改类的成员变量,除非该成员变量被声明为mutable。
2. 常量成员函数可以访问类的成员变量,但是不能修改它们的值。
3. 常量成员函数可以被const对象调用,也可以被非const对象调用。
例如:
```
class MyClass {
public:
int getValue() const {
// 不能修改成员变量
// 只能读取成员变量
return value;
}
private:
int value;
};
```
在上面的例子中,getValue()函数被const修饰,表示它是一个常量成员函数,不能修改类的成员变量。
相关问题
C++ const修饰成员函数
### C++ `const` 成员函数概述
在C++中,`const` 关键字用于修饰成员函数,表明该函数不会修改对象的数据成员。这种机制增强了代码的安全性和可读性[^2]。
#### 声明与定义
当声明一个成员函数为 `const` 时,在函数原型中的参数列表之后加上 `const` 即可:
```cpp
class Example {
public:
int getValue() const;
};
```
上述例子展示了如何将 `getValue()` 方法标记为只读方法,意味着此方法承诺不对当前实例(`this`)所指向的对象状态做出更改[^3]。
#### 访问权限
对于被标注为 `const` 的成员函数来说,有如下访问规则:
- **仅能访问**同样带有 `const` 属性的方法;
- 能够读取所有类型的成员变量(无论是普通的还是带 `const` 的),但不允许对其进行写操作,除非这些变量被显式地标记为 `mutable`[^5];
例如:
```cpp
#include <iostream>
using namespace std;
class Counter {
private:
mutable int count; // 使用mutable允许在const成员函数内改变count的值
public:
Counter(): count(0){}
void increment() { ++count; }
int getCount() const {
cout << "Inside const member function." << endl;
return count++; // 这里可以修改因为count是mutable类型
}
};
int main(){
Counter c;
cout<<c.getCount()<<endl;
}
```
这段代码说明了即使是在 `getCount()` 这样的 `const` 成员函数内部也可以更新具有 `mutable` 特性的成员变量 `count`[^4]。
#### 构造重载
值得注意的是,两个除了是否含有 `const` 外其余部分完全一致的成员函数能够共存于同一个类中形成重载版本。具体而言就是说,既存在常规形式也存在附加了 `const` 后缀的形式。在这种情况下,编译器会依据调用者是不是常量来决定应该选用哪一个实现方式。
---
c++ const修饰虚函数
### C++ 中 `const` 修饰虚函数的用法及规则
在 C++ 中,当一个成员函数被声明为 `const` 时,表示该函数不会修改对象的状态。如果虚函数也需要满足这一特性,则可以通过将虚函数标记为 `const` 来实现。以下是关于 `const` 修饰虚函数的具体用法及其注意事项:
#### 声明与定义
虚函数可以像普通成员函数一样被声明为 `const` 函数。这意味着它可以在常量对象上调用,并且不允许修改任何非静态数据成员。
```cpp
class Base {
public:
virtual void display() const {
std::cout << "Base::display()" << std::endl;
}
};
```
上述代码中,`display()` 是一个虚函数并被声明为 `const`,因此它可以安全地用于常量对象上[^1]。
#### 继承中的行为
派生类覆盖基类的 `const` 虚函数时,也必须将其声明为 `const`。如果不这样做,编译器会认为这是两个不同的函数而非重载关系。
```cpp
class Derived : public Base {
public:
void display() const override {
std::cout << "Derived::display()" << std::endl;
}
};
```
这里需要注意的是,在派生类中重新定义了一个具有相同签名(包括返回类型和参数列表)但带有 `const` 的版本来覆盖基类方法[^2]。
#### 返回类型的协变性
对于带 `const` 的虚函数来说,其返回类型同样遵循 C++ 的协变规则。即允许派生类改变返回类型为更具体的类型,只要它是原始返回类型的派生物即可。
```cpp
class Animal {};
class Dog : public Animal {};
class Base {
public:
virtual Animal* getAnimal() const = 0;
};
class Derived : public Base {
public:
Dog* getAnimal() const override { return new Dog(); }
};
```
在这个例子中展示了如何利用 covariant returns (协变返回),其中 `getAnimal()` 方法从返回泛型动物实例变为具体狗实例的同时保持了接口一致性[^3]。
#### 注意事项
- **不可更改状态**: 如果某个操作确实需要修改内部状态就不能标注成 `const` 类型;否则会导致错误。
- **隐式转换问题**: 当尝试通过非常量指针访问原本只适用于恒定情况下的功能时可能会遇到麻烦。
```cpp
void test(Base& obj){
obj.display(); // 此处可能引发警告或错误取决于实际运行环境设置
}
int main(){
const Derived dObj;
test(dObj);
}
```
上面这段程序试图把一个常数引用传递给接受可变量形参的方法里去调用后者所含有的非限定版别的同名显示指令,这通常不符合逻辑预期因而需谨慎处理此类情形[^4]。
---
### 示例代码展示
下面给出一段完整的演示代码片段说明以上概念的应用场景:
```cpp
#include <iostream>
using namespace std;
// 定义基类
class Shape {
public:
virtual double area() const = 0; // 抽象纯虚函数加const属性
virtual ~Shape(){}
};
// 圆形作为子类之一
class Circle : public Shape {
private:
double radius_;
public:
explicit Circle(double r=1.0):radius_(r){}
double area() const override{
return 3.14 * radius_ * radius_;
}
};
// 矩形作为另一个子类
class Rectangle : public Shape {
private:
double width_, height_;
public:
Rectangle(double w=1.0,double h=1.0):width_(w),height_(h){}
double area() const override{
return width_*height_;
}
};
int main(){
const Shape* shapes[]={
new Circle(5),
new Rectangle(4,6)
};
for(auto shape:shapes){
cout<<"Area:"<<shape->area()<<'\n';
}
for(auto shape:shapes){
delete shape;
}
return 0;
}
```
此案例创建了一组不同几何图形的对象数组并通过统一接口计算各自面积值,充分体现了多态特性的优势所在。
---
阅读全文
相关推荐










