精华内容
下载资源
问答
  • 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对象不允许可以引用,但不可以改变值
    展开全文
  • 引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起。 1、 非const成员函数中的隐式参数:classA* this 2、 const成员函数中的隐式参数:const classA* this 根本原因: 1、 const对象的指针为const ...

    引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起。
    1、 非const成员函数中的隐式参数:classA* this
    2、 const成员函数中的隐式参数:const classA* this

    根本原因:
    1、 const对象的指针为const classA* this,因此传入非const成员函数时编译器报错(类型不匹配,无法从const 指针转换为非const指针);但传入const成员函数则类型匹配。

    2、非const对象的指针为classA* this,可以调用const成员函数,因为const修饰符保证了不会修改该对象。

    详细代码案例解释见:为什么const对象只能调用const成员函数,而不能调用非const成员函数?

    总结:

    1、const对象只能调用const成员函数、不能调用非const成员函数;
    2、非const对象可以调用const成员函数。

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

    千次阅读 2018-06-03 15:55:01
    3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。4. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个...

    先明确几个概念:

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

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

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

    如:

      

    [cpp]  view plain  copy
    1. #include <iostream>  
    2.   
    3. class A  
    4. {  
    5. public:  
    6.     A():mValue(0)  
    7.     {  
    8.   
    9.     }  
    10.     void print()   
    11.     {  
    12.         std::cout<<"hello";  
    13.     }  
    14.     int GetValue()  
    15.     {  
    16.         return mValue;  
    17.     }  
    18.     int GetValue()const  
    19.     {  
    20.         return mValue;  
    21.     }  
    22.   
    23. private:  
    24.     int mValue;  
    25. };  
    26.   
    27. void test(A & const a)  
    28. {  
    29.   
    30. }  
    31.   
    32. int main()  
    33. {  
    34.       
    35.     const A a;//const A* const this ;     
    36.     a.print(); //错误,将会提示 error C2662: “A::print”: 不能将“this”指针从“const A”转换为“A &”  
    37.   
    38.     test(a); //error C2664: “test”: 不能将参数 1 从“const A”转换为“A &”  
    39. }  


    由于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指针,不能再程序中修改它或给它赋值;


    展开全文
  • c++指针对象调用成员函数

    千次阅读 2014-05-24 00:37:02
    c++类的指针对象调用成员函数与一般对象调用成员不同,格式分别是: 普通对象:  objectName.memberfunction(para); 指针对象:  objectName->memberfunction(para) ; or (*objectName).member...

    c++类的指针对象调用成员函数与一般对象调用成员不同,格式分别是:

    普通对象:

           objectName.memberfunction(para);

    指针对象:

          objectName->memberfunction(para) ;   or     (*objectName).memberfunction(para);

    并且c++的成员函数在调用是捆绑了对象,进行了参数传递,所以不需要在调用时显示传递参数。

    /*************************************************************************
    > File Name: t1.cpp
    > Author:
    > Mail: 178*****@qq.com
    > Date: Sat 24 May 2014 12:05:52 AM CST
    ************************************************************************/


    #include<iostream>
    #include<iomanip>
    using namespace std;
    class Date{
    int year,month,date;
    public:
    void set(int x,int y,int z){
    year=x;month=y;date=z;
    }
    bool isLeapyear(){
    if((year%4==0&&year%100!=0)||year%400==0)
    return true;
    else
    return false;
    }
    void print(){
    cout<<setfill('0');
    cout<<setw(4)<<year<<'-'<<setw(2)<<month<<'-'<<setw(2)<<date<<endl;
    }
    };
    int main(){
    Date *p=new Date;//指针对象
    Date *p1=new Date;//指针对象
    (*p).set(2004,10,1);//指针对象调用成员函数
    p1->set(2014,10,1);//指针对象调用成员函数
    if((*p).isLeapyear())
    (*p).print();
    if(p1->isLeapyear())
    p1->print();
    }

    展开全文
  • 很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制... 类分为成员变量和成员函数,我们先来讨论成员变量。 一个类对象的地址就是类所包含的这一片内存空间的
  • this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它...
  • C++之指向对象成员函数的指针

    千次阅读 2015-09-16 10:09:28
    1. 普通函数的指针变量定义  数据类型名 (*指针变量名)(参数列表);  例如:void (*p)( ); //p指向void型函数的指针...2. 指向对象成员函数的指针变量[指向对象成员函数的指针变量与普通函数的指针变量的根本区别
  • C++只读成员函数、只读对象

    千次阅读 2017-07-09 22:47:38
    什么是只读成员函数? 只读成员是C++中结构体或类的成员函数,在函数括号... 只读成员函数存在的意义只有一个——为只读对象服务,后面会说到。先介绍一下只读成员函数的语法。class student //定义一个student类,有
  • 文章目录1、简单函数形式1.1 普通函数1.2 类成员函数1.3 仿函数1.4 函数指针1.5 成员函数指针 一组执行任务的语句都可以视为一个函数,一个可调用对象。在程序设计的过程中,我们习惯于把那些具有复用性的一组语句...
  • 常量对象与常量成员函数

    万次阅读 2012-03-01 23:53:59
    常量对象与常量成员函数 常量对象与常量成员函数来防止修改对象,实现最低权限原则。 可以用关键字const来指定对象是不可修改的,任何修改该对象的企图,都会导致编译错误。 例如:const Time noon(12,0,0); ...
  • 非常对象访问常成员函数,导致内部this指针无法访问非常成员函数,引发如下异常: rror C2662: “LinkedList::showElement”: 不能将“this”指针从“const LinkedList”转换为“LinkedList &”  实例如下: ...
  • python获取对象成员函数与变量

    千次阅读 2020-05-14 19:47:56
    python在编程中总是不清楚对象的成员方法,通过一些内置函数可以在运行环境中得到成员函数和成员变量。当然也可以应用inspect库函数查看。 class A(object): def __init__(self, x): self.x = x obj = A() print...
  • C++类成员函数转换成函数对象

    千次阅读 2016-09-15 19:39:27
    C++中,类的成员函数(member_function)通常不能直接作为函数对象来使用,最常见的就是创建线程时,不能使用非静态的成员函数来初始化一个线程。 这个主要是因为没有传入this指针,而下面的转换或者绑定,本质是将类...
  • 0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理; 1. 类中,多个代码区块public或者private最终会被按区块统一,然后编译过程中,后定义的成员变量地址高于定义的成员变量...
  • C++函数编译原理和成员函数的实现

    千次阅读 2017-07-25 15:34:54
    对象的内存中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 stu 的类型为 Student,也不知道它还有四个成员函数 setname()、setage()、setscore()、show(),C++ 究竟是如何通过对象调用成员函数...
  • 对象对象成员函数的初步介绍 在某些情况下,我们要需要定义对象函数。比如人对象:除了有一些属性外(成员变量表示的年龄,姓名……),我们人对象还有一些行为比如:可以说话,跑步……,通过学习,我们人还...
  • 成员函数对象只是只读访问,不允许修改对象的成员变量,所以不能调用非常成员函数,因为,这些成员函数可能修改成员变量。 而普通成员函数当然可以调用常成员函数 class people  { private: char *...
  • const对象与const成员函数

    千次阅读 2012-08-26 21:21:17
    const对象只能调用const成员函数: #include using namespace std; class A { public: void fun()const { cout成员函数!"; } void fun() { cout非const成员函数 !"; } }; int main() { con
  • c++ const对象和const函数

    千次阅读 多人点赞 2018-09-09 20:46:44
    1.如果一个成员函数不对对象的任何成员数据的进行修改(最常见的为打印成员信息的函数),那么我们可以将这个成员函数设置为const函数,以保护对象数据。如void print()const 对成员函数()后加上const限定 如果在该...
  • 类中默认的六个成员函数 构造函数 析构函数 拷贝构造函数 赋值操作符重载 取地址const取地址操作符重载 const成员函数 1. 类中默认的六个成员函数 首先看看下面代码 class A{ }; int main(){ A a; return 0; } ...
  • 普通成员函数和静态成员函数

    千次阅读 2018-03-25 19:47:25
    类成员包括数据成员和成员函数。 两者区别 1分配内存的时间不同 静态成员属于类本身,不属于具体类对象,在类加载时分配内存空间,程序结束时才消失。可以类名直接访问。 普通成员属于类对象,在类对象创建...
  • C++中的const对象与const成员函数

    千次阅读 2018-08-04 10:24:47
    同样,在C++中,还存在const对象以及const成员函数,const修饰的对象为只读对象,他们的特性如下:  const成员函数的定义:需要在函数的声明及定义的后边加上const关键字 -const对象只能调用const成员函数  -const...
  • 成员函数和全局函数

    千次阅读 2015-10-28 20:45:38
    成员函数和全局函数的区别就是,一个是面向对象,一个是面向过程  2.类成员函数==(转成)==>全局函数:增加一个参数,增加的这个参数是代替this指针的  3.全局函数==(转成)==>类成员函数:减少一个参数,...
  • const对象只能调用const成员函数

    千次阅读 2019-07-13 22:38:52
    常量成员函数 (const member ...const对象是不可以调用类中的非const成员函数。原因之后解释。 假设现在有如下代码: class test{  int i; public:  void print();  test(int i); }; test obj1(12); obj1.p...
  • C++ - 对象模型之 成员函数调用

    千次阅读 2013-02-23 14:42:00
    C++对象模型目录 C++ - 对象模型之 编译器何时才会自行添加构造函数 C++ - 对象模型之 内存布局 ... - 对象模型之 成员函数调用 ... - 对象模型之 构造析构函数都干了什么 ...C++ - 对象模型之 成员函数调用
  • 成员函数后加const后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加const称该对象为常对象对象只能调用常函数 常对象...
  • C++的静态成员变量静态成员函数

    万次阅读 2019-05-22 15:35:41
    静态成员函数和静态成员变量是属于类的,而不是属于对象的,也就是说,在类实例化为对象之前,静态成员变量和静态成员函数就已经分配了内存空间了,而普通成员函数和成员变量只有在对象产生之后才会分配空间。...
  • ·静态成员函数 ·静态成员函数就是使用 static 关键字声明的成员函数  在类外实现时不加static关键字,只有在类内声明时才加static ·静态成员函数是类的一部分,作用是为了处理静态数据成员  没有this指针 ·...
  • 静态数据成员静态成员函数

    万次阅读 多人点赞 2018-08-26 19:18:35
    c++中的static静态数据成员静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 800,078
精华内容 320,031
关键字:

对象和成员函数