• C++中->与.的区别


    在类中 

            在 C++ 中,-> 和 . 都可以用于访问类的成员变量和成员函数。但它们在使用上有一些区别:

    1. 对于指针类型的对象,必须使用 -> 来访问其成员;而对于非指针类型的对象,则需要使用 .

    2. -> 运算符在实际使用时会先对指针进行解引用操作 (*p),然后再访问指针所指向对象的成员;而点运算符则是直接访问对象的成员。

            例如,假设有一个名为 p 的指向某个对象的指针,该对象拥有一个名为 memVar 的成员变量和一个名为 memFunc 的成员函数,那么访问这些成员的方式如下:

    1. p->memVar;  // 访问 p 所指向对象的 memVar 成员变量
    2. p->memFunc(); // 访问 p 所指向对象的 memFunc 成员函数
    3. (*p).memVar;  // 与上面等效
    4. (*p).memFunc(); // 与上面等效
    5. obj.memVar; // obj 是某个类的对象,访问该对象的 memVar 成员变量
    6. obj.memFunc(); // 访问 obj 对象的 memFunc 成员函数

            需要注意的是,在使用 -> 访问成员时,其左侧应当是一个指向对象的指针。否则会导致编译错误。

    示例

    1. #include
    2. class Myclass {
    3. public:
    4. int number = 2;
    5. };
    6. int main() {
    7. Myclass a;
    8. std::cout << "a.number = " << a.number << std::endl;
    9. Myclass* b = &a;
    10. std::cout << "(*b).number = " << (*b).number << std::endl;
    11. std::cout << "b->number = " << b->number << std::endl;
    12. }

    输出结果: 

    a.number = 2
    (*b).number = 2
    b->number = 2

    分析:

            这段代码创建了一个名为 Myclass 的类,其中包含一个公有成员变量 number,number 成员变量的值设置为 2。在 main 函数中,首先创建了一个 Myclass 类的实例 a,通过a.number访问number成员变量。然后,创建了一个指向 a 的指针 b,使用 (*b).numberb->number 分别访问了 number 成员变量,并进行打印输出。

    在结构体中

            在 C++ 中,结构体和类的使用方式是相似的。对于结构体,也可以使用 -> 和 . 来访问其成员变量和成员函数,但它们的区别与前面提到的指针和非指针类型的对象的区别是一样的。

            当使用指向结构体的指针时,需要使用 -> 运算符来访问成员;而对于结构体的实例(非指针类型),则需要使用 . 运算符。

            例如,假设有一个名为 p 的指向结构体的指针,该结构体拥有一个成员变量 memVar 和一个成员函数 memFunc,那么访问这些成员的方式如下:

    1. p->memVar;  // 访问 p 所指向结构体的 memVar 成员变量
    2. p->memFunc(); // 访问 p 所指向结构体的 memFunc 成员函数
    3. (*p).memVar;  // 与上面等效
    4. (*p).memFunc(); // 与上面等效
    5. obj.memVar; // obj 是某个结构体的实例,访问该实例的 memVar 成员变量
    6. obj.memFunc(); // 访问 obj 实例的 memFunc 成员函数

            需要注意的是,使用 -> 访问结构体成员时,左侧需要是一个指向结构体的指针。如果左侧不是指针类型或者是空指针,将导致编译错误。而使用 . 访问结构体成员时,左侧应当是一个结构体的实例。

    示例

    1. #include
    2. struct people{
    3. int number = 10;
    4. char str = 'h';
    5. };
    6. int main() {
    7. people a; // 创建结构体实例
    8. std::cout << "a.number = " << a.number << std::endl;
    9. std::cout << "a.str = " << a.str << std::endl;
    10. people* b = &a; // 创建指向该实例的指针,该指针指向结构体实例a
    11. // std::cout << b.number << std::endl; // 编译报错
    12. // std::cout << b.str << std::endl; // 编译报错
    13. std::cout << "b->number = " << b->number << std::endl;
    14. std::cout << "b->str = " << b->str << std::endl;
    15. std::cout << "(*b).number = " << (*b).number << std::endl;
    16. std::cout << "(*b).str = " << (*b).str << std::endl;
    17. }

    输出结果: 

            在上面的代码中,a是一个结构体实例,通过a.number、a.str,我们可以访问结构体实例a中的number、str成员变量。                                                              
            b 是一个指向 people 类型的指针,它指向名为 的结构体实例。通过 (*b).number、b->number; (*b).str、b->str,我们可以访问结构体实例中名为 number、str的成员变量。 

  • 相关阅读:
    Spring IoC 容器生命周期:Ioc容器启停过程发生了什么-13
    Vue3中Compositions API的使用(一)
    简单的Python爬虫实例
    程序员如何过中秋 | 如何画月饼
    QT实现后台服务,linux下使用systemd管理QT后台服务
    游泳耳机哪个牌子好、分享几款游泳听音乐最好的耳机推荐
    文件上传漏洞(1), 文件上传绕过原理
    基于VC++的WEB浏览器的实现
    【单细胞高级绘图】10.KEGG富集结果的圆圈图
    Go基础八股
  • 原文地址:https://blog.csdn.net/m0_48241022/article/details/133982469