C++基础知识(1):类

        在C语言阶段,结构体成员只能是它的属性,这个结构体就相当于张三,小时候它只被赋予了名字,性别,家庭住址等属性,但是他没有去做某件事的能力,而C++中呢就相当于他长大了,就可以有骑车,跑步,和别人聊天的能力,这种既可以包含属性,又可以有某些行为的,我们就称它为类。
        在C++中我们选择用关键字class来代替struct,当然struct也是可以继续用的

1.类成员的访问权限

在C++中用class定义的类中,其成员的默认存取权限是private。

类外

派生类

类内

public

Y

Y

Y

protected

N

Y

Y

private

N

N

Y

2.构造函数

构造函数是一种特殊的成员函数,主要功能是为对象分配存储空间,以及为类成员变量赋初值。

  • 构造函数名必须与类名相同
  • 没有任何返回值和返回类型
  • 创建对象自动调用,不需要用户来调用,且只掉用一次
  • 类没有定义任何构造函数,编译系统会自动为这个类生成一个默认的无参构造函数
3.析构函数

析构函数是一种特殊的成员函数,当对象的生命周期结束时,用来释放分配给对象的内存空间爱你,并做一些清理的工作。

  • 析构函数名与类名必须相同。
  • 析构函数名前面必须加一个波浪号~。
  • 没有参数,没有返回值,不能重载。
  • 一个类中只能有一个析构函数。
  • 没有定义析构函数,编译系统会自动为和这个类生成一个默认的析构函数。
4.静态成员

静态成员以关键字static开头的成员为静态成员,多个类共享。

  • static 成员变量属于类,不属于某个具体的对象
  • 静态成员函数只能访问类中静态数据成员
5.友元

借助友元(friend),可以使得其他类中得成员函数以及全局范围内得函数访问当前类得private成员。

友元函数

  • 友元函数不是类的成员函数,所以没有this指针,必须通过参数传递对象。
  • 友元函数中不能直接引用对象成员的名字,只能通过形参传递进来的对象或对象指针来引用该对象的成员。

友元类,当一个类为另一个类的友元时,称这个类为友元类。 友元类的所有成员函数都是另一个类中的友元成员。语法形式:friend [class] 友元类名

  • 类之间的友元关系不能传递
  • 类之间的友元关系是单向的
  • 友元关系不能被继承
6.继承与派生

(1)基类成员在派生类中的访问权限

继承方式/基类成员

public成员

protected成员

private成员

public

public

protected

不可见

protected

protected

protected

不可见

private

private

private

不可见

注意:利用using关键字可以改变基类成员在派生类中的访问权限;using只能修改基类中public和protected成员的访问权限。

class Base
{
public:
    void show();
protected:
    int aa;
    double dd;
};
void Base::show(){
}
class Person:public Base
{
public:
    using Base::aa;//将基类的protected成员变成public
    using Base::dd;//将基类的protected成员变成public
private:
    using Base::show;//将基类的public成员变成private
    string name;
};
int main()
{
    Person *p = new Person();
    p->aa = 12;
    p->dd = 12.3;
    p->show();//出错
    delete p;
    return 0;
}

(2)派生类的构造函数和析构函数

  • 先执行基类的构造函数,随后执行派生类的构造函数
  • 先执行派生类的析构函数,再执行基类的析构函数。
  • 派生类的构造函数,派生类名(总参数列表):基类名(基类参数列表),子对象名1(参数列表){构造函数体;}
class Base
{
public:
    Base(int, double);
    ~Base();
private:
    int aa;
    double dd;
};
Base::Base(int a, double d) :aa(a), dd(d)
{
    cout << "Base Class 构造函数!!!" << endl;
}
Base::~Base()
{
    cout << "Base Class 析构函数!!!" << endl;
}
class Person:public Base
{
public:
    Person(int,double,string);
    ~Person();
private:
    string name;
};
Person::Person(int a,double d,string str):Base(a,d),name(str)
{
    cout << "Person Class 构造函数!!!" << endl;
}
Person::~Person()
{
    cout << "Person Class 析构函数!!!" << endl;
}
int main()
{
    cout << "创建Person对象..." << endl;
    Person *p = new Person(1,2,"yar");
    cout << "删除Person对象...." << endl;
    delete p;
    system("pause");
    return 0;
}

(3)多继承

一个派生类同时继承多个基类的行为。多重继承派生类声明的一般形式:

class 派生类名:继承方式1 基类1,继承方式2 基类2
{
    派生类主体;
};

多重继承派生类的构造函数:

派生类名(总参数列表):基类名1(基类参数列表1),基类名2(基类参数列表2),子对象名1,...(参数列表)
{
    构造函数体;
}

二义性问题:多个基类中有同名成员,出现访问不唯一的问题。

  • 类名::同名成员名;
  • 派生类定义同名成员,访问的就是派生类同名成员。

6.多态

不同的对象可以使用同一个函数名调用不同内容的函数。

  • 静态多态性-在程序编译时系统就决定调用哪个函数,比如函数重载和静态多态性
  • 动态多态性-在程序运行过程中动态确定调用那个函数,通过虚函数实现的。

7.虚函数

实现程序多态性的一个重要手段,使用基类对象指针访问派生类对象的同名函数。

  • 将基类中的函数声明为虚函数,派生类中的同名函数自动为虚函数。
  • 声明形式:virtual 函数类型 函数名 (参数列表);
  • 构造函数不能声明为虚函数,析构函数可以声明为虚函数。

8.纯虚函数

在基类中不执行具体的操作,只为派生类提供统一结构的虚函数,将其声明为虚函数。

声明形式:virtual 函数类型 函数名 () = 0;

9.抽象类

包含纯虚函数的类称为抽象类。由于纯虚函数不能被调用,所以不能利用抽象类创建对象,又称抽象基类。

猜你喜欢

转载自blog.csdn.net/weixin_55238862/article/details/135324303
今日推荐