const成员函数

article/2025/9/12 12:54:07

const成员函数

  • const修饰成员函数的时候,const需要放在成员函数的后面,不能放在一开始,如果放在一开始的话,那么const其实是在修饰成员函数的返回值,而不是在修饰成员函数了
    在这里插入图片描述
  • const成员函数中不能修改成员变量
    在这里插入图片描述
  • 普通成员函数中可以修改成员变量
    在这里插入图片描述
  • 到底要不要使用const去修饰成员函数,就看你的函数中的变量需不需要被修改,如果希望其被修改的话,还是不要给成const,因为给成const的话,就不能去修改他了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
const修饰类的成员函数
  • 将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改
    在这里插入图片描述
看下面的代码
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;cout << "Date(int,int,int):" << this << endl;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;cout << "Date(Date&):" << this << endl;}// d1 = d2 = d3;Date& operator=(const Date& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}// 可读可写// Date* const  thisvoid TestFunc1(){//this = nullptr;this->_day++;}// 在该函数中不能修改当前对象的成员变量// const修饰this指针// const Date* const this;void TestFunc2()const{this->_day++;//_year++;//_month++;}// 只读操作:const Date* constvoid TestFuncWithConst()const{//TestFunc1(/*this*/);   // Date* const}// Date* const:可读可写void TestFuncWithoutConst(){TestFunc2(); // const Date* const: 只读}// (1+2)*3 ---> 12+3*~Date(){cout << "~Date():" << this << endl;}Date* operator&(){return this;}// Date* p = &d2;const Date* operator&()const{return this;}private:int _year;int _month;mutable int _day;//但是有些时候,我还是希望有些值是可以变化的//加上const之后修改成员函数,那么成员函数里面所有的值都不能发生变化了//如果我希望有些值仍然是可以修改的话,那么我可以再某些变量的前面加上mutable//加上mutable之后就表明这个变量可以在const所修饰的成员变量中被修改
};int main()
{Date d1(2019, 3, 24);const Date d2(2019, 3, 25); // 常量:d2中的内容不允许被修改cout << &d2 << endl;//d2.TestFunc1();  // TestFunc1成员函数:普通的成员函数,在函数中可以修改当前对象的成员d1.TestFunc1();d1.TestFunc2();return 0;
}
  • 但是有些时候,我还是希望有些值是可以变化的,加上const之后修改成员函数,那么成员函数里面所有的值都不能发生变化了,如果我希望有些值仍然是可以修改的话,那么我可以再某些变量的前面加上mutable,加上mutable之后就表明这个变量可以在const所修饰的成员变量中被修改

请思考下面的几个问题

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
  1. const对象可以调用非const成员函数吗?
  • 不可以,原因在于用const所修饰的变量本质上是一个常量,所以也就是说常量中的内容是不可以被修改的,但是普通的成员函数,在函数中可以修改当前对象的成员,所以两者是互相矛盾的,所以无法调用
    在这里插入图片描述
  1. 非const对象可以调用const成员函数吗?
  • 答案是可以的,因为普通类型的对象既可以修改成员变量的值,也可以不去修改成员变量的值,那到底要不要修改,根据情况而定就可以了。
    在这里插入图片描述
  1. const成员函数内可以调用其它的非const成员函数吗?
  • 是不可以的,因为如果你把一个函数声明为const类型的函数,那么就说明这个函数是只读的,是不可以修改的,而非const的成员函数是可读可写的
  1. 非const成员函数内可以调用其它的const成员函数吗?
  • 可以,因为外层函数的类型是 Date* const:可读可写,而内层函数的类型是const Date* const: 只读,外层可以修改也可以不修改,到底要不要修改,根据具体情况而定就可以了

取地址及const取地址操作符重载

// Date* p = &d2;
const Date* operator&()const    //如何第一个const没有加的话,代码是不能通编译的
{return this; //因为要返回的是指针,但是如果返回的只是类类型的指针的话是不可以的,因为this指针是const类型的//所以返回值的前面也要加上const才可以
}
int main()
{Date d1(2019, 3, 24);const Date d2(2019, 3, 25); // 常量:d2中的内容不允许被修改cout << &d2 << endl;//d2.TestFunc1();  // TestFunc1成员函数:普通的成员函数,在函数中可以修改当前对象的成员d1.TestFunc1();d1.TestFunc2();return 0;
}
class Date
{
public :
Date* operator&()
{return this ;
}
const Date* operator&()const
{return this ;
}
private :int _year ; // 年int _month ; // 月int _day ; // 日
};
  • 这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容

