c++面向对象

C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型,类中的数据和方法称为类的成员,函数在一个类中被称为类的成员函数


  • 构造函数:与类名相同,可以带或不带参数。

  • ~析构函数:与类名相同,前面加个[~],它不会返回任何值,也不能带任何参数。怕你忘记,析构函数会在跳出程序(比如关闭文件、释放内存等)前自己释放资源。

  • 友元函数[ Friend ]:类的友元函数是定义在类外部,但有权访问类的所有私有成员和保护成员即 任何成员


  • 内联函数[ Inline ]:C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方,是不是感觉和 宏 很像,确实很像,但是内联函数是一个真正函数,编译器会检查类型参数,而宏是不加任何验证的代码替换,可以见 基础语法 里的宏练习。内联函数 也是为了避免程序在反复调用函数时,保存函数的各种参数,但这种方式会增加内存开销,所以内联函数尽量短,否则就不划算了,这应该也算是 空间换时间 的一种想法吧。


  • this指针:在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。


成员访问修饰符

  • 类成员的访问属性[访问修饰符]:成员和类的 默认访问修饰符是 private,一个类可以有多个 public、protected 或 private 标记区域,每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。

  • public[公共成员]:在类对象作用域内,公共成员在类的外部是可访问的。

    class Box
    {
       public:
          double length;   // Length of a box
          double breadth;  // Breadth of a box
          double height;   // Height of a box
        
          double getVolume(void);//成员函数
    };
    
    double Box::getVolume(void)// 或者内部声明,定义在外部。
    {
        return length * breadth * height;
    }


  • private[ 私有的成员]:不能随便访问的成员,可以设置一个函数如 Get,Set 等操作该成员,默认情况下,类的所有成员都是私有的,private 成员只能被本类成员(类内)和 友元访问,不能被派生类访问。

  • protected[受保护的成员]:保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的。

  • 静态成员:静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用**范围解析运算符 ( :: )**来重新声明静态变量从而对它进行初始化。静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符( :: )就可以访问。

  • ( . )[ 直接成员访问符 ]:类的对象的公共数据成员可以使用直接成员访问运算符来访问。

  • ( :: )[ 范围解析运算符 ]:类的成员函数可以定义在内部,也可以使用此符定义在外部。

  • ( -> )[ 成员访问运算符 ]:类实例使用成员函数时使用 ( . ),类的引用使用成员函数时使用**( -> )**。

    address = &class_temp
    *address.people;
    address->people;

类的三大特性

封装 就不说了,私有变量外部不能访问,需要用公共函数去操作,保护私有变量。

继承

#include<iostream>
using namespace std;

class Shape{//俗称 基类-父类
public:
    Shape(int w, int h){width = w; height = h;}//构造函数,不能被继承
    void setWidth(int w){ width = w;}
    void setHeight(int h){ height = h;}
protected:
    int width;
    int height;
};//不要忘记这个分号

class Rectangle : public Shape{//公有继承,一定记住加 public,俗称-派生类-子类
public:
    Rectangle(int a=0,b=0):Shape(a,b){} //调用父类的构造函数,因为不能继承嘛。
    int getArea(){return width * height;}
};//不要忘记这个分号
  • 继承:继承默认是 private 继承,但一般用 public 继承,下面介绍原因,支持多继承逗号隔开。一个派生类不能继承基类中的 构造函数、析构函数、构造函数、重载运算符、友元函数

    公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有保护成员来访问。简单点说就是不变,该啥样还是啥样,这也是用的最多的,下面了解即可。

    保护继承(protected): 当一个类派生自保护基类时,基类的公有保护成员将成为派生类的保护成员。

    私有继承(private):当一个类派生自私有基类时,基类的公有保护成员将成为派生类的私有成员。

  • :父类哪些成员子类可以访问?:public,protected。


  • 问:private 继承和 public,protected 继承有区别么?

  • :访问父类成员,要看父类成员的访问修饰符,继承父类成员要看是什么继承,这些成员在子类中的修饰符如何,public 继承不变;protected 继承 private 不变,其余都是 protected;private 继承都变 private;由此可以得出,继承从宽到紧,private > protected > public,默认 private,即继承的类只能自己访问和拥有,不可传播。


多态

  • 虚函数: 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。如果不加,那么子类和父类重名的函数,会优先调用父类的函数。加了,如果子类有重写,那么调用子类,如果子类没有,则还是会调用父类。

  • 纯虚函数(接口,抽象类ABC):既然不会执行,那么可以设置成 纯虚函数,没有函数主体,也不用。但是这个类也就废了,只能被继承了,它是不能实例化的。具有纯虚函数的类的任何派生类也都必须要么定义与该类纯虚函数同名且形参完全相同的函数,要么要在派生类中重新将其定义成纯虚函数。

    区别:两者的区别也很明显,只有虚函数的类不仅可以实例化,也可以调用虚函数。而纯虚函数只能被继承,所以纯虚函数肯定不是 private 的,否则没有意义。

    class Shape {
       public:
          virtual int area(){
             cout << "Parent class area :" <<endl;
             return 0;
          }
        //virtual int area()=0; 既然不会执行,那么可以设置成 纯虚函数,没有函数主体,也不用。
    };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值