广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++成员函数中const的使用详解
  • 893
分享到

C++成员函数中const的使用详解

2024-04-02 19:04:59 893人浏览 泡泡鱼
摘要

目录修饰入参值传递址传递const修饰入参修饰返回值修饰函数总结const 在c++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用

const 在c++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用法。

修饰入参

首先我们要明白在C++中调用函数时存在两种方法,即传递值和传递引用。

值传递

值传递时,调用函数时会创建入参的拷贝,函数中的操作不会对原值进行修改,因此这种方式中不需要使用 const 来修饰入参,因为其只是对拷贝的临时对象进行操作。

址传递

传递地址时函数中的操作实际上是直接对原来的值进行修改,因此我们这里可以使用 const 修饰入参。

const修饰入参

当const修饰函数入参时表示该参数不能被修改,这个是最好理解的,比如一个函数的功能是拷贝,那么入参中的源文件都会用 const 修饰。

void A::show(const int *b) {
    cout << "show const";
    //  error:  read-only variable is not assignable
    // *b = 2;
    cout << b << endl;
}

接下来我们要关注的是这里 const 对于函数重载的作用,这里给出结论,欢迎大家讨论,对应按值传递的函数来说 const 不会有重载的效果,但是传递指针和引用是会有重载的效果。

void A::show(const int b)
// void A::show(int b) // error class member cannot be redeclared
void display(int *num); // overload
void display(const int *num); // overload
void fun(A &a); // overload
void fun(const A &a); // overload

函数重载的关键是函数的参数列表——即函数特征标(function signature)。如果两个函数的参数数目和类型相同,并且参数的排列顺序也相同,则他们的特征标相同,而变量名是无关紧要的。

总结一下注意点:

  • 如果输入参数采用“值传递”,**由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加 const 修饰。**例如不要将函数 void Func1(int x) 写成 void Func1(const int x)
  • 如果参数作为输出参数,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加 const 修饰,否则该参数将失去输出功能(因为有 const 修饰之后,不能改变他的值)。
  • 果参数作为输入参数,可以防止数据被改变,起到保护作用,增加程序的健壮性,建议是能加const尽量加上

上述测试代码如下:

#include <iOStream>
using namespace std;
class A {
private:
    int a;
public:
    A(int a) {
        this->a = a;
    }
    void show(int b);
    // error redeclared
    // void show(const int b);
    void display(int *num); // ok
    void display(const int *num); // ok
    void fun(A &a);
    void fun(const A &a);
    void happy(int * h);
    void hour(const int * h);
};
void A::show(int b) {
    cout << "show: " << b << endl;
}
void A::display(int *num) {
    cout << "display:" << *num << endl;
}
void A::display(const int *num) {
    cout << "const display:" << *num << endl;
}
void A::fun(A &obj) {
    cout << "fun: " << obj.a << endl;
}
void A::fun(const A &obj) {
    cout << "const fun: " << obj.a << endl;
}
void A::happy(int *h) {
    cout << "happy:" << *h << endl;
}
void A::hour(const int *h) {
    cout << "const hour:" << *h << endl;
}
int main() {
    A a(1);
    const A a2(11);
    int b1 = 2;
    const int b2 = 3;
    // test overload
    a.show(b1);
    a.show(b2);
    a.display(&b1);
    a.display(&b2);
    a.fun(a);
    a.fun(a2);
    // test const
    a.happy(&b1);
    // a.happy(&b2); // error cannot initialize a parameter of type 'int *' with an rvalue of type 'const int *'
    a.hour(&b1);
    a.hour(&b2);
    return 0;
}
// ouptut
show: 2
show: 3
display:2
const display:3
fun: 1
const fun: 11
happy:2
const hour:2
const hour:3

修饰返回值

const 修饰返回值时,表示返回值不能被修改。需要注意的是如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加 const 修饰没有任何价值。如果返回的是引用或指针,表示不能修改指向的数据。

一般用得多的是返回值是引用的函数, 可以肯定的是这个引用必然不是临时对象的引用, 因此一定是成员变量或者是函数参数, 所以在返回的时候为了避免其成为左值被修改,就需要加上const关键字来修饰。

