zoukankan      html  css  js  c++  java
  • c++ 04

    一、this指针
    1.
    2.应用场景
    1)
    2)将this指针作为函数的参数。一个对象可以通知另一个对象有关自身的地址。
       教师
    提问|^
        V|答案
       学生
    交叉类问题:
    class B; // 短式声明
    class A {
      B*/B&
    };
    class B {
      A*/A&
    };
    class A {
      A* m_a;
    };
    非法:
    class B;
    class A {
      B m_b;
    };
    class B {
      A m_a;
    };
    sizeof(A) ?
    class A {
      A m_a;
    };
    3)通过this指针返回对象的自引用

    二、常对象与常函数
    常对象:
    const A a (...);
    const A* p = &a;
    const A& r = a;
    a、p、r一般通称为常对象。

    常函数:拥有常属性的this指针的成员函数。在成员函数的参数表后面加上const关键字。
    1.在常函数内部无法修改成员变量的值,除非该变量被mutable关键字修饰。
    2.通过常对象只能调用常函数。
    3.常属性不同的同型成员函数可以构成重载关系,根据调用对象的常属性进行重载匹配:
    常->常
    非常->非常
    如果没有非常版本,非常对象也可以调用常版本。

    三、析构函数
    1.基本语法
    class 类名 {
      ~类名 (void) {
        ...
      };
    };
    析构函数没有参数,不能重载。
    2.栈中的对象,当期离开作用域时,析构函数被执行。堆中的对象,由delete运算符调用其析构函数。全局/静态对象,其析构函数当卸载进程时被执行。
    3.构造和析构的顺序
    构造:基类的构造函数->成员变量的构造函数->构造函数中的代码
    析构:析构函数中的代码->成员变量的析构函数->基类的析构函数
    4.如果一个类没有定义析构函数,那么系统就会提供一个缺省析构函数,调用类类型成员变量以及基类的析构函数,但是缺省析构函数不负责释放动态分配的资源。

    四、拷贝构造和拷贝赋值
    1.缺省的拷贝构造函数只能实现浅拷贝,因此会带来对象与其副本之间的指针耦合问题,为了实现深拷贝,就需要自己定义拷贝构造函数,以获得完整意义上的对象副本。
    int a, b = 10;
    (a = b) = 20;
    2.缺省的拷贝赋值只能实现浅拷贝,因此会带来对象与其副本之间的指针耦合问题,为了实现深拷贝,就需要自己定义拷贝赋值,以获得完整意义上的对象副本。
    实现步骤:
    1)防止自赋值
    2)释放原内存
    3)分配新内存
    4)获得新数据
    5)返回自引用
    练习:实现一个String类,可以通过C风格的字符串进行构造,支持拷贝构造和拷贝赋值,如果使用了动态内存分配,还需要提供析构函数。此外还要支持获得C风格字符串的接口c_str()

    五、静态成员
    1.静态成员是属于类的,而非静态成员是属于对象的。
    2.静态成员变量的定义和初始化只能在类的外部进行,而不能放在构造函数中。
    3.静态成员变量在该类的多个实例对象间共享。
    4.访问静态成员可以通过类也可以通过对象,但是访问非静态成员只能通过对象。
    5.静态成员函数只能访问静态成员,但是非静态成员函数既可以访问静态成员,也可以访问非静态成员。
    6.静态成员函数没有this指针,也没有const属性。
    7.静态成员也受访控属性的约束。
    class Account {
    public:
      static void setRate (double rate) {
        // ...
        m_rate = rate;
      }
    private:
      string m_name;
      string m_passwd;
      double m_balance;
      static double m_rate;
    };
    Account::setRate (0.05);

  • 相关阅读:
    分布式锁-数据库实现
    MyBatis-Plus自动填充功能失效导致原因
    Java中锁的解决方案
    2:什么是单体应用锁?什么是分布式锁?
    1:初始锁这个概念
    移动端网页开发问题小结
    node.js+socket.io创建web聊天室
    使用HTML5实现刮刮卡效果
    总结(活动)
    videoJs 使用
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/3780683.html
Copyright © 2011-2022 走看看