面向对象基础

面向对象的三大特征:封装、继承、多态。
封装表示将数据和函数封装在类中,用户通过类的方式调用,只需知道类成员的功能和使用方法,无需了解类的具体实现细节。
继承表示一个类可以另一个类重用。
多态表示同一个成员函数在有继承关系的多个类中具有不同的功能实现。

通过类名调用函数使用:A::Calc。
通过对象名调用函数使用:a.Calc。

类成员有公有成员(public)、保护成员(protected)、私有成员(private)三种。
公有成员可以在类外任意访问。
保护成员只能在类或派生类中访问。
私有成员只能在本类中访问。

内联函数相当于C语言里面的宏,但是宏不能定义数据类型且容易出错。
在类中声明成员函数时使用inline关键字表明为内联函数,调用时自动将代码复制到函数调用处。

static关键字

在C语言中,static关键字用法如下:

  1. 用在函数外用于修饰全局变量和函数,表示具有文件作用域,只能在本文件中使用,不能在其他文件中使用。
  2. 用在函数内部修饰局部变量,表示该变量永久存在,超出函数作用域之外也不会被释放。第一次赋值为初始化,其后保持不变,直到被重新赋值。

在C++中static的用法如下:

  1. 用于修饰类成员变量,表示该变量不属于某个具体的对象,所有对象共享一份数据,都可以修改该变量的值。也可以直接使用类名获取该变量。
  2. 用于修饰类成员函数,通过对象名和类名都可以调用静态成员函数。静态成员函数与具体的类对象无关,在静态类成员函数内部不能使用类的非static成员。

const修饰符用于表示一个变量在初始化之后不能再被修改(read only)。const变量必须在定义的时候就被初始化。常用在函数参数中,表示参数不会被修改。
在传递类对象时,采用传值方式效率较低,一般传递对象的引用,但若使用引用方式,类对象可能背会修改,因此const修饰符可以限定对象为只读。

const修饰成员变量,表示一个变量在初始化之后就不能被修改了。即为一个常量。
const修饰成员函数,表示该函数不能修改类成员变量的值。
const修饰类对象,表示对象为只读,只能调用const成员函数。

#include <iostream>
using namespace std;
class CConst
{
public:
    const int a;
    int b;

    CConst(int _a, int _b):a(_a)  // 初始化列表,多个参数如::a(_a), b(_b)
    {
        b = _b;
    }
    int Sum() const { return a + b; }
    void SetB(const int _b) { this->b = _b; }
};

int main()
{
    CConst c1(20, 30);
    c1.SetB(50);                                      // 非Const对象调用非Const函数
    cout << "非Const对象:" << c1.Sum() << endl;      // 非Const对象调用Const函数
    const CConst c2(20, 30);                          // Const对象
    cout << "Const对象:" << c2.Sum() << endl;        // Const对象只能调用Const函数
    return 0;
}

使用friend关键字在被访问类中声明为friend的类或函数可以访问其私有成员。
使用friend修饰的类、函数成为友元类、友元函数,友元不是类的成员,但能像类的成员函数一样访问类的私有成员。当需要同事访问多个类的私有成员时,适宜使用友元。

派生类的构造函数及其对象的初始化
由于构造函数不能被继承,因此,派生类的构造函数中除了对派生类中数据成员进行初始化外,还必须通过调用直接基类的构造函数来对基类中数据成员初 始化,一般地将,对派生类中数据成员初始化放在该派生类构造函数的函数体内,而调用基类构造函数的基类中数据成员初始化放在该构造函数的成员初始化表中。 派生类构造函数的格式如下表示:
<派生类构造函数名>(<参数表>) : <成员初始化表>
{
<派生类构造函数的函数体>
}
其中,<派生类构造函数名>同该派生类的类名。<成员初始化表>中包含如下的初始化项:
①基类的构造函数,用来给基类中数据成员初始化;
②子对象的类的构造函数,用来给派生类中子对象的数据成员初始化;
③派生类中常成员的初始化。
<派生类构造函数的函数体>用来给派生类中的数据成员初始化。
派生类构造函数的调用顺序如下:
①基类构造函数;
②子对象的构造函数;
③成员初始化表中其他初始化项;
④派生类构造函数的函数体。
在基类中有默认构造函数时,派生类的构造函数中可隐含调用基类中的默认构造函数。

派生类中析构函数
由于析构函数也不能继承,因此派生类的析构函数中将调用直接基类的析构函数。执行派生类析构函数的顺序正好与指向派生类的构造函数的顺序相反。先调用派生类的析构函数,再调用子对象类的析构函数,最后调用直接基类的析构函数。

标签: none

仅有一条评论

  1. 啦啦啦,测试

添加新评论