c++ const 修饰变量位置含义

c++ const 修饰变量位置含义

const 修饰成员变量

const修饰指针变量时:

  1. 只有一个const,如果const位于左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。
  2. 只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。
  3. 两个const,*左右各一个,表示指针和指针所指数据都不能修改。

参考

大佬博客

转载于:https://www.cnblogs.com/alking1001/p/11474922.html

### 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; } ``` 此案例创建了一组不同几何图形的对象数组并通过统一接口计算各自面积值,充分体现了多态特性的优势所在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值