首页 > 其他分享 >This指针,static(静态成员)

This指针,static(静态成员)

时间:2024-11-11 20:49:57浏览次数:3  
标签:函数 静态 成员 int 对象 static age 指针

一、this指针

        一个对象由属性(数据)和行为(函数)组成。

       每个对象都只存储了自己的数据成员,并没有保存函数。例如,sizeof(d1) == 4;

        成员函数存储于.text(代码段),只保存一份,则同类型的对象共用。

this 的类型为:类名 * const(例如:Demo * const)

问题:相同的成员函数,如何区分不同的对象?     

        相同的成员函数通过this指针来区分不同的对象。‌

        在C++中,类的成员函数是通过对象调用的,每个对象调用成员函数时,编译器会自动将对象的地址作为隐式参数传递给成员函数,这个隐式参数就是this指针。this指针是一个指向当前对象自身的指针,它在类的非静态成员函数中自动存在,用于访问类的非静态成员变量和成员函数。

1、this指针的作用

1.访问成员变量

class Student
{
private:
    int _age;
public:
    void setAge(int age)
    {
        this->_age = age;//通过this指针访问变量
    }
};

2.调用其他成员函数:在成员函数内部调用其他成员函数时           

class Student
{
private:
    int _age;
public:
    void setAge(int age)
    {
        this->_age = age;
        show();//调用另一个成员函数,传递this指针
    }
    void show()
    {
        cout << "Age:" << this->_age << endl;//通过this指针访问成员变量
    }
};

3.区分同名函数:当成员函数的参数名与成员变量名相同时

class Student
{
private:
    int id;
public:
    void setId(int id)
    {
        this->id = id;// 使用this指针区分参数和成员变量
    }
};

2、this指针的用法

        1、用this表示调用该函数的那个对象的地址
                    例: this->x = x;
        2、用*this表示调用该函数的那个对象本身
                    例: (*this).x = x;

二、静态成员

        用关键字static说明的成员,称为静态成员。

1.静态成员变量

        静态成员变量用于同类型的对象之间实现数据共享;

        静态成员变量不属于对象,而属于类型,它不占用对象的存储空间;

        静态成员变量不能用构造函数初始化,必须在类外初始化;

2.静态成员函数

       1. 静态成员函数同样不属于对象,而属于类型;

       2. 静态成员函数的调用方式:

                (1)使用对象调用

                        对象名.静态成员函数(参数列表);

                (2)使用类名调用

                        类名::静态成员函数(参数列表);

        3. 静态成员函数中没有this
                    静态成员函数 不能 访问 非静态的成员;
                    静态成员函数 不能 说明为 只读成员函数;

#include <iostream>
using namespace std;

// 有一个自定义类型,在程序中创建了多个这种类型的对象,在某一时刻,需要统计该类型对象的个数

class Demo
{
public:
    Demo()//构造函数
    {
        ++count;
    }
    ~Demo()//析构函数
    {
        --count;
    }
    // 静态成员函数
    static int getCount()
    {
        return count;
    }

private:
    static int count; // 静态成员变量声明
};

// 静态成员变量必须类外初始化
int Demo::count = 0;

void foo()
{
    Demo d1;
    // count = 200; // error
}

void bar()
{
    Demo d2[100];

    // 输出Demo类型对象的个数
    cout << "count = " << d2[0].getCount() << endl; // 
}

int main(int argc, char const *argv[])
{
    cout << Demo::getCount() << endl;
    Demo d0;
    foo();
    bar();
    
    return 0;
}
  

练习:现实日期Date和时间Time类型

#include <iostream>
#include <time.h>
using namespace std;

class Time
{
public:
    Time(int h, int m, int s) : _h(h), _m(m), _s(s) {}

    void print() const
    {
        cout << "Time(" << this->_h << ":" << this->_m << ":" << this->_s << ")" << endl;
    }

    static Time currentTime()
    {
        time_t secs = time(NULL);
        struct tm *p = localtime(&secs);
        int h = p->tm_hour;
        int m = p->tm_min;
        int s = p->tm_sec;

        return Time(h, m, s);
    }

private:
    int _h;
    int _m;
    int _s;
};

