• C++ 类和对象(mooc)


    • C++ 对象中只存成员变量方法是属于类的(所有方法都一样嘛,也可以理解)。
    • C++ 不会默认清理内存,就是说内存使用完,之前的值不会被清除。所以程序再次使用使用到这块内存的时候,它里面的值是不确定的。不一定是0. 所以这就需要程序员自己去初始化这块内存的值。有的语言会自动帮你做这件事。但C++不会,是因为追求效率。
    • constructor:如果手动写一个init方法去初始化一些东西不是不可以,但是难保自己或其他人在使用过程中忘记init,constructor是编译器自动去调用的
    • destructor:没有参数,而且构造和析构都没有返回值,不需要加类型,比如void。
      class A
      {
          A();  //构造,可以有参数
          ~A();  //析构,不能有参数
      }
      
      A::A()
      {
          //todo
      }
      
      A::~A()
      {
          //todo
      }
    • int c[] = {1,2,3,4,5};
      int numOfC = sizeof c / sizeof *c;  // 求c数组元素的个数(c语言知识)
    • 在C++中,结构体也可以实现类(把他就认为是类),和类基本相同。唯一差别:如果不写public, private这些访问控制关键字的话,struct  默认  public  。 class  默认  private
      struct X
      {
          int i;
          int  j;
      };
      
      X a[2] = {{2,5}, {4,6}};  //给结构体初始化
      
      struct Y
      {
          int  i;
          int j;
          Y(int a);
      }
      
      Y  b[] = {Y(1), Y(2)};  //不能直接给变量赋值,必须通过构造函数给i和j赋值。如果只有变量,那么就直接给变量赋值,但是有了构造函数(或者只要有其他函数?)就必须通过构造函数赋值。
      Y c[2] = {Y(3)};// 这是错误的,c数组中有两个类(通过结构体实现的),只调用了一个构造函数是不行的,编译器会去找默认的构造函数(default constructor),
      //但是找不到(因为需要的是带参数的构造函数,而默认的构造函数是不能有参数的),所以就会报错。(编译器给出的构造函数后面学习是怎么回事)

      其实啊,想想是这么回事:把2个类存放在数组中,如果类中定义了带参数的构造函数,那么就必须手动调用构造函数去初始化成员变量,因为编译器不可能帮你传参数啊。所以编译器只能调用不带参数的default constructor。

    • default  constructor  : 没有参数的构造函数(自己写在类中的和编译器给出的构造函数(同样不能有参数)(程序中没有写出来)才是default  constructor。有参数的构造函数不是default  constructor。
    • 子类和父类的关系是:子类包含父类(完全包含,包括私有成员,只是不能进行操作,必须通过父类提供的方法才能操作)。父类中的私有成员是子类不能访问的,但是如果父类中提供了方法可以访问或设置私有成员变量,那么子类可以通过这些方法去访问或设置私有成员变量。
      class  A
      {
           private:
                 int  i;
           public:
                 A():i(5) {}  // initialization  list
                ~A() {//todo  destruct}
                 getI() {cout << i << endl;}
           protected:
                 setI (int a) {i = a;}
      }
      
      //继承
      class B : public A 
      {
            // todo  business  logic
            public:
                 getII() {cout << i << endl;}
      }
      
      void main()
      {
            B b;
            b.getI(); //继承A的方法,使用A的方法访问私有成员变量可以,当然前提是方法是public 或  protected的
            // b.getII();  //通过自己定义的方法去访问私有成员变量i不行
      b.setI(11); //父类中提供的设置i的方法可以使用
      }

      这个就好比提供setter 和 getter 让外部去设置和访问私有成员变量一样。protected  是只让子类去访问和设置私有成员变量。如果父类没有提供getter 和  setter ,那么这个私有成员变量只能自己操作。不论是外部还是子类都无权操作。

  • 相关阅读:
    进程和线程的主要区别
    Mysql 指定字段数据排序 以及django的实现
    java String
    阿里云 邮件发送(Python)
    Python实现类似JavaScript 的Json对象
    JAVA 学习笔记
    记录一个MySql 分区表+Gap锁引起插入超时的案例
    ThreadPoolExecutor源码中的适配器模式
    Oracle 查询真实执行计划
    简单分析FactoryBean
  • 原文地址:https://www.cnblogs.com/bneglect/p/14656617.html
Copyright © 2020-2023  润新知