程序的运行结果是什么

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;cout << "Date(int,int,int):" << this << endl;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;cout << "Date(Date&):" << this << endl;}// d1 = d2 = d3;Date& operator=(const Date& d){cout << this << "=" << &d << endl;if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}~Date(){cout << "~Date():" << this << endl;}int _year;int _month;int _day;
};Date TestDate(Date& d)
{Date temp(d);temp._day += 1;return d;
}void TestDate()
{Date d1(2019, 3, 24);Date d2(d1);d1 = TestDate(d2);
}int main()
{TestDate();return 0;
}
  • 打印结果如下所示:
    在这里插入图片描述
    在这里插入图片描述
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;cout << "Date(int,int,int):" << this << endl;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;cout << "Date(Date&):" << this << endl;}// d1 = d2 = d3;Date& operator=(const Date& d){cout << this << "=" << &d << endl;if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}~Date(){cout << "~Date():" << this << endl;}int _year;int _month;int _day;
};Date& TestDate(Date& d)
{Date temp(d);temp._day += 1;return d;
}void TestDate()
{Date d1(2019, 3, 24);Date d2(d1);d1 = TestDate(d2);
}int main()
{TestDate();return 0;
}
  • 结果如下所示:
    在这里插入图片描述
const 重载

在这里插入图片描述

  • 上面的两个函数是可以形成重载的,之所以可以形成重载是因为有const进行修饰,因为一旦加了const进行修饰的话,两个函数的this指针的类型就不一样了,这也就是为什么两个函数可以形成重载的原因

http://chatgpt.dhexx.cn/article/nOPNNxFi.shtml

相关文章

const函数

const是衡量一个程序员是否老道的一个标准&#xff0c;除了修饰变量之外&#xff0c;还可以修饰函数&#xff0c;主要有以下几种形式 const int& fun(int& a); //修饰返回值 int& fun(const int& a); //修饰形参 int& fun(int& a) const{} //const成员…

梳理c++ const 修饰函数

const是衡量一个程序员是否老道的一个标准&#xff0c;除了修饰变量之外&#xff0c;还可以修饰函数&#xff0c;主要有以下几种形式 const int& fun(int& a); //修饰返回值 int& fun(const int& a); //修饰形参 int& fun(int& a) const{} //const成员…

C++基础——const成员函数

目录 一.Const成员函数 1.定义&#xff1a; 2.格式&#xff1a; 3.代码示例&#xff1a; .h文件&#xff1a; definition.cpp文件 特性&#xff1a; 例&#xff1a; 那么const对象既可以调用非const型成员函数吗&#xff1f; 问题3.const成员函数内可以调用其它…

JAVA输入/输出流详细讲解

应用程序经常需要访问文件和目录&#xff0c;读取文件信息或写入信息到文件&#xff0c;即从外界输入数据或者向外界传输数据&#xff0c;这些数据可以保存在磁盘文件、内存或其他程序中。在Java中&#xff0c;对这些数据的操作是通过I/O技术来实现的。所谓I/O技术&#xff0c;…

java输出语句_java输入输出语句是什么

在java中,输入语句为“Scanner对象.next()系列方法”,例“Scanner对象.nextLine()”表示输入字符串;输出语句为“System.out.println()”、“System.out.print()”等。 对于经常上机刷题的来说,首先得解决输入输出方法,Java的输入输出流在Java学习过程的后面部分才会接触,…

Java输入输出处理

活动地址&#xff1a;CSDN21天学习挑战赛 &#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;21天挑战回顾java ✨知足上进&#xff0c;不负野心。 &am…

java 输入输出总结(牛客、笔试、机试)

因为踩过坑&#xff0c;所以特别整理了一下&#xff0c;发现其实不少小伙伴同样都是这样&#xff0c;特别简单小结一下&#xff0c;java网上笔试的时候OJ的一些要求的实例 1 单行输入 // 本题为考试单行多行输入输出规范示例&#xff0c;无需提交&#xff0c;不计分。 import j…

