精华内容
下载资源
问答
  • this作用域是在内部,当在的非静态成员函数中访问的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它...

    1.一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

    this指针的使用:

    一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时使用this指针,如this->n = n (不能写成n = n)。

    为什么要有this,this起到什么作用?话还是要从类和对象说起,定义一个对象,系统要给该对象分配存储空间,如果该类包含了数据成员和成员函数,就要分别给数据和函数的代码分配存储空间。按照正常额思路,如果类定义了2个对象,那么就应该分别给这2个对象的数据和函数分配空间。但事实并非如此,C++的编译系统只用了一段空间来存放在各个共同的函数代码段,在调用各个对象的成员函数时,都与调用这个公共的函数代码。因此,每个对象的存储空间都只是该对象数据成员所占用的存储空间,而不包括成员函数代码所占有的空间,函数代码是存储在对象空间之外的。但是问题就出来了,既然所有对象所调用的成员函数代码只是单独一封,那么成员函数是怎么知道当前调用自己的是哪一个对象呢?

      这时就诞生了this这个自引用的指针。每当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值为当前调用成员函数的对象的起始地址。每当调用一个成员函数时,系统就把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数的this指针所指向的对象来确定应该调用哪一个对象的数据成员。通过下面一个简单实例就可说明。

    #include "stdafx.h"
     #include <iostream>
     #include <string>
     
     
     class Num
     {
     private:
     int a;
             std::string objectName;
     public:
             Num(std::string objectName,int a);
     void showNum();
     };
     
     Num::Num(std::string objectName,int a)
     {
     this->objectName=objectName;
     this->a=a;
     }
     
     void Num::showNum()
     {
         std::cout<<this->objectName<<":this="<<this<<" a="<<this->a<<std::endl;
     }
     
     
     int main()
     {
         Num num1("num1",1);
         Num num2("num2",2);
         Num num3("num3",3);
     
         num1.showNum();
         num2.showNum();
         num3.showNum();
     
     return0;
     }

    结果:

    -------------------------------------------------------------------------------------------------

     

    关于this指针的一个经典回答:   

    当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢? this是一个指针,它时时刻刻指向你这个实例本身。

    ---------------------------------------------------------------------------------------------

    关于this的若干回答:

    1:this只能在成员函数中使用。全局函数,静态函数都不能使用this。
    2:由此可见,this在成员函数的开始前构造的,在成员的结束后清除。这个生命周期同任一个函数的参数是一样的,没有任何区别。   当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。
    3:this指针是什么时候创建的?   this在成员函数的开始执行前构造的,在成员的执行结束后清除。   
    4:this指针存放在何处?堆,栈,全局变量,还是其他?   this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。   
    5:this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?   this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。   
    6:this指针如何访问类中变量的/?   如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,那就很好理解这个问题了。   在C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public。   this是类的指针,如果换成结构,那this就是结构的指针了。   
    7:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用吗?   this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。   
    8:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?   普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。   但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数

     

     

    展开全文
  • 使用对象调用成员函数

    千次阅读 2018-01-15 08:56:19
    #include using namespace std; class point { private:  int h,m,s; public:  void set_time();  void show_time();//成员函数  void jude_h();  void jude_m();  void jude_s(); }; v
    #include <iostream>
    
    using namespace std;
    class point
    {
    private:
        int h,m,s;
    public:
        void set_time();
        void show_time();//成员函数
        void jude_h();
        void jude_m();
        void jude_s();
    };
    void point::set_time()
    {
        cin>>h>>m>>s;//直接输入到内存里面去,是类的数据成员,无需重新定义
    }
    void point::jude_h()
    {
        if(h<0)
        {
            h=0;
        }
        else if(h>12)
        {
            h=12;
        }
    }
    void point::jude_m()
    {
        if(m<0||m>60)
        {
            m=0;
        }
    }
    void point::jude_s()
    {
        if(s<0||s>60)
        {
            s=0;
        }
    }
     void point::show_time()
     {
         if(h<10)
         {
             cout<<"0"<<h<<":";
         }
         else
         {
             cout<<h<<":";
         }
         if(m<10)
         {
             cout<<"0"<<m<<":";
         }
         else
         {
             cout<<m<<":";
         }
         if(s<10)
         {
             cout<<"0"<<s;
         }
         else
         {
             cout<<s<<endl;
         }
     }
    int main()
    {
        point t;//定义一个对象
        t.set_time();//使用对象调用函数
        t.jude_h();
        t.jude_m();
        t.jude_s();
        t.show_time();
        return 0;
    }
    展开全文
  • 定义一个基类Base,有两个公共成员函数fun1()和fun2(),如果公有派生出Derived,Derived中重载了基类的成员函数fun1(),没有重载基类的成员函数fun2(),如何在派生的函数中调用基类的成员函数fn1(),fn2()?...

    题目

    定义一个基类Base,有两个公共成员函数fun1()和fun2(),如果公有派生出Derived类,Derived类中重载了基类的成员函数fun1(),没有重载基类的成员函数fun2(),如何在派生类的函数中调用基类的成员函数fn1(),fn2()?

    源代码

    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    
    class Base{
    public:
    	void fun1(){ cout << "fun1"<<endl; };
    	void fun2(){ cout << "fun2"<<endl; };
    };
    
    class Derived:public Base{
    public:
    	void fun1();
    	void fun3(){
    		Base::fun1();
    		fun2();
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Derived d;
    	d.fun3();
    	return 0;
    }
    

    运行结果

    在这里插入图片描述

    解析

    已知在Derived类中重新定义了基类的成员函数fun1(),而没有重新定义基类的成员函数fun2(),则在调用fun1时可通过Base::fun1();方法来调用,而调用函数fun2时则可以直接在派生类的公有成员函数中调用基类的公有成员函数即:fun2().

    展开全文
  • 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();
    }

    展开全文
  • 引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起。 1、 非const成员函数中的隐式参数:classA* this 2、 const成员函数中的隐式参数:const classA* this 根本原因: 1、 const对象的指针为const ...
  • C++---空指针能调用类成员函数吗?

    千次阅读 2019-05-02 12:00:52
    我们知道,一个对象的指针可以调用它的成员函数和虚函数,那么如果一个指向空nullptr的指针,能不能调用它的成员函数和虚函数。 #include<iostream> using namespace std;; class A { public: void func1() ...
  • C++ 类成员函数调用

    千次阅读 2019-04-21 22:39:49
    今天看了一篇写得很好的博客:类成员函数调用分析 看完后,有一些小的心得,大概是帮我理了一遍吧。 全局变量和static变量存放在静态存储区。 与静态成员变量和非静态成员变量不同的是:静态成员函数和非静态...
  • 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...
  • 1.通过的public成员函数调用private成员函数: #include&lt;iostream&gt; using namespace std; class Test { public: void fun2() { fun1(); } private: void fun1() ...
  • 的const成员函数调用问题

    千次阅读 2017-11-30 12:25:48
    对象(object)可以是const和non-const的,但是都可以调用const成员函数,其中non-const object既可以调用const member function也可以调用non-const member function,而const object只能调用const member ...
  • 对象指针为NULL,为什么还是可以调用成员函数

    千次阅读 多人点赞 2017-03-05 19:53:46
    C++中,空指针是不能够使用的,然而空对象指针有时候却能够调用成员函数。 先来看一下以下程序: #include #include using namespace std; class A { public: static void f1(){ cout; } void f2(){ cout; } void...
  • 成员函数调用问题

    千次阅读 2017-03-21 08:50:26
    跟作用域和虚函数表(new出来的对象有关)有关系;  如果有作用域,根据作用域执行(不会走虚函数表,直接到代码段找),与new的类型和指针类型没有关系;  如果没有作用域关键词则根据虚函数表(与new对象有关)执行...
  • 1、在子类内部不能调用父类中私有的成员函数,只能调用受保护和公有的成员函数。 2、在子类外部,子类对象按照继承方式重新给父类成员函数赋予访问权限(上面是 public 继承),此时只有重新赋予的访问权限是 ...
  • 成员函数对象只是只读访问,不允许修改对象的成员变量,所以不能调用非常成员函数,因为,这些成员函数可能修改成员变量。 而普通成员函数当然可以调用成员函数 class people  { private: char *...
  • 先写一个日期,把构造函数,拷贝构造函数,析构函数,赋值运算符的重载都写上,代码如下:class Date{ public: //构造函数 Date() { cout &lt;&lt; "Date()" &lt;&lt; endl; } //...
  • 定义一个基类Base,有两个公共成员函数fun1()和fun2(),如果私有派生出Derived,如何通过Derived对象调用基类的函数fun1()和fun2()? 源代码 #include "stdafx.h" #include<iostream> using namespace ...
  • C++类成员函数指针使用介绍

    万次阅读 多人点赞 2019-09-21 16:07:49
    在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member ...
  • 静态成员函数调用

    千次阅读 2019-03-19 12:13:10
    static成员函数属于,独立于对象存在,不依赖于对象。随着的加载而加载,优先于对象存在,被所有对象共享,可以直接被类名调用调用方式: 类名::成员名 对象名.成员名 static成员函数中没有this指针,...
  • 1. 通过中的public成员函数调用private成员函数: #include<iostream> using namespace std; class Test { public: void fun2() { fun1(); } private: void fun1() { cout<<...
  • 静态成员函数调用方式--收藏帖子

    千次阅读 2018-12-13 17:14:56
    静态成员函数调用方式 A:: s_fun();//不需要额外传递一个参数,作为this 指针;因为静态函数,属于,不属于具体对象。非静态成员函数调用方式 。非静态成员函数,属于对象,需要隐式传递 this 指针作为参数...
  • 1、调用其它函数 var mingzi = "dancheng"; function say() { console.log('名字' + this.mingzi + '在演讲'); } var cat = {mingzi:'kitty', eat:'fish'}; cat.express = say; cat.express()
  • A.h#ifndef A_H#define A_Hclass A{public: virtual void a(); virtual void b(); virtual void c();};#endifA.cpp#include &lt;iostream&gt;using std::cout;using std::endl;#include "...
  • 比如内绑定自身成员函数作为回调函数,这种情况在开启多线程时很常见,如果不想将回调定义为全局那只能定义为静态了,为了避免过度破坏封装中应当尽量不要让静态成原函数调用类成员。这种情况下可以用一种...
  • 当使用上述指针或者对象调用成员函数Func()时,会有: obj.Func(); ptr->Func(); 上述调用的背后到底完成了一些什么呢? 假设Func函数的定义如下: Point3d Point3d::Func() const { Float a = getA();
  • 假设你想在A里调用类B的函数int f(x),两种办法: 1、class A::B 也就是说将B定义为A的父类, 这样你就可以自然的在A里面用f(x)了 2、class A { B B_ins; int g(x); } int g(x) { return B_ins.f(x...
  • 在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。假设有一个,名字为test代码如下: 1 class test{ 2 int i; 3 public: 4 ...
  • 在继承之外,在C++中一个类成员函数调用另一个成员的方法主要有:的组合,友元的前向声明,单例模式等,下面主要讲讲这4种方法的实现 方法1:利用的组合 组合通俗来讲就是B有A的属性,如声明一个...
  • 其实我们从直观上可以很好的理解静态...从本质上来说的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。 静态成员变量的函数形参中没有默认的this指针指向类对象本身。所以当我们...
  • ![图片说明](https://img-ask.csdn.net/upload/201812/14/1544788405_744691.png)![图片说明]... 怎么在定义的函数调用类中的函数,在不用静态成员的情况下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 643,273
精华内容 257,309
关键字:

类的对象调用成员函数