精华内容
下载资源
问答
  • c++常对象和常成员函数详解

    千次阅读 2017-07-15 21:52:19
    常对象常对象是指该对象在其生命周期内,其所有的数据成员的值都不能被改变;定义对象时加上关键字const,该对象就是...1. 常对象只能调用常成员函数,不能调用普通成员函数 (除了隐式调用析构函数和构造函数),成员

    常对象

    常对象是指该对象在其生命周期内,其所有的数据成员的值都不能被改变;定义对象时加上关键字const,该对象就是常对象,其一般形式如下:

    类名 const 对象名[(实参类别)];
    或者
    const 类名 对象名[(实参类别)];

    形如:const CComplex num;

    需要特别说明的是:

    1. 常对象只能调用常成员函数,不能调用普通成员函数
    (除了隐式调用析构函数和构造函数),常成员函数是常对象的唯一对外接口;
    2. 现在编译系统只检查函数的声明,只要发现调用了常对象的成员函数,而且该函数未被声明为const,编译阶段就报错
    3. 常对象在被定义时需要被初始化;

    类设计源码:

    class CComplex
    {
    public:
        //普通构造函数
        CComplex(int nReal, int nImag):m_nReal(nReal),m_nImag(nImag)
        {
            cout << "common constructor function" << endl;
        }
        int GetRealNum()
        {
            return m_nReal;
        }
    private:
        int m_nReal;
        int m_nImag;
    };
    //常对象
    const CComplex num1(1,1);
    //error:不能将“this”指针从“const CComplex”转换为“CComplex &”
    int nReal = num1.GetRealNum();

    编译错误的原因是,目前该函数还是普通函数,它可能会修改成员变量;为了常对象能调用GetRealNum函数,应该将该函数设计成常成员函数;

    形如int GetRealNum() const;

    常数据成员

    如果我们希望在创建对象后,该对象的某个数据成员就保持不变,我们可以将这个数据成员设置为常数据成员;常数据成员只能通过构造函数初始化列表进行初始化,其他形式的函数均不能进行数据的赋值;

    常成员函数

    若将成员函数设置为常成员函数,则只能引用本类中的数据成员,而不能修改它;常成员函数可以引用const数据成员,也可以引用非const的数据成员;常成员函数的一般形式为:

    类型名 函数名(形参列表) const

    这里的const关键字是函数类型的一部分,在函数声明和函数定义时都要带const关键字,否则被编译器认为是不同的两个函数,但是在函数调用的时候不必带const;

    形如:

    //声明和定义一起实现
    int GetRealNum() const
    {
       return m_nReal;
    }

    函数API设计总结

    (1) 若我们定义了一个常对象,则指向这个常对象的指针变量或者对象引用也需要是const类型的;一般形式如下:

    const 类型名* 指针变量名;
    const 类型名& 引用名;

    (2)常对象的唯一对外接口是常成员函数;
    (3)为了节约时间开销和时间开销,一般将函数形参定义为指针或者引用类型;
    (4)若不希望传入的实参对象被修改,应该将形参定义指向常对象的指针变量或者引用;

    根据以上几点知识,我们进行类设计时,最好遵循以下两点结论:

    1.将不涉及数据成员修改的函数定义为常成员函数

    形如: int GetRealNum() const

    2.当发生函数调用时,希望传入的实参对象不被修改,应当将形参定义为const类型的指针或者引用;这个实参可以是const类型的,也可以是非const类型的,函数接口兼容性更加,形如:

    static void TransByPointer(const CComplex* obj)
    {
        cout << "TransByPointer \n" << endl;
    }
    
    static void TransByRefence(const CComplex& obj)
    {
        cout << "TransByRefence \n" << endl;
    }

    下面给出const相关知识的具体调用说明:

    数据成员 非const的普通成员函数 const成员函数
    非const的普通数据成员 可以引用,也可以改变值 可以引用,但不可以改变值
    const数据成员 可以引用,但不可以改变值 可以引用,但不可以改变值
    const对象 不允许 可以引用,但不可以改变值
    展开全文
  • C++ 常对象和常成员函数

    千次阅读 2016-10-03 09:46:52
    常对象:不能修改的对象。“只读”。使用const声明,声明时必须初始化。 ...常成员函数 只能访问数据成员而不能设置或修改数据成员。 返回类型 函数名 (形参表)const; const成员函数只能调用c

    常对象:不能修改的对象。“只读”。使用const声明,声明时必须初始化。

    格式: const  类名  对象名 (初始化列表)

                 类名  const  对象名 (初始化列表)

    const Point p(100,200); 


    常成员函数

    只能访问数据成员而不能设置或修改数据成员。

    返回类型  函数名 (形参表)const;

    const成员函数只能调用const成员函数(C++不允许const成员函数调用非const成员函数,因为非const函数可能会设置或者修改数据成员的值)

    const对象只能调用const成员函数,也是同理。

    但const成员函数的调用者可以是const的也可以是非const的。

    PS: 声明和定义const成员函数都必须加const,否则编译器会认为这是重载函数。


    常数据成员

    只读。只能通过构造函数设置,而且必须在初始化列表中进行初始化。

    展开全文
  • 【C++】 常对象数据成员、常成员函数总结

    千次阅读 多人点赞 2019-03-24 15:07:25
    普通数据成员在初始化列表和函数体中初始化均可。  ◆ PS:类的成员对象若要传入参数初始化,则必须在构造函数初始化列表进行;(成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。) 常对象  ...
    常数据成员

     ◆ 常数据成员必须进行初始化,并且不能被更新。

     ◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化;普通数据成员在初始化列表和函数体中初始化均可。

     ◆ PS:类的成员对象若要传入参数初始化,则必须在构造函数初始化列表进行;(成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。)

    常对象

     ◆ ⭐常对象可以调用常成员函数,不能调用非const成员函数;非const对象,可以调用普通成员函数和常成员函数。

     ◆ 常对象的成员函数不一定都是常成员函数;同样的常对象的数据成员不一定都是常数据成员。

     ◆ 常对象一旦初始化,常对象的数据成员便不允许修改,而不是说常对象的数据成员都是常数据成员。

     ◆ PS:定义常对象有两种方法,1. Point const a; 2. const Point a;(同样的,定义变量或指针时,const放前放后意义一样,如:1. const double a; double const a; 2. const int *p; int const *p; 但是定义指针常量时,只能用 int * const p;)

    常成员函数

     ◆ 常成员函数不更新对象的数据成员。

     ◆ 常成员函数的const关键字可以被用于参与对重载函数的区分。

     ◆ ⭐通常非const成员函数需要定义一个const版本的重载函数,以方便定义常对象后调用常成员函数。
      ◈ 如果常对象调用的常成员函数返回的是指向当前对象的指针(或返回的是当前对象),那么此常成员函数的声明的返回类型要加const,例如:

        ◊ 成员函数返回指向当前对象的指针
          const *Point fun1();    //非const成员函数的类内声明;
          const *Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;

        ◊ 成员函数返回指向当前对象
          const Point fun1();    //非const成员函数的类内声明;
          const Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;

        ◊ ⭐注意,如果一个类中声明以下4个重载函数:
          ① Point fun1();
          ② const Point fun1();
          ③ Point fun1() const;
          ④ const Point fun1() const;
         【解析】①和②是冲突的,因为无法区分仅按返回类型区分的重载函数;③和④是冲突的,也是因为无法区分仅按返回类型区分的重载函数。
         所以正确的重载函数搭配有3种:

          ◊ ①和③搭配:
            Point fun1();             //函数返回非const对象
            Point fun1() const;          //函数返回非const对象
           [解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是非const的Point类对象。

          ◊ ①和④搭配(这里把返回类型改为指针,因为常用):
            Point *fun1() {return this; };      //函数返回指向本对象的指针
            const Point *fun1() const { return this; };//函数返回指向本常对象的指针,第一个const说明返回的是指向常对象的指针,第二个const说明此函数是常函数

           [解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象(如return *this;)。

          ◊ ②和④搭配:
            const Point fun1();          //函数返回常对象
            const Point fun1() const;       //函数返回常对象
           [解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象。

           ②和③搭配:
            const Point fun1();
            Point fun1() const;
           [解析]虽然搭配合法,但是似乎不存在这种搭配。

    展开全文
  • c++ 常成员函数 常对象

    千次阅读 多人点赞 2014-06-17 13:30:17
    先明确几个概念: 1. 常对象只能调用常成员函数。 2. 普通对象可以调用全部成员函数

    先明确几个概念:

    1. 常对象只能调用常成员函数。

    2. 普通对象可以调用全部成员函数。

    3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
    4. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
    5. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
       在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
    6. 由于this并不是一个常规变量,所以,不能取得this的地址。

    如:

      

    #include <iostream>
    
    class A
    {
    public:
    	A():mValue(0)
    	{
    
    	}
    	void print() 
    	{
    		std::cout<<"hello";
    	}
    	int GetValue()
    	{
    		return mValue;
    	}
    	int GetValue()const
    	{
    		return mValue;
    	}
    
    private:
    	int mValue;
    };
    
    void test(A & const a)
    {
    
    }
    
    int main()
    {
    	
    	const A a;//const A* const this ;	
    	a.print(); //错误,将会提示 error C2662: “A::print”: 不能将“this”指针从“const A”转换为“A &”
    
    	test(a); //error C2664: “test”: 不能将参数 1 从“const A”转换为“A &”
    }


    由于a是const对象,所以a只能调用类A中的常成员函数。


    那么为什么会提示:“不能将this指针.......”的语句呢?

    因为对于c++的成员函数(当然不是静态成员函数),都会含有一个隐藏的参数,对于上例A中的int GetValue()函数,在编译后会变成:

    int GetValue(A * const this);  //不能修改this变量,但可以修改this指向的内容,即:this是常量指针。

    而对于int GetValue()const ,编译后是:

    int GetValue(const A* const this); 

    只所以this指针是const类型,因为在某次调用整个过程this指向都不允许改变(原因很简单,如果改变的话就不是这个对象调用的了)

    从编译后的结果看就很清楚了, 因为a是const,所以其this指针就对应: const A* const this ;

    而print函数被编译出来后对应的是void print(A* const this); 在进行参数匹配时, 所以就会提示 “不能将“this”指针从“const A ....."


    this指针的出现就解释了,所有类A的对象都是公用一套代码模版,为什么各个对象在调用成员函数的时候不会乱套。


    原来C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下,this指针是隐含存在的,也可以将其显示的表示出来(即如上例中的 this->mValue。不过this指针只能在类中使用)



    还有就是  this指针是一个const指针,不能再程序中修改它或给它赋值;



    展开全文
  • 常成员函数对象只是只读访问,不允许修改对象的成员变量,所以不能调用非常成员函数,因为,这些成员函数可能修改成员变量。 而普通成员函数当然可以调用常成员函数 class people  { private: char *...
  • 引用 形式—— const 类型 &对象名或变量名 ②常对象 ...3.常对象可以调用静态成员函数常成员函数,其实也可以调友元函数 (但是这里不对每一个具体展开了,就只是为了更加明白常对象是不
  • C++ 常数据成员、常成员函数和常对象

    千次阅读 多人点赞 2019-01-04 23:54:51
    ① 首先,常成员函数内部不允许进行数据成员的修改,但是可以在函数内部输出const数据成员与非数据成员! ② 其次,还可以区分同名构造函数,举个例子(如下): #include using namespace std; class ...
  • 在基本数据类型中有常量,类比到类类型中就是常对象,其实常量也是常对象常对象的声明方式:const类名 对象名;。常对象的数据成员不能被改变,...但是普通对象也可以访问常成员函数,在访问过程中,普通对象会被视
  • 1.成员变量:成员变量是用关键字const来声明的变量,const位于变量前或者类型前都一样,用const修饰的变量只能...注明:常成员函数只能通过构造函数的初始化表对其进行初始化,成员变量所在类中所有的构造函数...
  • 成员变量、常成员函数常对象

    千次阅读 2013-03-14 12:56:38
    成员变量是用关键字const来声明成员变量, const位于变量前或类型前都一样。 使用特点: (1)成员变量只能通过构造函数的初始化表对成员变量进行初始...常成员函数: 用const来修饰的成员函数 ,const位于函数的括
  • C++中的常对象和常对象成员

    千次阅读 2013-09-05 23:53:00
    常对象中的数据成员变量且必须要有初始值,如 Time const t1(12,34,36); //定义t1为常对象 这样的话,在所有的场合中,对象t1中的所有数据成员的值都不能被修改。凡希望保证数据成员不被改变的对象,可以声明...
  • 1. 常对象只能调用常成员函数。 2. 普通对象可以调用全部成员函数。 3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this...
  • 用const修饰的声明数据成员称为数据成员用const修饰的声明成员函数称为常成员函数用const修饰的定义对象称为常对象变量或对象被const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化。(一)...
  • 常对象只能调用常函数成员 c++

    千次阅读 2015-08-18 21:06:35
    关于 常对象只能调用常函数成员,不能调用非const 函数成员问题,我有点想法 就是我想到的一个角度来解释为什么。 你看,常函数成员的特性就是要在函数后面加一个const 修饰关键字 以 int getX() const;为例,,...
  • 常量对象、常量成员函数和常引用

    千次阅读 2017-03-01 22:04:38
    本章内容均为coursera中C++程序设计课件的整理 常量对象 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字。 class Demo{ private : ...在类的成员函数说明后面可以加const关键
  • · 用const修饰的声明成员函数称为常成员函数 · 用const修饰的定义对象称为常对象 变量或对象被const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化。 (一)用const修饰的声明数据成员称为...
  • 常对象常成员函数的关系

    千次阅读 2008-09-18 21:13:00
    (1) 常对象用const修饰的对象对象常量,其格式如下:〈类名〉const 〈对象名〉 或者 const 〈类名〉〈对象名〉声明为常对象的同时必须被初始化,并从此不能改写对象的数据成员。例:分析下列错误的地方,说明...
  • C++高阶 常对象和常函数

    千次阅读 2020-12-01 00:56:21
    成员函数的声明及定义的形参括号后边加上const关键字,注意如果存在声明的话,声明定义都必须加上const,这就叫函数,函数指的是常成员函数,没有普通函数不能用const修饰。 class Person { public: void ...
  • 常成员函数,它的形式是在成员函数后面加上const修饰,它是为了防止特定函数改变本类对象的数据成员而产生的,目的就是保护数据成员。在常成员函数中,你不能改变数据成员的值,你也不能在常成员函数中调用非常量...
  • 非常对象访问常成员函数,导致内部this指针无法访问非常成员函数,引发如下异常: rror C2662: “LinkedList::showElement”: 不能将“this”指针从“const LinkedList”转换为“LinkedList &”  实例如下: ...
  • C++ 常成员函数

    千次阅读 多人点赞 2017-04-26 09:29:26
    C++ 常成员函数
  • 引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起。 1、 非const成员函数中的隐式参数:classA* this 2、 const成员函数中的隐式参数:const classA* this 根本原因: 1、 const对象的指针为const ...
  • 常成员函数:类型说明符 函数名(参数表) const 如:void showDate() const 1.常成员函数可以访问数据成员,也可访问普通数据成员。 2.数据成员可以被常成员函数访问,也可被普通成员函数访问。 3.如果将一个...
  • **1,常对象** 在定义对象时加关键字...//等价说明:(1)如果一个对象被声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用该对象的普通成员函数(出了由系统自动调用的隐式的构造函数和析构函数)。
  • C++类的常数据成员和常成员函数

    千次阅读 2019-03-11 11:01:07
    一、数据成员 1、定义 用const修饰的数据成员 const int hour;//定义const为数据成员 ...不能采用在构造函数中对数据成员进行赋初值的方法,因为数据成员是不能被赋值的。...普通成员函数...
  • 文章目录1、简单函数形式1.1 普通函数1.2 类成员函数1.3 仿函数1.4 函数指针1.5 成员函数指针 一组执行任务的语句都可以视为一个函数,一个可调用对象。在程序设计的过程中,我们习惯于把那些具有复用性的一组语句...
  • 1 常成员函数 1.1声明:函数名(形参列表)const; 1.2说明: 1)const是函数类型的一部分,在实现部分也要带上该关键字; 2)const关键字可以用于...4)特别地:常对象只能访问类中const成员函数(除了系统自动调用的
  • 成员函数后加const后我们称为这个函数为函数 函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在函数中依然可以修改 常对象: 声明对象前加const称该对象常对象 常对象只能调用函数 常对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 783,703
精华内容 313,481
关键字:

常对象和常成员函数