this指针如何使C++成员指针可调用

亿牛云代理.jpeg

在C++中,this指针是一个隐藏的指针,指向当前对象实例。它在成员函数中自动可用,用于访问该对象的成员变量和成员函数。理解this指针的工作原理有助于理解为什么指向成员的指针是可调用的。在本文中,我们将详细探讨this指针的概念,并通过具体的代码示例说明其在指向成员指针中的应用。

1. 理解this指针

每个非静态成员函数都有一个隐藏的this指针,指向调用该函数的对象。this指针在成员函数内部自动可用,允许函数访问对象的成员。

class MyClass {
public:
    int value;
    void display() {
        std::cout << "Value: " << this->value << std::endl;
    }
};

在上述代码中,this->value访问了当前对象的成员变量value

2. 指向成员变量的指针

指向成员变量的指针用于指向类的成员变量。这种指针不能单独使用,必须结合特定的对象实例。

class MyClass {
public:
    int value;
};

int MyClass::*ptr = &MyClass::value;

MyClass obj;
obj.value = 42;

// 使用成员变量指针访问对象成员
std::cout << "Value: " << obj.*ptr << std::endl;

在这里,ptr是指向成员变量value的指针,必须通过对象实例obj来访问。

3. 指向成员函数的指针

指向成员函数的指针用于指向类的成员函数。这种指针的类型为ReturnType (ClassName::*)(ArgType),其中ReturnType是函数的返回类型,ArgType是函数的参数类型。

class MyClass {
public:
    void display(int num) {
        std::cout << "Number: " << num << std::endl;
    }
};

void (MyClass::*funcPtr)(int) = &MyClass::display;

MyClass obj;
(obj.*funcPtr)(42);

在这里,funcPtr是指向成员函数display的指针,通过对象实例obj调用。

4. this指针如何使成员指针可调用

在调用成员函数指针时,编译器隐式地传递了this指针,使得成员函数可以访问当前对象的成员变量。这是为什么成员指针可以通过对象实例调用的原因。

5. 代码示例:使用指针的爬虫示例

我们将实现一个多线程的爬虫示例,使用代理IP技术来提高采集效率。我们假设使用亿牛云爬虫代理,其域名、端口、用户名和密码分别为proxy.16yun.cn8080usernamepassword。在示例中,我们将利用C++的成员指针和this指针。

爬虫类设计

首先,我们设计一个爬虫类,其中包括成员函数和指向这些成员的指针。

#include <iostream>
#include <thread>
#include <vector>
#include <curl/curl.h>

//爬虫代理设置(使用亿牛云爬虫代理加强版)
const std::string PROXY = "proxy.16yun.cn:8080";
const std::string PROXY_USERPWD = "username:password";

// 用于接收curl回调的函数
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

class WebCrawler {
public:
    // 成员变量
    std::string response;

    // 成员函数
    void fetchUrl(const std::string& url) {
        CURL* curl;
        CURLcode res;
        response.clear();

        curl = curl_easy_init();
        if (curl) {
            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_PROXY, PROXY.c_str());
            curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, PROXY_USERPWD.c_str());
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
            res = curl_easy_perform(curl);
            if (res != CURLE_OK) {
                std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
            } else {
                std::cout << "Data from " << url << ": " << response << std::endl;
            }
            curl_easy_cleanup(curl);
        }
    }

    // 使用成员函数指针调用
    void startMultithreadedCrawl(const std::vector<std::string>& urls) {
        std::vector<std::thread> threads;
        void (WebCrawler::*funcPtr)(const std::string&) = &WebCrawler::fetchUrl;

        for (const auto& url : urls) {
            threads.emplace_back(std::thread(funcPtr, this, url));
        }
        for (auto& thread : threads) {
            if (thread.joinable()) {
                thread.join();
            }
        }
    }
};

int main() {
    WebCrawler crawler;
    std::vector<std::string> urls = {
        "http://example.com",
        "http://example.org",
        "http://example.net"
    };
    crawler.startMultithreadedCrawl(urls);
    return 0;
}

