孙鑫vc++ 第二课 掌握c++

掌握C++
主讲人:孙鑫
C++的标准输入输出流

C++的特性

结构体成员默认识公有的,类成员默认是私有的。

?    构造函数

1、构造函数的作用是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式,在类对象有虚表的情况下,构造函数还对虚表进行初始化。在类中定义成员变量的时候不能直接给成员变量赋值。

2、如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:
?A、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
?B、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
?C、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。
3、只要一个类定义了一个构造函数,不管这个构造函数是否是带参数的构造函数,C++就不再提供默认的构造函数。也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。

?    析构函数
1、当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作就由析构函数来完成。
2、析构函数是“反向”的构造函数,析构函数不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数。
3、析构函数的作用正好与构造函数相反,对象超出其作用范围,对应的内存空间被系统收回或被程序用delete删除时,析构函数被调用。
4、根据析构函数的这种特点,我们可以在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源。 
      例:
      class Student
      {
            private:
                   char *pName;
            public:
                  Student()
                  {
                      pName=new char[20];
                  }
                  ~Student()
                  {
                       delete[] pName;
                  }
      };

?    函数的重载
1、重载构成的条件:函数的参数类型、参数个数不同,才能构成函数的重载。(都是参数不同哦,返回值不列)
2、分析以下两种情况,是否构成函数的重载。
第一种情况:(1)void output();
            (2)int output();
第二种情况:(1)void output(int a,int b=5);
          (2)void output(int a);
3、函数重载时要注意函数带有默认参数的情况。

?    this指针
1、this指针是一个隐含的指针,它是指向对象本身,代表了对象的地址
2、lesson2c (中间位置),变量可见性问题,导致形参x,y自己赋值给自己,要实现赋值给实例类成员变量,用this指针。类内函数用this指针,当然指向的是类实例自己了。
3、一个类所有的对象调用的成员函数都是同一代码段。那么成员函数又是怎么识别属于同一对象的数据成员呢?原来,在对象s调用pt.output(10,10)时,成员函数除了接受2个实参外,还接受到了一个对象s的地址。这个地址被一个隐含的形参this指针所获取,它等同于执行this=&pt。所有对数据成员的访问都隐含地被加上前缀this->。例如:x=0; 等价于 this->x=0。
4、以后想知道当前类有什么成员函数和变量,直接this->即可选择

?    类的继承
   在C++中,给我们提供了一种重要的机制,就是继承。 理解继承是理解面向对象程序设计的关键。
1、Public:      类内部,子类,外函数
   Protected:   类内部,子类
   Private:     类内部   /缺省定义,不能被派生类访问、继承

2、继承方式:class 类名 : 继承方式 父类名
                           {...................};
3、子类即使不写任何代码,则默认使用父类成员

4、类的继承访问特性 :

   基类的访问特性    类的继承特性       子类的访问特性
   -------------------------------------------------------
   Public              Public                Public     
   Protected                                   Protected   
   Private                                   No access  
   -------------------------------------------------------
   Public                Protected             Protected   
   Protected                                   Protected   
   Private                               No access  
   -------------------------------------------------------
   Public                Private               Private     
   Protected                                   Private     
   Private                               No access   

5、建立子类实例,则会先执行父类构造函数,随后执行子类构造函数
  销毁子类实例,则会先执行子类析构函数,随后执行父类析构函数

6、父类构造函数有参数,子类没有,则子类构造函数后加父类带实参的构造函数供子类建立实例时调用,否则出现找不到构造函数错误。(子类构造时,按照自己的模样调用父类的构造函数,发现没有这样的函数时,报错)
   如fish():animal(400,500){}   ----   子类向基类构造函数传递参数
7、构造函数为常量const成员赋值的一个方式:fish():animal(400,500),a(3){}
8、多重继承,注意子类初始化、析构会依赖继承的顺序,同时,如果2个以上父类有同样的函数,被调用时出错
          class 类名 : 继承方式 父类名,  继承方式 父类名, 继承方式 父类名。。。。。。
                           {...................};

?    函数的覆盖
1、基类函数必须是虚函数,返回值、函数名、参数完全一样,则函数覆盖。
2、函数的覆盖是发生在父类与子类之间的。
3、继承父类后可以自定义行为
4、若还要父类的行为,可在行为内加:父类::函数名

5、产生子类实例,随后用父类指针指向子类实例,则通过该指针调用的同名的函数,得到执行的都是父类的函数
6、因为子类实例在内存中,前半部分是所继承的父类,后面的才是子类自己的(Fish对象内存布局)
7、如果想在这样的情况下使用子类的函数,则把父类同名的函数变成虚函数即可,在前加virtual,这就是多态性
      父类相应函数没加virtual时,编译器在编译时就确定了哪个函数被调用,这叫早期绑定技术

    函数隐藏
1、父类某函数与子类某函数名字参数完全一样,但父类的不是虚函数

    类型转换
1、注意内存分配是否一致

?    多态性
1、   当C++编译器在编译的时候,发现Animal类的breathe()函数是虚函数,这个时候C++就会采用迟绑定(late binding)的技术,在运行时,依据对象的类型(在程序中,我们传递的Fish类对象的地址)来确认调用的哪一个函数,这种能力就做C++的多态性。
         在基类函数前加上virtual,在派生类中重写该函数,运行时将根据对象的实际类型来调用相应的函数。
         如果对象类型是子类调用子类的函数,如果对象类型是基类,调用基类的函数。
2、子类有的调用子类的,子类没有的调用父类的。
3、子类继承了父类虚函数,则该函数也是虚函数
4、纯虚函数virtual void breash()=0;   则子类一定要重写该函数,否则报错
5、含有纯虚函数的类叫抽象类,这种类不能声明对象,其继承类也是抽象类,必须重写纯虚函数,才能产生实例
6、纯虚函数主要是给父类在不好确定子类某个行为时使用
7、c++的多态性是由虚函数来实现的,而不是纯虚函数。在子类中如果有对基类虚函数的覆盖定义,无论该覆盖函数定义是否有virtual关键字,都是虚函数。

引用和指针变量的内存模型
  
    类定义和类函数分开
1、类外定义函数,类型 类名::函数名(){}
2、预编译处理,用#ifndef,#define,#endif避免重复定义

    VC++程序编译链接原理与过程
1、头文件不参与编译
2、cpp参与编译,各个单独编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值