c++中const修饰成员函数的问题

简介: 问题引入:看下面这一段代码:

问题引入:

看下面这一段代码:

class Date
{
public:
 Date(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 void Print()
 {
 cout << "Print()" << endl;
 cout << "year:" << _year << endl;
 cout << "month:" << _month << endl;
 cout << "day:" << _day << endl << endl;
 }
//  void Print() const
//  {
//  cout << "Print()const" << endl;
//  cout << "year:" << _year << endl;
//  cout << "month:" << _month << endl;
//  cout << "day:" << _day << endl << endl;
//  }
private:
 int _year; // 年
 int _month; // 月
 int _day; // 日
};
void Test()
{
 Date d1(2022,1,13);
 d1.Print();   //正常运行
 const Date d2(2022,1,13);
 d2.Print();   //编译报错
}
  • 为什么会产生这种情况呢?
    是因为类内部的this指针,它的类型是 Date * const 类型,它指向的地址不可修改,但是指向的内容是可以修改的。而上图中的d2,const的内容是不可修改的,调用Print()之后,会产生权限放大的错误,因此编译不通过。
  • 如何修改这种错误呢?
    只需要在成员函数后面,加上const即可修改this指针的类型变为:const Date* const 类型。改成这样后,虽然d1调用会产生权限缩小,但这种问题是允许发生的,不会报错。


229a75569311473dade8ad51a35f1a19.png

  • const对象可以调用非const的成员函数吗?
    不可以,调用后会权限放大,不可以。
  • 非const对象可以调用const的成员函数吗?
    可以,调用后权限缩小,可以发生。
  • const成员函数内可以调用其它的非const成员函数吗?
    不可以,同样是调用后权限放大。
  • 非const成员函数内可以调用其它的const成员函数吗?
    可以,权限缩小允许发生。

因此为了防止这样的事情再发生,如果我们确定不会修改这个函数的参数,那么我们就使用const来修饰它,避免发生权限的问题。而且只有指针和引用会产生权限的问题。

目录
相关文章
|
30天前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
15天前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
12 1
|
23天前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
18 6
|
25天前
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
28天前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
28天前
|
编译器 C++
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
|
23天前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
26 0
c++学习笔记05 函数
|
22天前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
29 0
|
28天前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
30天前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
30 0