代码解释

  1. WebCrawler类
  • 包含一个成员变量response用于存储HTTP响应。
  • 包含一个成员函数fetchUrl,用于使用CURL库从给定URL抓取数据。
  • 包含一个成员函数startMultithreadedCrawl,用于启动多线程爬取。
  1. 成员函数指针
  • void (WebCrawler::*funcPtr)(const std::string&) = &WebCrawler::fetchUrl; 定义了一个指向成员函数fetchUrl的指针。
  • std::thread(funcPtr, this, url) 通过this指针将成员函数指针与具体的对象实例绑定,在多线程中调用。
  1. 多线程爬取
  • 创建一个包含多个URL的向量。
  • 调用startMultithreadedCrawl函数,在每个线程中通过成员函数指针调用fetchUrl

通过以上示例,我们不仅展示了this指针如何使C成员指针可调用,还展示了在实际应用中如何结合代理IP技术和多线程技术提高爬取效率。希望这些内容能帮助您更好地理解C中的this指针和成员指针的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/728247.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

保护模式下的内存访问(笔记)

;代码清单12-1;文件名&#xff1a;c12_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码;创建日期&#xff1a;2011-5-16 19:54&#xff1b;修改于2022-02-16 11:15;设置堆栈段和栈指针mov ax, csmov ss, axmov sp, 0x7c00;计算GDT所在的逻辑段地址mov ax, [cs: gdt_base 0x7c…

blender 快捷键 常见问题

一、快捷键 平移视图&#xff1a;Shift 鼠标中键旋转视图&#xff1a;鼠标中键缩放视图&#xff1a;鼠标滚动框选放大模型&#xff1a;Shift B 二、常见问题 问题&#xff1a;导入模型成功&#xff0c;但是场景中看不到。 解决办法&#xff1a;视图-裁剪起点&#xff0…

搭建群辉AudioStation音乐库

目录 1、安装套件 2、配置歌词插件 3、配置音乐库 4、PC端使用 5、手机APP (1)DS Audio (2)音流 6、关于歌曲信息及封面 (1)歌词 (2)封面 作为音乐爱好者,在NAS上存了大量的无损音乐,用文件流量的方式播放,体验未免欠佳。这次我们打造自己的音乐库,随时随…

数据可视化实验五:seaborn绘制进阶图形

目录 一、绘制动态轨迹图 1.1 代码实现 1.2 绘制结果 二、使用seaborn绘制关系图 2.1 绘制散点图分析产品开发部已离职的员工的评分与平均工作时间 2.1.1 代码实现 2.1.2 绘制结果 ​编辑 2.2 基于波士顿房价数据&#xff0c;绘制房间数和房屋价格的折线图 2.2.1 代码…

Meta悄咪咪的发布多款AI新模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

数据资产与用户体验优化:深入挖掘用户数据,精准分析用户需求与行为,优化产品与服务,提升用户体验与满意度,打造卓越的用户体验,赢得市场认可

一、引言 在数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。通过深入挖掘和分析用户数据&#xff0c;企业能够精准把握用户需求和行为&#xff0c;从而优化产品与服务&#xff0c;提升用户体验和满意度。这不仅有助于企业在激烈的市场竞争中脱颖而出&#xff0c;还…

ECM和MEMS技术在心肺声学监测中的应用

心肺疾病是全球范围内导致死亡的主要原因。因此&#xff0c;对这些疾病迹象的准确和快速评估对于为患者提供适当的医疗保健至关重要。心血管疾病最重要的迹象之一是心脏周期的异常。大多数呼吸系统疾病则表现为呼吸周期的异常。有多种方法可以监测心脏和肺部的周期。听诊是监测…

windows服务器下jenkins c语言打包的一些经验share

前言 因为一些原因&#xff0c;需要从linux环境下的jenkins 打包c语言转移到使用windows环境下的jenkins打包c语言&#xff0c;从转移的过程中&#xff0c;发现了一些问题和解决方案&#xff0c;故在此和各位运维工程师分享一下。 一、windows 下的c语言编译环境配置 这边就…

串口rx + RAM + LCD

REVIEW 昨天摸鱼怪发现高两位的数据写入or读出存在问题&#xff1a; RAM 串口的简单应用-CSDN博客 1. 今日摸鱼任务 UART_RX RAM LCD 来显示一下是 rx or tx 的问题 2. 代码部分 rx_ram_lcd.v module rx_ram_lcd(input clk ,input reset_n ,input uart_rx ,output …

【服务器03】之【Navicat完整版破解】

