c++:成员指针运算符 .* 和 ->*

本文详细解释了C++中的成员指针概念,包括.* 和 ->* 的用法,通过实例展示了如何使用成员指针进行对象操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一种特殊的指针叫做成员指针,它们通常指向一个类的成员,而不是对象中成员的特定实例。

 

 

成员指针并不是真正的指针,它只是成员在对象中的偏移量,它们分别是:.* 和 ->* 。

 

 

 

一个例子:

class ClassName {public: int foo(int); }

int (ClassName::*pmf)(int) = &ClassNmae::foo;

ClassName  c;    //.*的用法,经由对象调用
(c.*pmf)(5);

ClassName *pc = &c;  //->*的用法,经由对象指针调用
(Pc->*pmf)(6);

->*只是把c变为对象指针

 

参考:http://vipjy2008.blog.163.com/blog/static/372087672013933226346/

http://zhidao.baidu.com/link?url=TVPi6OfAvwfWiIob_FLQloCpSX0s59qJiAbpCNllXu8wirVyA-_vM8YpUmJjxHYAY8sQgbF0y4m9jbkbwdJuYq

 

最后欢迎大家访问我的个人网站: 1024s

<think>好的,我现在需要回答用户关于C++:::.->的作用与区别的问题。首先,我得回忆一下这些符号的不同用途,确保自己理解正确,然后组织成清晰的中文解释。用户还提到了参考引用,我需要检查是否有相关内容需要整合进去。 首先处理双冒号::,这应该是作用域解析运算符,用于访问命名空间、类、结构体等的成员。比如std::cout,或者类的静态成员。这里引用[4]提到了类名后的冒号用于继承,可能需要关联一下,但双冒号主要是访问作用域内的成员,而单冒号在继承列表中使用。 然后是单冒号:,在C++中有多种用途。比如位域定义、构造函数初始化列表、访问权限标签(public:)、继承成员初始化。引用[4]里提到了构造函数后面的冒号用于初始化列表,以及继承的定义。需要分点说明这些情况,确保覆盖用户提到的各个场景。 接下来是点操作符.箭头->的区别。点操作符用于对象实例访问成员,而箭头用于指针访问成员。引用[2]提到箭头操作符用于指针,包括智能指针,并且重载时的注意事项。这里需要强调.用于对象,->用于指针,并且提及重载的情况,比如智能指针重载operator->的行为。 需要对比这几个符号的不同使用场景,避免混淆。例如,当有一个对象obj,访问其成员用obj.member;如果是指针ptr,则用ptr->member,相当于(*ptr).member。同时,:::的区别在于前者用于作用域解析,后者用于初始化列表、位域等。 检查是否有遗漏的情况,比如三元运算符中的:,但用户的问题可能不涉及,不过引用[3]提到了三元运算符,但这里可能不需要,除非用户混淆了。但根据问题,用户明确询问的是:::.->,所以可以忽略三元运算符的情况。 最后,确保每个部分都有对应的例子,比如代码片段说明用法。同时,参考用户提供的引用内容,适当加入引用标记,如引用[2]关于->操作符的部分,引用[4]关于单冒号的初始化列表继承。 总结结构:分四个部分分别解释每个符号,然后对比区别,最后相关问题。确保语言简洁,符合中文习惯,正确使用LaTeX格式,如变量名用$...$,独立公式用$$...$$,但这个问题可能涉及较少的数学公式,更多是代码示例,所以注意代码块的正确标记。</think>### C++:::.->的作用与区别详解 #### 1. **双冒号`::`(作用域解析运算符** - **作用**:用于访问命名空间、类、结构体或枚举的成员- **示例**- 访问全局命名空间:`std::cout`(引用标准库中的`cout`)[^4]。 - 调用静态成员:`ClassName::staticMethod()`。 - 在类外定义成员函数: ```cpp void MyClass::myFunction() { ... } ``` #### 2. **单冒号`:`** - **用途**: 1. **构造函数初始化列表**: ```cpp class MyClass { public: MyClass(int a) : m_a(a) {} // 初始化成员变量m_a }; ``` 2. **继承与派生类声明**: ```cpp class Derived : public Base { ... }; // 表示Derived继承自Base ``` 3. **访问权限标签**: ```cpp public: // 后续成员为公有 private: // 后续成员为私有 ``` 4. **位域定义**: ```cpp struct BitField { unsigned int a : 4; // 占用4比特 }; ``` #### 3. **点操作符`.`** - **作用**:通过对象实例访问其成员(变量或方法)。 - **示例**: ```cpp MyClass obj; obj.member = 10; // 访问成员变量 obj.myFunction(); // 调用成员方法 ``` #### 4. **箭头操作符`->`** - **作用**:通过指针访问对象的成员,等价于`(*ptr).member`。 - **示例**: ```cpp MyClass* ptr = new MyClass(); ptr->member = 20; // 通过指针访问成员 ptr->myFunction(); // 通过指针调用方法 ``` - **智能指针与重载**: 智能指针(如`std::shared_ptr`)重载`->`以保持指针语义[^2]。 --- ### **关键区别对比** | 符号 | 适用场景 | 示例 | |--------|---------------------------|--------------------------| | `::` | 作用域解析(全局/类/命名空间) | `std::vector<int>` | | `:` | 初始化列表、继承、位域 | `Derived : public Base` | | `.` | 对象实例访问成员 | `obj.member` | | `->` | 指针访问成员 | `ptr->member` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值