java输入输出的方法

java输入输出 目录 一、控制台输入输出 二、文件读写 一、控制台输入输出 java控制台的输入输出主要依赖于scanner类&#xff0c;使用Scanner scannernew Scanner(System.in)获取了控制台输入的字段&#xff0c;其中system.in就表示这个对象读取的是控制台。 public static …

java读取输出流_Java输入输出流

1什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 Ja…

Java 输入输出流学习总结

文章目录 前言&#xff1a;为什么要有输入输出流一、Java 的标准输入输出标准输入 System.in标准输出 System.out程序 exp8_3&#xff1a;简单的输入输出 二、输入输出流框架三、输入输出流类的应用课本程序 exp8.4改写 exp8.4(1)改写 exp_8.4(2) 四、RandomAccessFile 类输入输…

java 输入输出流

java I/O流 在java中所有数据都是使用流读写的。流是一组有序的数据序列&#xff0c;将数据从一个地方带到另一个地方。根据数据流向的不同&#xff0c;可以分为输入&#xff08;Input&#xff09;流和输出&#xff08;Output&#xff09;流两种。 为什么要使用输入输出流 例…

Java(2)-Java IO输入输出流

一.什么是IO Java中I/O操作主要是指使用Java进行输入&#xff0c;输出操作. Java所有的I/O机制都是基于数据流进行输入输出&#xff0c;这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读…

Java——输入输出

本篇主要介绍Java的输入与输出&#xff0c;当然&#xff0c;这里说的是控制台下的输入与输出&#xff0c;窗口程序的设计将会再后续篇章中有详细说明。   Java的输出很简单&#xff0c;调用System.out.println()即可打印输出你想要输出的内容。我们之前也已经看到过。调用pr…

C语言之static关键字详解

目录 前言&#xff1a; 一、几个概念 1.变量 2.局部变量和全局变量 3.变量的作用域 4.变量的生命周期 二、static关键字的作用 三、static关键字修饰局部变量 四、static关键字修饰全局变量 五、static关键字修饰函数 写在最后&#xff1a; 前言&#xff1a; static&am…

static关键字你真的懂了吗?

文章目录 static关键字1、Java中的static1.1 static关键字的定义和性质1.2 实例变量与静态变量1.2.1 实例变量1.2.2 静态变量 1.3 静态代码块1.4 *实例语句块 / 代码块1.5 static总结1.5.1 对java语句的解读1.5.2 什么时候定义为静态的&#xff1f; 2、C/C中的static2.1 局部变…

C语言extern和static关键字详解

C语言extern和static关键字详解 文章目录 1 前言2 作用域2.1 代码块作用域2.2 文件作用域 3 存储类型4 链接属性5 extern和static关键字5.1 extern关键字5.2 static关键字 1 前言 在讲extern和static关键字前&#xff0c;先讲几点相关的基础知识——作用域、存储类型、链接属性…

什么是static关键字

什么是static关键字 static关键字我们经常接触&#xff0c;不过我们一直没有讨论过它到底是什么&#xff0c;有什么具体的作用&#xff0c;那static关键字是什么呢&#xff0c;有啥用呢&#xff1f; static是静态的意思&#xff0c;是一个修饰符&#xff0c;就像是一个形容词&…

static关键字(java)

一、static的用途 1.static修饰的变量和方法是属于类的&#xff1b; 2.static修饰的变量和对象&#xff0c;方法存储在方法区的静态常量池中&#xff1b;是共享的&#xff1b; 3.可以在没有创建任何对象的前提下&#xff0c;仅仅通过类本身来调用static方法 4.static修饰的…

static关键字的用法

static关键字用法 目录 一.概述二.使用动机三.使用方法 static关键字修饰类static关键字修饰方法static关键字修饰变量static关键字修饰代码块 一. 概述 > static是一个静态修饰符关键字&#xff0c;表示静态的意思&#xff0c; ①方便在没有创建对象的情况下进行调用。可…

static 关键字用法总结

一、static 关键字的含义 static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块&#xff0c;修饰成员变量表示全局静态成员变量&#xff0c;修饰方法表示静态方法。(注意&#xff1a;不能修饰普通类&#xff0c;除了内部类&#xff0c;这是为什么&#…