我们可以看如下代码示例:

#include <iostream>
using namespace std;
class Alice {
private:
    int a;
public:
    Alice(int a): a(a) {}
    int get_a() {return a;}
    const int* get_const_ptr() {return &a;}
    int* get_ptr() {return &a;}
};
int main() {
    Alice alice(1);
    int a1 = alice.get_a(); // ok
    cout << a1 << endl;
    const int a2 = alice.get_a(); // ok
    cout << a2 << endl;
    // error cannot initialize a variable of type 'int *' with an rvalue of type 'const int *'
    // int* b1 = alice.get_const_ptr();
    const int* b2 = alice.get_const_ptr(); // ok
    cout << *b2 << endl; // ok
    // *b2 = 3; // error read-only variable is not assignable
    *(alice.get_ptr()) = 3;
    cout << alice.get_a() << endl; // 3
    return 0;
}

修饰函数

const 也可以用来放在函数末尾,用来修饰成员函数,表明其是一个常成员函数,这个对于初次接触C++的同学来说会有点陌生,不过这也是C++中严谨的地方。先看代码示例,学习任何编程技术都一定要写对应的代码,把它跑起来并分析结果才算是真正学会了,不会你只是知道了这个知识点,只知其然而不知其所以然。纸上得来终觉浅,绝知此事要躬行,这里的要躬行指的就是写代码。

首先来看如下的代码

class Alice {
private:
    int a;
public:
    Alice(int a): a(a) {}
    void show();
};
void Alice::show() {
    cout << "hello Alice" << endl;
}
int main() {
    const Alice a(1);
    //  error: 'this' argument to member function 'show' has type 'const Alice', but function is not marked const
    // a.show();
    return 0;
}

上述代码会报错,因为 show() 方法不是常成员函数,而 a 是常对象。本质上,成员函数中都有一个隐含的入参 this, 这个 this指的就是调用该方法的对象,而如果在函数的后面加上 const,那么这个 const 实际上修饰的就是这个 this。也就是说函数后加上了 const,表明这个函数不会改变调用者对象。

这里借用侯捷老师的图片

在这里插入图片描述

上面图片表明,在正常情况下:

  • non-const对象可以调用const 或者 non-const 成员函数
  • const 对象 只可以调用 const 成员函数

补充一点,**如果成员函数同时具有 const 和 non-const 两个版本的话, const 对象只能调用const成员函数, non-const 对象只能调用 non-const 成员函数。**如以下代码示例

#include <iostream>
using namespace std;
class R {
public:
    R(int r1, int r2) {
        a = r1;
        b = r2;
    }
    void print();
    void print() const;
private:
    int a;
    int b;
};
void R::print() {
    cout << "nORMal print" << endl;
    cout << a << ", " << b << endl;
}
void R::print() const {
    cout << "const print" << endl;
    cout << a << ", " << b << endl;
}
int main() {
    R a(5, 3);
    a.print();
    const R b(6 ,6);
    b.print();
    return 0;
}
// output
normal print
5, 3
const print
6, 6

这里也是建议能加 const 的时候就加。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

--结束END--

本文标题: C++成员函数中const的使用详解

