C++:成员访问运算符:. 与->

本文详细介绍了C++中的成员访问运算符 . 和 -> 的使用方法及区别,通过示例代码展示了这两种运算符如何应用于结构体、联合体和类的成员访问。包括直接成员访问与通过指针间接访问的不同形式。

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

C++:成员访问运算符:. 与->

语法

postfix-expression . name
postfix-expression -> name

备注

成员访问运算符 。 和 -> 用于引用结构、联合和类的成员。 成员访问表达式具有选定成员的值和类型。

有两种形式的成员访问表达式:

在第一种形式中, 后缀表达式 表示结构、类或联合类型的值, 名称 命名为指定的结构、联合或类的成员。 运算的值是 名称 为的值,如果 后缀表达式 是左值,则它是左值。

在第二种形式中, 后缀表达式 表示指向结构、联合或类的指针, 名称 命名为指定的结构、联合或类的成员。 该值是 名称 为的,是左值。 -> 运算符取消引用指针。 因此,表达式 e->member 和 (*e).member (,其中 e 表示指针) 生成相同的结果 (除了运算符 -> 或 * 重载) 时除外。

示例

以下示例演示成员访问运算符的两种形式。


#include <iostream>
using namespace std;

struct Date {
   Date(int i, int j, int k) : day(i), month(j), year(k){}
   int month;
   int day;
   int year;
};

int main() {
   Date mydate(1,1,1900);
   mydate.month = 2;
   cout  << mydate.month << "/" << mydate.day
         << "/" << mydate.year << endl;

   Date *mydate2 = new Date(1,1,2000);
   mydate2->month = 2;
   cout  << mydate2->month << "/" << mydate2->day
         << "/" << mydate2->year << endl;
   delete mydate2;
}

Output

2/1/1900
2/1/2000

该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处,本文章博客地址:https://blog.youkuaiyun.com/it_cplusplus/article/details/118834874

<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、付费专栏及课程。

余额充值