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指针和成员指针的应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现内网穿透?快解析-免费内网穿透工具

在现如今的ipv4时代&#xff0c;随着上网电脑及其他智能设备越来越多&#xff0c;公网IP地址出现了枯竭的情况。近几年&#xff0c;内网穿透这个词被不断提及&#xff0c;这也是在无公网IP环境下实现异地访问的一种可行办法&#xff0c;下面我就给大家介绍一下内网穿透的原理。…

结构型模式-桥接模式

桥接模式是什么 桥接模式是一种结构型设计模式&#xff0c;用于将抽象部分和其具体实现部分解耦&#xff0c;使它们可以独立变化。该模式通过将抽象和实现部分分离&#xff0c;使它们可以独立地扩展和变化。 在桥接模式中&#xff0c;有两个关键角色&#xff1a;抽象部分和实现…

LLMs:《A Decoder-Only Foundation Model For Time-Series Forecasting》的翻译与解读

LLMs&#xff1a;《A Decoder-Only Foundation Model For Time-Series Forecasting》的翻译与解读 导读&#xff1a;本文提出了一种名为TimesFM的时序基础模型&#xff0c;用于零样本学习模式下的时序预测任务。 背景痛点&#xff1a;近年来&#xff0c;深度学习模型在有充足训…

云计算在保险行业的应用:太平财险团财险理赔新核心业务系统案例

随着科技的快速发展&#xff0c;云计算技术已经成为推动保险行业数字化转型的重要力量。云计算为保险公司提供了弹性、可扩展的计算资源&#xff0c;使其能够灵活应对业务高峰和低谷&#xff0c;提高业务运营效率和风控水平。太平财险与太平金科联合开发的“团财险理赔新核心业…

PCA与LDA

共同点 降维方法&#xff1a; PCA和LDA都是数据降维的方式&#xff0c;它们都能通过某种变换将原始高维数据投影到低维空间。 数学原理&#xff1a; 两者在降维过程中都使用了矩阵特征分解的思想&#xff0c;通过对数据的协方差矩阵或类间、类内散度矩阵进行特征分解&#xff…

STM32 使用硬件SPI读写W25Q64芯片

STM32使用硬件SPI读写W25Q64芯片 摘要 本文详细介绍了如何使用STM32微控制器的硬件SPI接口来读写W25Q64串行Flash存储器。W25Q64是一款8Mb的SPI Flash存储器&#xff0c;广泛应用于嵌入式系统中。本文将从硬件连接、SPI初始化、W25Q64初始化、读写操作等方面进行阐述&#xf…

分析开封办理建筑工程设计资质流程

了解资质标准&#xff1a;查阅最新的建筑工程设计资质管理规定&#xff0c;明确申请所需的具体条件&#xff0c;包括注册资本、专业技术人员配备、技术装备、质量管理体系、工程业绩等要求。 组建符合资质要求的团队&#xff1a;招聘或调配具备相应资格的专业技术人员&#xf…

MySQL的复制和集群技术

MySQL的复制和集群技术是提升数据库性能、确保数据冗余和增强数据库可用性的重要手段。以下是关于MySQL复制和集群技术的详细解释&#xff1a; 1. MySQL复制&#xff08;Replication&#xff09; 1.1 定义 MySQL复制是一种将数据从一个MySQL数据库服务器&#xff08;称为主服…

【Python高级编程】Python中文本文件操作的基本方法

Python操作文本文件详解 在Python编程中&#xff0c;操作文本文件是一个非常常见的需求。无论是读取文件内容进行数据处理&#xff0c;还是将结果写入文件保存记录&#xff0c;文本文件的操作技巧都非常重要。本篇博客将详细介绍如何使用Python进行文本文件的操作&#xff0c;…

JAVA开发 选择指定的文件生成ZIP压缩包

JAVA开发 选择指定的文件生成ZIP压缩包 1、ZipOutputStream1.1 主要方法1.2 使用步骤 2、案例实现2.1 代码块2.2 运行界面 1、ZipOutputStream ZipOutputStream 是 Java 中的一个类&#xff0c;它属于 java.util.zip 包&#xff0c;用于将多个文件或数据流写入到一个 ZIP 输出…