本文链接: https://www.lsjlt.com/news/142306.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++成员函数中const的使用详解
    目录修饰入参值传递址传递const修饰入参修饰返回值修饰函数总结const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用...
    99+
    2022-11-13
  • C++成员函数中const如何使用
    本篇内容介绍了“C++成员函数中const如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!修饰入参首先我们要明白在C++中调用函数时存...
    99+
    2023-06-29
  • C++中类的默认成员函数详解
    目录一、构造函数二、析构函数三、拷贝构造函数四、赋值函数(赋值运算符重载)总结C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声明)—&md...
    99+
    2022-11-13
  • C++类中const修饰的成员函数及日期类怎么使用
    这篇文章主要介绍“C++类中const修饰的成员函数及日期类怎么使用”,在日常操作中,相信很多人在C++类中const修饰的成员函数及日期类怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++类中co...
    99+
    2023-07-05
  • C++中成员函数和友元函数的使用及区别详解
    为什么使用成员函数和友元函数 这个问题至关重要,直接影响着后面的理解: 程序数据: 数据是程序的信息,会受到程序函数的影响。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一...
    99+
    2022-11-13
  • C++的静态成员变量和静态成员函数详解
    目录一.static修饰变量二.static修饰函数三.static在类中使用1.创建与初始化 2.使用问题 3.在public、private下static变量使用 四.class...
    99+
    2022-11-12
  • C++类中的六大默认成员函数详解
    在C++中,当你去创建一个类的时候,即便这个类是空类,也会自动生成下面6个默认成员函数,在本篇博客中,我将逐一分析下面6个默认成员函数。 构造函数 构造函数并不是去构造函数的函数,...
    99+
    2022-11-12
  • C++类中六个默认的成员函数详解
    目录浅谈构造函数析构函数拷贝构造函数赋值重载函数const成员函数取地址及const取地址重载函数深挖 构造函数拷贝构造函数赋值运算符重载函数总结浅谈 先来说一下“this...
    99+
    2022-11-12
  • 详解C++中类的六大默认成员函数
    目录一、类的默认成员函数二、构造函数Date(形参列表)1、构造函数的函数名和返回值2、构造函数的调用3、构造函数的重载4、系统生成的默认构造函数5、系统生成的默认构造函数的作用6、...
    99+
    2022-11-13
    C++类默认成员函数 C++类六大默认成员函数 C++类成员函数
  • C++类中const修饰的成员函数及日期类小练习
    目录一.const修饰类的成员函数1.问题引出:2.问题分析3.const修饰类的成员函数 二. 类的两个默认的&运算符重载三. 日期类小练习 总结 一....
    99+
    2023-01-28
    C++ const函数 C++中const C++ const成员函数
  • C++类的静态成员变量与静态成员函数详解
    目录1、类的静态成员变量2、静态成员函数总结1、类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成...
    99+
    2022-11-12
  • C/C++编程中const的使用详解
    目录1 概述:const和define的区别2. 修饰局部变量3. 常量指针与指针常量4. 修饰函数的参数5. 修饰函数的返回值6. 修饰全局变量总结1 概述:const和defin...
    99+
    2022-11-13
  • C++静态成员函数和this指针详解
    目录静态成员1.静态成员变量2.静态成员函数成员变量和成员函数分开存储this 指针空指针访问成员函数总结静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态...
    99+
    2022-11-12
  • C++中的成员函数和友元函数怎么使用
    成员函数是定义在类中的函数,它可以访问类中的成员变量和其他成员函数。成员函数使用类的对象来调用,并且隐式地访问该对象的成员。友元函数...
    99+
    2023-08-16
    C++
  • C++特殊成员函数以及其生成机制详解
    目录前言默认构造函数数据成员初始化析构函数拷贝操作移动操作总结 前言 在C++中,特殊成员函数指的是那些编译器在需要时会自动生成的成员函数。C++98中有四种特殊的成员函数...
    99+
    2022-11-13
  • C++中如何使用成员函数指针
    C++中如何使用成员函数指针,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一个成员函数的指针指向类中的一个成员函数,并和以前有相同的参数,声明如下:float (...
    99+
    2023-06-17
  • C++中的类成员函数当线程函数
    目录类成员函数当线程函数解决方法一解决方法二解决方法三类成员函数作为多线程的入口类成员函数当线程函数 C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该...
    99+
    2022-11-13
    C++类成员函数 C++线程函数 C++成员函数
  • C++内联成员函数怎么使用
    本篇内容主要讲解“C++内联成员函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++内联成员函数怎么使用”吧!什么是内联函数:内联函数是C++的一个增强功能,可以减少程序的执行时间。...
    99+
    2023-06-22
  • C++中类的默认成员函数怎么用
    这篇文章主要介绍了C++中类的默认成员函数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声...
    99+
    2023-06-29
  • C++11 成员函数作为回调函数的使用方式
    目录C++11成员函数作为回调函数使用示例1示例2类成员函数作为回调函数的方法及注意点类成员函数当回调函数的方法为什么回调函数必须为静态函数?类的静态成员函数如何访问非静态成员?C+...
    99+
    2022-11-13
    C++11 成员函数 C++11 回调函数 使用回调函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作