首先清掉电脑所有Navicat组件 虽然被卸载掉了但是没有彻底清理掉Navicat组件 在原装盘里找到Navicat清楚碎片 清空之后开始下载 navicat16 https://www.alipan.com/s/GTvP93mn3sU 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需…

ChatGPT提效:告别CRUD

前言 随着AIGC的发展以及大语言模型的成熟&#xff0c;各种AI应用眼花缭乱&#xff0c;以至于我们看到各种新奇的应用都会产生焦虑&#xff0c;我有一天会不会被淘汰&#xff1f;且看后文分析。AIGC的发展与逐渐成熟已经是无可逆转的局势&#xff0c;既然我们打不过为何不加入…

财务RPA是什么?解析财务RPA的定义和功能

RPA技术作为人工智能领域的代表之一&#xff0c;因其可以高效解决各种基于一定规则的重复而复杂的业务流程&#xff0c;帮助企业节约人工成本并提升效率&#xff0c;如今已经普及到各行各业。而财务领域存在大量规则明确但机械重复的工作和业务流程&#xff0c;这些工作场景是财…

干货 | 使用 Navicat BI 解锁数据的力量

商业智能&#xff08;BI&#xff09;是一种将数据转化为可执行洞察的实践&#xff0c;能够帮助业务领导者提升整体业绩。这个过程中最重要的一个阶段是数据探索和可视化阶段&#xff0c;它涉及通过报告将数据组织并转化为有意义的信息。为了让数据更易于理解&#xff0c;BI 专业…

了解CDN:提升网络性能和安全性的利器

在当今的数字时代&#xff0c;网站性能和安全性是每一个网站管理员必须关注的核心问题。内容分发网络&#xff08;CDN&#xff0c;Content Delivery Network&#xff09;作为解决这一问题的重要工具&#xff0c;逐渐成为主流。本文将详细介绍CDN的定义、作用及其工作原理&#…

【投稿优惠|稳定出版】2024年体育、健康与食品安全国际学术会议(ICSHFS 2024)

【投稿优惠|稳定出版】2024年体育、健康与食品安全国际学术会议&#xff08;ICSHFS 2024&#xff09; 2024 International Conference on Sports, Health, and Food Safety(ICSHFS 2024) 会议简介&#xff1a; 2024年体育、健康与食品安全国际学术会议&#xff08;ICSHFS 2024…

Linux源码学习笔记01-Linux内核源码结构

Linux内核特性 是一个类Unix操作系统&#xff0c;但不是简化的Unix&#xff1b;不仅继承了Unix的特征&#xff0c;还有其他特性。 Linux内核的组织形式&#xff1a;整体式的结构&#xff0c;方便每个领域的开发人员参与开发&#xff1b;Linux进程调度方式简单高效&#xff1a…

打字速度对编程的影响大吗?

知道打字速度对编程的影响大吗&#xff1f;实际上&#xff0c;在编程的世界里&#xff0c;关键在于思考&#xff0c;而非打字速度。要明白&#xff0c;编程与日常聊天中的打字有着本质的区别&#xff0c;如果编程仅仅取决于打字速度&#xff0c;那它岂不就等同于打字员的工作了…

Rust中的数据抓取:代理和scraper的协同工作

一、数据抓取的基本概念 数据抓取&#xff0c;又称网络爬虫或网页爬虫&#xff0c;是一种自动从互联网上提取信息的程序。这些信息可以是文本、图片、音频、视频等&#xff0c;用于数据分析、市场研究或内容聚合。 为什么选择Rust进行数据抓取&#xff1f; 性能&#xff1a;…

Nature正刊!亚利桑那大学博士生陈舒立一作兼通讯最新成果!揭示亚马逊雨林干旱响应的生物地理学机制

2024年6月19日&#xff0c;国际知名学术期刊《Nature》发表了一项美国亚利桑那大学Scott Saleska教授团队的最新成果“Amazon forest biogeography predicts resilience and vulnerability to drought”。通过将森林样地调查数据与遥感观测相结合系统揭示了亚马逊雨林干旱响应的…

动态轮换代理在多账户管理中有何用处?

如果您要处理多个在线帐户&#xff0c;选择正确的代理类型对于实现流畅的性能至关重要。但最适合这项工作的代理类型是什么&#xff1f; 为了更好地管理不同平台上的多个账户并优化成本&#xff0c;动态住宅代理IP通常作用在此。 一、什么是轮换代理&#xff1f; 轮换代理充当…