【mysql为什么采用b+树作为索引】

## 1、Hash: 它查询任何一行数据都只需一次IO,但是只能查一行&#xff0c;不能查询范围 。 ## 2、二叉树&#xff1a; 1、 可能会单边增长&#xff0c;退化成链表&#xff0c;查询效率和没建立索引差不多。2、才二叉而已&#xff0c;树的层数太多&#xff0c;IO次数多&#x…

数据赋能(121)——体系:数据清洗——实施过程、应用特点

实施过程 数据清洗的实施过程是一个复杂而关键的任务&#xff0c;它涉及多个步骤以确保数据的准确性和一致性。以下是数据清洗通常需要进行的操作包括&#xff1a; 纠正错误&#xff1a; 识别和纠正数据中的错误&#xff0c;如拼写错误、编码错误、计算错误等。对于某些数据&…

贪心算法学习五

例题一 解法&#xff08;贪⼼&#xff09;&#xff1a; 贪⼼策略&#xff1a; 我们的任何选择&#xff0c;应该让这个数尽可能快的变成 1 。 对于偶数&#xff1a;只能执⾏除 2 操作&#xff0c;没有什么分析的&#xff1b; 对于奇数&#xff1a; i. 当 n 1 的时候…

Docker 安装 MySQL5.7 和 MySQL8

文章目录 安装 MySQL5.7拉取镜像前期准备启动容器 安装MySQL8.0拉取镜像查看镜像前期准备启动容器 安装 MySQL5.7 拉取镜像 docker pull mysql:5.7拉下来镜像后 执行 docker images 此时我们已经有这个镜像了。 前期准备 在根目录下创建 app &#xff0c; 在 app 目录下创建…

使用 `millis()` 函数在 Arduino 编程中实现非阻塞延时(水泵/继电器不受控制为例)

在 Arduino 编程中&#xff0c;delay() 函数是一个常见的工具&#xff0c;用于创建代码执行的延时。然而&#xff0c;delay() 函数的一个显著缺点是它会阻塞代码的执行。这意味着当 delay() 函数运行时&#xff0c;Arduino 将暂停其他所有的操作&#xff0c;直到延时结束。这种…

小工具开发

因不太喜欢重复性工作&#xff0c;为了提高日常工作效率&#xff0c;在业余时间开发一些小工具用于帮助自己“偷懒”。 小工具功能&#xff1a; 1、Hightec编译的hex文件&#xff0c;与多模式标定hex文件合成 2、Bootloader文件&#xff0c;Hightec编译的hex文件&#xff0c;与…

Oracle 系列数据库使用 listagg去重,删除重复数据的几种方法

listagg聚合之后很多重复数据&#xff0c;下面是解决重复数据问题 案例表 create table "dept_tag_info" ( "tag_id" bigint not null, "tag_code" varchar(200), "tag_name" varchar(500), "tag_level" varchar(200), &…

java-接口 2

### 7. 接口的设计原则 #### 7.1 接口隔离原则&#xff08;ISP&#xff09; 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;建议将大的接口分解为多个小接口&#xff0c;每个接口只包含客户所需的方法。这使得实现类 只需实现其真正需要的接口&…

KindleUnpack - Python解压Amazon / Kindlegen生成的电子书

文章目录 关于 KindleUnpack使用选项 关于 KindleUnpack github : https://github.com/kevinhendricks/KindleUnpack KindleUnpack 是基于python的软件来解压Amazon / Kindlegen生成的电子书 KindleUnpack将非drm Kindle/MobiPocket电子书解压到其组件中 根据正在处理的Kindl…

Android Studio新增功能:Device Streaming

今天将Android Studio升级到2023.3.1 Patch2。发现新增了Device Streaming功能。支持远程使用Google的物理设备调试程序。这样可以方便地在真实设备上测试自己的APP。这对于手头没有Google设备的开发者而言&#xff0c;确实方便很多。该功能目前处于测试阶段&#xff0c;在2025…