C++类成员函数后面加const问题

目录
  • C++类成员函数后面加const
  • C++const四种用法
    • 一、用const修饰函数参数
    • 二、用const修饰局部或全局变量
    • 三、用const修饰函数返回值
    • 四、用const修饰函数

C++类成员函数后面加const

如果类的成员函数后面加了const关键字,说明这个函数是不能改变类中的成员变量的。

如果在编写该函数会修改类中的成员变量,编译时会出错,并且也提高了程序的可读性,当我们看到函数后面有const的话就知道这个函数是不会修改类中数据的。

注意:

1、只能加在非静态成员函数后面,加在静态成员函数和普通函数后面会编译出错。

2、【例外】如果一个类中有mutable 修饰的成员变量,此类函数是可以修改的。

3、【实现】其实就是在该类函数的this隐式参数的类型为const。

3、const对象只能调用此类函数,非const对象没有这个限制,所以为了让const对象调用等多的成员函数,如果一个成员函数不会修改类中数据的话最好在后面加const。

C++const四种用法

一、用const修饰函数参数

1、修饰指针,可以防止指针被修改

void test(const ClassA* a)
{
    ClassA **b = &a; //编译错误,对const指针取地址,需要用一个指向const指针的指针指向它
    const ClassA **c = &a; //正确,对const指针取地址,需要用一个指向const指针的指针指向它
    ClassA *d = a; //编译错误,不能将const指针转普通指针
    (*b) = new ClassA();
}
void test2(ClassA *a)
{
    ClassA **b = &a;
    (*b) = new ClassA();
}

2、修饰普通类型,说明这个参数不应该被修改

void test(const int a)
{
        a++; //编译错误
        int* c= &a; //编译错误,不能取地址,否则就具备了改a的能力
        int b = a;  //不用强转也可以编译通过,但还是没能力改a的值        
}

3、修饰引用类型,参数的值不能被修改, 也就失去了引用类型的效果,但传递对象时,可以起到不copy对象的目的。

void test(const int& a)
{
    a = 2; //编译错误,不能修改const引用类型的值
}
void test(const ClassA& a) //传递的时候,不需要copy一个新的ClassA,又能保护a
{
    
}

二、用const修饰局部或全局变量

功能类似函数参数

三、用const修饰函数返回值

说明函数的返回类型是const的,功能类似于函数参数

const int test()
{
    int a = 1;
    return a;
}

四、用const修饰函数

说明函数不会修改成员变量的值

