精华内容
下载资源
问答
  • const函数
    万次阅读
    2016-05-01 17:04:52
    class EX{
    	public:
    		void constFunction() const;
    };
    

    如上所示,通过将类成员函数声明为const,以表示这个函数不可以修改类中的成员变量
    建议将不可以修改数据成员的函数声明为const,如果在编写const成员函数时,不慎修改了数据成员, 或者调用了其他的非const函数,则此时编译器会指出错误,这样做提高了程序的健壮性。

    在相同的函数参数及相同的名字的情况下,const函数与非const函数可以构成重载函数,但是const成员函数不能改变任何的非静态变量

    const函数与非const函数的调用规则

    • const对象默认调用const成员函数,非const对象默认调用非const成员函数;
    • 在同时存在const函数和非const重载函数的前提下,若非const对象想调用const成员函数,则需要显示的转化,例如(const Student&)obj.getAge();
    • 若const对象想调用非const成员函数,同理进行强制类型转换const_cast < Student&>(constObj).getAge();(注意constObj一定要加括号)

    当类中只有一种函数存在的情况

    • 非const对象可以调用const成员函数或者非const成员函数
    • const对象只能调用const成员函数,若直接调用非const成员函数编译器会报错。
    更多相关内容
  • const函数

    千次阅读 2022-01-12 15:24:43
    const是衡量一个程序员是否老道的一个标准,除了修饰变量之外,还可以修饰函数,主要有以下几种形式 const int& fun(int& a); //修饰返回值 int& fun(const int& a); //修饰形参 int& fun(int...

    const是衡量一个程序员是否老道的一个标准,除了修饰变量之外,还可以修饰函数,主要有以下几种形式

    const int& fun(int& a); //修饰返回值
    int& fun(const int& a); //修饰形参
    int& fun(int& a) const{} //const成员函数

    const返回值

    这种多是修饰返回值是引用类型的情况下,为了避免返回值被修改的情况。

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

    举个例子:

    #include<iostream>
    
    using namespace std;
    
    class A
    {
    private:
        int data;
    public:
        A(int num):data(num){}
        ~A(){};
        int& get_data()
        {
            return data;
        }
    };
    
    int main()
    {
        A a(1);
        a.get_data()=3;
        cout<<a.get_data()<<endl; //data=3
        return 0;
    }

    那么这个时候为了避免成员函数被修改就需要加上const关键字,这个时候如果试图改变返回值是不允许的:

    #include<iostream>
    
    using namespace std;
    
    class A
    {
    private:
        int data;
    public:
        A(int num) :data(num) {}
        ~A() {};
         const int& get_data()
        {
            return data;
        }
    };
    
    int main()
    {
        A a(1);
        //a.get_data() = 3;
        cout << a.get_data() << endl; //data=3
        return 0;
    }
    error: cannot assign to return value because function 'get_data' returns a const value

     需要指出的是,如果函数的返回类型是内置类型,比如 int 、char 等,修改返回值本身就是不合法的!所以 const 返回值是处理返回类型为用户定义类型的情况。

    const 修饰实参

    多数情况下,我们都会选择 pass by reference,这样可以节省内存,并且可以起到改变实参的目的。不过有的时候我们并不希望改变实参的值,就要加上const关键字。

    这个不仔细说了,很容易理解。不过在构造接口之前一定要思考函数是否会修改参数,如果不会修改的话一定要加上const,这个是代码写的是否大气的一个标准(侯捷大师原话。。)

    const成员函数

    这种情况多数情形下很容易被忽视,其实这个是非常重要的一个内容。

    设想这样一种场景:

    const String str("hello world");
    str.print();

    假设在string类中有一个成员函数叫做print, 如果这个函数在定义的时候没有加上const 关键字,上述的代码是无法通过编译的,下面举个具体的例子:

    #include<iostream>
    
    using namespace std;
    
    class A
    {
    private:
        int data;
    public:
        A(int num):data(num){}
        ~A(){};
        int& get_data()
        {
            return data;
        }
    };
    
    int main()
    {
        const A a(1);
        a.get_data();
        return 0;
    }

    毫不意外的出错了:

    error: 'this' argument to member function 'get_data' has type 'const A', but function is not marked const。

    我们敏锐的发现了一个“this"指针,这个从何说起?

    其实任何成员函数的参数都是含有this 指针的,好比py中的 self ,只不过c++中规定全部不写这个参数, 其实这个参数就是对象本身, 即谁调用成员函数, 这个 this 就是谁!

    我们的例子中 a 是一个const 对象, 它调用了 get_data 方法,所以函数签名应该是:

    get_data(a){}

    而 a是一个 const 对象, 我们默认的 this 指针并不是 const 类型,所以参数类型不匹配, 编译无法通过!

    这下我们终于清楚了, const 修饰成员函数, 根本上是修饰了 this 指针。

    下面摘取侯捷PPT中的一张图片, 介绍了string源码中的一些片段:

    这两个成员函数都重载了[]符号,而前者是const ,不必担心修改参数, 而后者由于引用计数的问题, 多个变量指向一个内存, 一旦修改就必须copy后修改,cow。

    需要指出的是, 这俩函数确实是不同的函数, 加了这个const 之后函数签名是不一样的。

    有如下的规则:

    preview

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

    展开全文
  • Const,Const函数,Const变量,函数后面的Const[参考].pdf
  • 在普通的非 const成员函数中,this的类型是一个...关键字:Const,Const函数,Const变量,函数后面的Const 看到 const关键字,C++程序员首先想到的可能是 const常量。这可不是良好的条件反射。如果只知道用 const定义

    在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针。可以改变this所指向的值,但不能改变 this所保存的地址。

    在 const成员函数中,this的类型是一个指向 const类类型对象的 const指针。既不能改变 this所指向的对象,也不能改变 this所保存的地址。

    关键字:ConstConst函数Const变量函数后面的Const

    看到 const关键字,C++程序员首先想到的可能是 const常量。这可不是良好的条件反射。如果只知道用 const定义常量,那么相当于把火药仅用于制作鞭炮。

    const更大的魅力是它可以修饰函数的参数返回值,甚至函数的定义体

    const 是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Useconst whenever you need”。

    1、用const修饰函数的参数

    如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能。const只能修饰输入参数:
    如果输入参数采用“指针传递”,那么加 const修饰可以防止意外地改动该指针,起到保护作用。

    例如StringCopy函数:

    void StringCopy(char*strDestination, const char *strSource);

    其中strSource是输入参数,strDestination是输出参数。给 strSource加上 const修饰后,如果函数体内的语句试图改动 strSource的内容,编译器将指出错误。

    如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加 const修饰。

    例如 不要将函数 voidFunc1(int x) 写成 voidFunc1(const int x)。同理不要将函数voidFunc2(A a) 写成 voidFunc2(const A a)。其中A为用户自定义的数据类型

    1>对于非内部数据类型的参数而言,像 voidFunc(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。

    为了提高效率,可以将函数声明改为voidFunc(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数voidFunc(A &a) 存在一个缺点:

    “引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为voidFunc(const A &a)。

    2>以此类推,是否应将 voidFunc(int x) 改写为 voidFunc(const int&x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。

    3>问题是如此的缠绵,我只好将“const&”修饰输入参数的用法总结一下。
    对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将voidFunc(A a) 改为voidFunc(const A &a)。
    对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(int x) 不应该改为voidFunc(const int &x)。

     

    2、用const修饰函数的返回值

    如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数:

    constchar * GetString(void);
    如下语句将出现编译错误:
    char*str = GetString();
    正确的用法是
    constchar *str =GetString();

    如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。

    例如不要把函数 intGetInt(void) 写成 constint GetInt(void)。
    同理不要把函数 AGetA(void) 写成 constA GetA(void),其中A为用户自定义的数据类型。
    如果返回值不是内部数据类型,将函数 AGetA(void) 改写为 constA &GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
    函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。

    例如:

    classA
    {
    A & operate = (const A &other); // 赋值函数
    };
    Aa, b, c; // a, b, c 为A的对象
    
    a= b = c; // 正常的链式赋值
    (a= b) = c; // 不正常的链式赋值,但合法

    如果将赋值函数的返回值加const修饰,那么该返回值的内容不允许被改动。上例中,语句a= b = c 仍然正确,但是语句(a= b) = c 则是非法的。

     

    3、const 成员函数

    任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。

    classStack
    {
    public:
        void Push(int elem);
        int Pop(void);
        intGetCount(void) const; // const 成员函数
    private:
        intm_num;
        int m_data[100];
    };
    
    int Stack::GetCount(void)const
    {
        ++ m_num; // 编译错误,企图修改数据成员m_num
        Pop();// 编译错误,企图调用非const函数
        returnm_num;
    }

    const 成员函数的声明看起来怪怪的:const关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。
    关于Const函数的几点规则:

    1>const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
    2>const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
    3>const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
    4>然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的.

     

    补充:

    const放在后面有什么意思?
    一个函数
    AcGePoint3dstartPoint() const;
    const放在后面跟前面有区别么

    ==>
    准确的说const是修饰this指向的对象的
    譬如,我们定义了

    classA{
    public:
        f(int);
    };

    这里f函数其实有两个参数,第一个是A*const this, 另一个才是int类型的参数
    如果我们不想f函数改变参数的值,可以把函数原型改为f(constint),但如果我们不允许f改变this指向的对象呢?因为this是隐含参数,const没法直接修饰它,就加在函数的后面了,表示this的类型是constA *constthis。
    const修饰*this是本质,至于说“表示该成员函数不会修改类的数据。否则会编译报错”之类的说法只是一个现象,根源就是因为*this是const类型的。

     

    转自:https://www.cnblogs.com/xiaodangxiansheng/p/11008369.html    (建议去看这篇,因为他也是转载的,他转载的那篇原文不建议看,他说眼睛会瞎~)

    展开全文
  • c++ const对象和const函数

    千次阅读 多人点赞 2018-09-09 20:46:44
    关于const对象和const函数的分析 基本知识: 1.如果一个成员函数不对对象的任何成员数据的进行修改(最常见的为打印成员信息的函数),那么我们可以将这个成员函数设置为const函数,以保护对象数据。如void print()...

    关于const对象和const函数的分析

    基本知识:

    1.如果一个成员函数不对对象的任何成员数据的进行修改(最常见的为打印成员信息的函数),那么我们可以将这个成员函数设置为const函数,以保护对象数据。如void print()const    对成员函数()后加上const限定  如果在该函数里面修改对象的成员数据,则编译器就会报错。

    2.const对象的成员数据(mutable 和const_cast<>()转换例外)的值是无法修改的,而一般的非const函数可以修改对象的成员数据的值,故而  对const 对象调用非const函数就会报错(额,对非const对象调用const函数当然是ok的)

    如下代码所示

    #include<iostream>
    
    using namespace std;
    
    class cat{
        
    private:
        
        int age;
        
        int size;
        
    public:
        
        cat(int age=0,int size=0):age(age),size(size){}
        
        //    void print()const{//const函数
        
        //        cout<<"i am const"<<endl;
        
        //        cout<<"age"<<age<<endl;
        
        //        cout<<"size"<<size<<endl;
        
        //    }
        
        void print(){
            
            cout<<"i am not const"<<endl;
            
            cout<<"age"<<age<<endl;
            
            cout<<"size"<<size<<endl;
            
        }
        
        //      void show()const{//作 测试对象成员数据 用
        
        //      cout<<"age"<<age<<endl;
        
        //      cout<<"size"<<size<<endl;
        
        // }
        
        
        
        
        
    };
    
    int main(){
        
        const cat zjc(1,1);
        
        cat liujiao(2,2);
        
        zjc.print();//报错
        
        liujiao.print();//ok
        
        return 0;
        
    }

    const 对象zjc对于调用zjc.print()报错   如下

    Member function 'print' not viable: 'this' argument has type 'const cat', but function is not marked const

    而非const对象liujiao.print()就是ok的

    那么如何实现   对const zjc 的调用print  ???

    方法一: 对print重载    由于const这个标识符作也可以为区分重载的标志(注意只有类的成员函数才有这个特殊的const限定)   故而当我们将上面的  void print()const的函数的注释撤销后

    再次执行   就会有如下的执行结果

    i am const

    age1

    size1

    i am not const

    age2

    size2

    可以看到他他对zjc 和 liujiao 分别调用了不同的print函数版本   -------这就是他们依照const实现的重载(const函数只是作为成员函数才有const ,注意友元函数和静态成员都没有没有)   当然你将 这个函数void print()抹掉    zjc 和liujiao 就调用 void print()const;这个函数

    i am const

    age1

    size1

    i am const

    age2

    size2

    方法二: 用const_cast<>()方法将zjc转化为非const 调用 void print();

    将main()函数改为如下

    int main(){
        
        const cat zjc(1,1);
        
        cat liujiao(2,2);
        
        (const_cast<cat&>(zjc)).print();// 注意对zjc加()和在cat后加上引用
        
        liujiao.print();//ok
        
        return 0;
        
    }

    输出://发现他们都可以调用void print();

    i am not const

    age1

    size1

    i am not const

    age2

    size2

    注意 const_cast传递的是一个自身的引用值 也就是说 他在const_cast<>()转化后再调用void print();是可以改变自己的成员数据

    测试  在void print();函数的第一句将上 age = 1000;   再在main的最后调用zjc.show() 测试值是否发生改变

    输出:结论const_cast<>转化后传入非const函数 可以改变const对象的值

    i am not const

    age1000

    size1

    i am not const

    age1000

    size2

    age1000  //可以发现const zjc的age已经被修改

    size1

    第一次写博客,有点小紧张~~~希望得到大家的支持(当然刚写博客才发现这个blog的编辑页面有点儿~~~~~下次改进!)


     

    展开全文
  • c++ const函数返回值

    千次阅读 2019-07-23 13:20:30
    c++中const可用于修饰方法 1. 第一种情况:const位于方法参数列表后,如 void test() const; 此种情况表明,此方法不会改变调用对象的状态,保证了调用对象的常量性 2. 第二种情况:const 位于返回类型前 此...
  • const函数和inline内联

    千次阅读 2018-07-01 09:10:47
    const并不陌生了 ... 首先介绍的是这个const最特殊的一点,就是他是写在哪的,在他修饰变量的时候,是在写某个变量的前边,但是在修饰函数的时候却写在函数的后边,看起来很怪。 这是我...
  • const参数,const返回值与const函数

    千次阅读 2014-11-12 18:14:17
    在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的: ... const 这个关键字经常出现在函数的定义中,而且会出现在不同的位置,比如:  int strcmp (const char *str1,cons
  • C++如何在const函数修改成员变量的值

    千次阅读 2018-04-22 17:13:18
    C++如何在const函数修改成员变量的值在C++,总所周知,c++不允许在const函数直接修改成员变量的值,想要达到此目的,有两种方式: 使用mutable关键字 造一个假的this去操作成员变量 1.第一种方法很简单,只需要在...
  • c++中 运算符重载 const 函数

    千次阅读 2018-11-10 14:57:10
    本篇文章主要内容是关于运算符重载,然后在最后提了一下 const修饰函数时的状况。后面会补上一个日期类的定义。 文章目录概要赋值运算符的重载= 号的重载i++ 和 ++i 前置与后置++的区别const 修饰函数 赋值运算符的...
  • Const,Const函数,Const变量,函数后面的Const Const,Const函数,Const变量,函数后面的Const
  • const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序...
  • const成员函数

    千次阅读 多人点赞 2020-08-11 15:02:46
    const修饰成员函数的时候,const需要放在成员函数的后面,不能放在一开始,如果放在一开始的话,那么const其实是在修饰成员函数的返回值,而不是在修饰成员函数const成员函数中不能修改成员变量 普通成员函数中...
  • C++ const成员函数(常成员函数

    千次阅读 2019-10-28 17:15:03
    如果一个成员函数不对对象的任何成员数据的进行修改(最常见的为打印成员信息的函数),那么我们可以将这个成员函数设置为const函数,以保护对象数据。如果在该函数里面修改对象的成员数据,则编译器就会报错。 3 ...
  • C++的const成员函数

    千次阅读 2021-03-09 23:51:05
    假设我们有一个银行卡类,卡提供查询余额的成员函数,那我们肯定不能让这个函数对卡的任一信息做修改,这时候就可以使用const函数。 实例 我们来看一下银行卡的例子,查询余额是内部公开接口,正常情况不允许修改...
  • C++ std::mutex 与 const函数

    千次阅读 2017-04-26 20:13:36
    写一个队列需要在其函数之间做同步,首选了std::lock_guard通过RAII的方式来优雅实现确保释放。code很简单,Class自己有一个成员变量mutex, 相关函数在调用前使用其作为构造参数来构造lock_guard即可。 编译时遇到了...
  • const函数

    千次阅读 2019-04-22 21:27:41
    const的用法,特别是用在函数前面与后面的区别! const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针。可以改变this所指向的值,但不能改变 this所保存...
  • 引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起。...1、 const对象的指针为const classA* this,因此传入非const成员函数时编译器报错(类型不匹配,无法从const 指针转换为非const指针);但传入co...
  • 1)const对象可以调用非const成员函数吗? 答:不能。const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可能会将const对象进行修改。 2)非...
  • const成员函数内可以调用其它的非const成员函数吗? 非const成员函数内可以调用其他的const成员函数吗? 二、实践出真知 实践发现: 1、const对象可以调用const成员函数 2、const对象不能调用非const成员函数 3、...
  • const 函数

    千次阅读 2010-04-09 16:21:00
    const 修饰函数的返回值如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数const char * GetString(void);...
  • Const函数前后的区别

    千次阅读 2021-07-21 18:49:09
    const放在函数后主要是限制类中的成员函数const放在函数前是限制函数返回类型为指针时通过指针对返回值的修改。 const函数前: Const函数前实际上是约束函数的返回的,表明返回的值不能做左值,实际上就是...
  • C++成员函数后的const

    2020-12-22 21:40:08
     (static函数不能有const修饰符,const 成员函数是包含this指针的,这明显不被static函数允许)  3.const 成员函数不能修改对象的任意非静态成员  4.const 成员函数不能调用非const 成员函数  二、另外,...
  • 在C++中,函数名前的const函数名后的const的区别

    千次阅读 多人点赞 2018-04-18 09:42:18
    首先要知道函数名后面加const只能用于成员函数。int const func(); //合法,相当于const int func();int func2() const; //非法,对函数const限定词只能用于成员函数在成员函数中,const加在函数名前和后也是有...
  • const函数前后的意义

    千次阅读 2020-10-27 20:34:25
    const函数前后的意义 一、const函数后面 1、只允许在类的非静态成员函数后面加const;(加到非成员函数 或 静态成员后面会产生编译错); 2、后面加的const其实是对隐含传入参数this指向类对象的修饰,即 *this 是...
  • C++ const修饰函数函数参数、函数返回值

    万次阅读 多人点赞 2018-05-22 11:41:09
    转载自:https://blog.csdn.net/my_mao/article/details/22872149const修饰函数在类中将成员...因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。[cp...
  • c++函数const

    千次阅读 2018-12-05 11:46:48
    一个对象通过引用的方式传到函数f中,而函数f又不会通过修改对象的数据成员的值改变该对象的状态,那么最好将f的参数标记为const,如void setName( const string&amp;amp; n){ name = n;} 如果一个成员函数不...
  • C++ const函数返回值必须为const引用

    千次阅读 2013-04-30 15:15:31
    编译正确代码: #include #include #include using namespace std; class T{ public: T(string p) ... const char & operator [](int pos) const { return ptext[pos]; } string ptext;
  • const修饰的类成员函数称之为const成员函数const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在成员函数中不能对类的任何成员进行修改。 1.const对象可以调用非const成员函数吗? 2.非const对象...
  • const对象只能调用const成员函数

    千次阅读 2019-07-13 22:38:52
    常量成员函数 (const member function), 可读取类中的数据成员,但不能修改。利用这个特性来对成员函数加以修饰。 const对象是不可以调用类中的非const成员函数。原因之后解释。 假设现在有如下代码: class test{...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,504,753
精华内容 601,901
关键字:

const函数