c++学习笔记02

来源:互联网 发布:淘宝评价默认排序规则 编辑:程序博客网 时间:2024/06/03 20:57
类的继承:基类、派生类 或者 父类、子类
继承的方式:
public(都可以访问),
private(只能在自己类内部中被访问),
protected(只能在子类和自己类中被访问)
在父类中作为protected属性的成员函数,子类可以继承protected属性的成员函数,但在外部不能被访问。

父类、子类构造函数先后调用顺序:先构造父类的对象再构造子类的对象
父类、子类析构函数先后调用顺序:先子类再父类

函数的覆盖发生在父类和子类之间,而函数的重载发生在一个类之间

多态性:
早期绑定:在编译时已经确定了需要调用哪一个函数
迟绑定:在运行的时候根据对象类型确认调用哪一个函数(父类成员函数前面加上virtual)

virtual总结:子类有的调用子类的,子类没有的调用父类的

纯虚函数:没有函数体的虚函数。(指被标明为不被具体实现的虚成员函数,可以让类先具有操作的名称而没有具体的操作内容,子类在继承的时候再根据需要具体去给出定义
含有纯虚函数的类被称为抽象类 (只能作为基类,为派生类服务,不能直接实例化一个对象)。

#include <iostream>

class Animal
{
public:
/*
    Animal()//不带参数
    {
        cout << "Animal construct" << endl;
    }
*/
    Animal(int length,int wight)//带参数
    {
        cout << "Animal construct" << endl;
    }
    ~Animal()
    {
        cout << "Animal deconstruct" << endl;
    }
    void eat()
    {
        cout << "animal eat" << endl;
    }
    void sleep()
    {
        cout << "animal sleep" << endl;
    }
/*
    void breathe()
    {
        cout << "animal breathe" << endl;
    }
*/   

/*
    virtual void breathe() //虚函数  
    {
        cout << "animal breathe" << endl;
    }
*/

     virtual void breathe() = 0;//纯虚函数
}


class fish : public Animal
{
public:
    fish():Animal(10,20),a(1);11//1在子类当中向父类中带参数的构造函数传递参数的一种方式
    {
        cout << "fish construct" << endl;
    }
    ~fish()
    {
        cout << "fish deconstruct" << endl;
    }
    void breathe()//覆盖父类的breathe
    {
        cout << "fish breathe" << endl;
    }
    void breathe()//覆盖父类的breathe
    {
        //Animal::breathe(); 
        cout << "fish breathe" << endl;
    }   
private:
    const int a;//z常量数据成员必须初始化采用1
}

void fun(Animal* pAn)
{
    pAn->breathe();
}
int main()
{

    fish fs;
    Animal *pAn;
    pAn = &fs;
    fun(pAn);//打印animal breathe
   //当父类breathe()函数加上了virtual 打印 fish breathe
}
引用:一个变量的别名,指向同一块内存;
必须在在定义时初始化,一个引用为一个变量服务,一个变量可以有多个引用;
主要用在函数传参相当于地址传递
引用和指针变量的区别:
引用不需要占用内存, 指针变量本身需要内存空间去存放他本身;

类设计风格:
把类的定义和函数原型的声明放到.h头文件
把类当中成员函数的实现放到.cpp源文件中
作用域标示符 ::
::是运算符中等级最高的,它分为三种:
1)global scope(全局作用域符),用法(::name)
2)class scope(类作用域符),用法(class::name)
3)namespace scope(命名空间作用域符),用法(namespace::name)
他们都是左关联(left-associativity)
他们的作用都是为了更明确的调用你想要的变量,如在程序中的某一处你想调用全局变量a,那么就写成::a,如果想调用class A中的成员变量a,那么就写成A::a,另外一个如果想调用namespace std中的cout成员,你就写成std::cout(相当于using namespace
std;cout)意思是在这里我想用cout对象是命名空间std中的cout(即就是标准库里边的cout)
条件预编译指令符:防止重复定义
#ifndef XXX_H
#define XXX_H 
#endif

文件编译过程中,每一个源文件都单独编译而不是交叉编译。

原创粉丝点击