class ClassA
{
public:
    int b;
    int test() const
    {
        b = 3; //编译错误,const修饰的函数不能修改类成员变量的值
        return b;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C/C++中CONST用法总结(推荐)

    1.修饰常量时: const int temp1; //temp1为常量,不可变 int const temp2; //temp2为常量,不可变 2.修饰指针时: 主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量: const int *ptr; //*ptr为常量: int const *ptr; //*ptr为常量: int* const ptr; //ptr为常量: const int * const ptr; //*ptr.ptr均为常量: 3.const修饰

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

    目录 修饰入参 值传递 址传递 const修饰入参 修饰返回值 修饰函数 总结 const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用法. 修饰入参 首先我们要明白在C++中调用函数时存在两种方法,即传递值和传递引用. 值传递 值传递时,调用函数时会创建入参的拷贝,函数中的操作不会对原值进行修改,因此这种方式中不需要使用 const 来修饰入参,因为其只是对拷贝的临时对象进行操作. 址传递 传递地址时函数中的操作实际上是直接对原来的

  • c++关键字const的用法详解

    目录 C语言const的用法 1.指向常量的指针变量 const int *p指针指向int a: 2.常指针(常地址) int * const p指针指向int a; 3.指向常量的常指针 const int * const p指针指向int a; 4.其他情况 4.1 int *p指针指向const int a(报错) 4.2const int *p指针指向const int a c++语言const的用法 常数据成员 常成员函数 常对象 指向常对象的指针变量 指向对象的常指针 总结 C语言

  • C++类成员函数后面加const问题

    目录 C++类成员函数后面加const C++const四种用法 一.用const修饰函数参数 二.用const修饰局部或全局变量 三.用const修饰函数返回值 四.用const修饰函数 C++类成员函数后面加const 如果类的成员函数后面加了const关键字,说明这个函数是不能改变类中的成员变量的. 如果在编写该函数会修改类中的成员变量,编译时会出错,并且也提高了程序的可读性,当我们看到函数后面有const的话就知道这个函数是不会修改类中数据的. 注意: 1.只能加在非静态成员函数后面,加

  • c++中string类成员函数c_str()的用法

    1.string类成员函数c_str()的原型: const char *c_str()const;//返回一个以null终止的c字符串 2.c_str()函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式; 3.操作c_str()函数的返回值时,只能使用c字符串的操作函数,如:strcpy()等函数.因为,string对象可能在使用后被析构函数释放掉,那么你所指向的内容就具有不确定性.

  • C++中使用function和bind绑定类成员函数的方法详解

    定义一个普通的类 class Test1{ public: void fun(int val){ cout<<"hello world "<<val<<endl; } }; 开始第一个测试 int main(){ Test1 t; function<void(int)> pf = std::bind(&Test1::fun,t,2); pf(4); // return 0; } 输出的值是2,说明pf传进去的4并没有什么用,在bi

  • C++中与输入相关的istream类成员函数简介

    eof 函数 eof是end of file的缩写,表示"文件结束".从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(真),否则为0(假). [例] 逐个读入一行字符,将其中的非空格字符输出. #include <iostream> using namespace std; int main( ) { char c; while(!cin.eof( )) //eof( )为假表示未遇到文件结束符 if((c=cin.get( ))!=' ') //

  • 类成员函数的重载、覆盖与隐藏之间的区别总结

    答案:a.成员函数被重载的特征:(1)相同的范围(比如在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无. b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字. c."隐藏"是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同.此时,不论有无virtual关键字,基类的函数将被隐藏(注

  • C++类中const修饰的成员函数及日期类小练习

    目录 一.const修饰类的成员函数 1.问题引出: 2.问题分析 3.const修饰类的成员函数 二. 类的两个默认的&运算符重载 三. 日期类小练习 总结 一.const修饰类的成员函数 1.问题引出: 给出一段简单的代码 代码段: #include <iostream> using std::cin; using std::cout; using std::endl; class Date1 { public: Date1(int year = 2000) 类的全缺省构造函数(可

  • C++类中六个默认的成员函数详解

    浅谈 先来说一下"this指针": C++中通过引入this指针解决该问题,暨:C++编译器给每个"非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问,只不过所有的操作对用户是透明的,暨用户不需要来传递,编译器自动完成. 说了这么多其实编译器在生成程序时获取对象首地址的信息.然后将获取的对象的首地址存放在了寄存器中,成员函数的其它参数都是存放在栈中.而this指针参数则是

  • C++类的返回值是*this的成员函数问题

    目录 C++类返回值是*this成员函数 1 返回值是左值 2 const成员函数的返回值 对C++类成员返回语句return *this的理解 C++类返回值是*this成员函数 当C++类的成员函数其返回值是*this时,表示返回值是调用该成员函数的变量的引用. 例如: class A { public:   A& func1() {   return *this;   }   int i{0}; } 此时,类A的成员函数func1的返回值是*this,该成员函数的返回值类型是A&.

  • C++知识点之成员函数中const的用法

    目录 修饰入参 值传递 址传递 const修饰入参 修饰返回值 修饰函数 const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用法. 修饰入参 首先我们要明白在C++中调用函数时存在两种方法,即传递值和传递引用. 值传递 值传递时,调用函数时会创建入参的拷贝,函数中的操作不会对原值进行修改,因此这种方式中不需要使用 const 来修饰入参,因为其只是对拷贝的临时对象进行操作. 址传递 传递地址时函数中的操作实际上是直接对原来的值进行

随机推荐