int main(int argc, char const *argv[])
{
    Time t1(0, 0, 0);
    t1.print();

    Time t2(12, 0, 0);
    t2.print();

    Time t3 = Time::currentTime();
    t3.print();
    return 0;
}



标签:函数,静态,成员,int,对象,static,age,指针
From: https://blog.csdn.net/2301_77732216/article/details/143684694

相关文章

  • C#静态类和GC
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespace_02_静态类{internalclassProgram{staticvoidMain(string[]args){//静态类是指只包含静......
  • .net6 访问静态文件 ContentType MIME
    privatestaticvoidInjectResourcePath(WebApplicationapp,stringpath,stringrequestPath){varprovider=newFileExtensionContentTypeProvider();provider.Mappings[".prj"]="application/octet-stream"......
  • ospf静态路由基础教程
     需要准备的设备如下(这边推荐把地址标出来防止敲的中途忘记)  我们这边给PC1和PC2顺便配置好 第一步,我们需配置端口,这边我给需要配置的端口地址圈起来我们已经清楚了每个路由器端口需要配置的地址,我们就可以开始配了 !!!第一台路由器是需要配置4个端口不要忘了!!!......
  • oracle的静态注册和动态注册
    问题一:什么是静态注册和动态注册静态注册:用酒店的例子,静态注册就像是酒店的前台,什么时候去都有人在,有没有房间需要你先询问,然后她再查看。如果有就可以入住了。静态注册就是这样,监听程序就是前台,前台不知道实例的任何信息,只有客户请求时才检查实例是否存在。动态注册:用蹲坑......
  • 代码静态测试工具Klocwork 2024.3
    HelixQAC2024.3附带适用于Windows和Linux的基于Qt的新安装程序,并增强了对ValidateSAML/OIDC身份验证的支持。此版本还包括对某些环境的Dataflow稳健性的改进,以及整个产品中的许多生活质量增强功能。  Jumpto你喜欢的部分��C++分析增强功能Validate平台改进......
  • 【编程语言】理解C/C++当中的指针
    指针是C/C++语言中一个非常强大且重要的概念,也是编写高效程序的基础之一。对于没有编程背景的初学者来说,理解指针可能有些难度,但通过本篇文章的介绍,相信你会对指针有一个清晰的认识。本文将从指针的基本概念、作用、代码示例、注意事项等方面,带你一步步了解指针的世界。什......
  • freemarker 介绍 环境搭建&&快速入门 静态化测试
    概述:freemarker介绍环境搭建&&快速入门静态化测试FreeMarkerfreemarker简介环境搭建&&快速入门创建测试工程配置文件创建模型类创建模板创建controller创建启动类测试静态化测试需求分析静态化测试freemarker简介FreeMarker是一款模板引擎:即一种基于模板和......
  • C++中clang tidy静态变量检查:Constructor does not initialize these fields
    这条警告通常表示在一个类的构造函数中,某些成员变量(如object和th_cfg)没有被显式初始化。编译器或静态分析工具(例如clang-tidy)可能会给出这样的警告,以帮助开发者避免潜在的未定义行为。可能原因缺少初始化:构造函数中没有对这些成员变量进行初始化,它们的值可能是未定义的。......
  • 哈希算法(开散列)- 支持string(this指针指向的理解)
    一.开散列的定义闭散列(开放地址法)的缺点是线性探测和二次探测都会存在哈希冲突的问题,数据越多冲突就会越明显,导致查询数据的时间复杂度大幅度提升个人思路:创建一个指针数组,当某个位置要插入一个数据,就再创建一个数组,指针数组对应位置的指针指向此数组的首元素(数组地址),......
  • cpp智能指针
      普通指针的不足new和new[]的内存需要用delete和deletel]释放。程序员的主观失误,忘了或漏了释放。程序员也不确定何时释放。普通指针的释放类内的指针,在析构函数中释放。C++内置数据类型,如何释放?new出来的类,本身如何释放?C++11新增三个智能指针类型uniqu......