C++基础

文章介绍了C++中的面向对象编程概念,包括类与对象的定义,以及面向对象的三大特性:封装、继承和多态。通过实例展示了如何创建类、实例化对象,并解释了构造函数和析构函数的作用。此外,还提到了this指针在成员函数中的使用,用于访问对象的数据成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++面向对象

一、类和对象

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

打个比方说明一下什么是类,比如有一条小狗,小狗有名字叫旺财,旺财的年龄是 2 岁, 同时旺财会汪汪的叫,也能跑。我们统称狗这个为类,类是我们抽象出来的,因为狗不只有上 面的属性,还有体重,毛发的颜色等等,我们只抽象出几种属性成一个类。具体到哪条狗就叫 对象。

类与对象的思想

面向对象的特点:封装、继承、多态

面向对象编程的特点:

(1)易维护:可读性高,即使改变了需求,由于继承的存在,只需要对局部模块进行修改,维护起来非常方便,维护的成本也比较低。

(2)质量高:可以重用以前项目中已经被测试过的类,使系统满足业务需求从而具有更高的质量

(3)效率高:在软件开发时,根据设计的需求要对现实世界的事物进行抽象,从而产生了类

(4)易扩展:由于继承、封装、多态的特性,可设计出高内聚、低耦合的系统结构,使系统更加灵活、更容易扩展,而且成本也比较低。

 从类中实例化对象分两种方法,一种是从栈中实例化对象一种是从堆中实例化对象。

 下面以自定义狗类介绍如何自定义类和如何使用对象。

#include <iostream>
#include <string.h>

using namespace std;

class Dog    //创建一个类
{
public:  //访问限定符 public(公有的),此外还有 private(私有的)和 protected(受保护的)。
         //写这个的目的是为了下面我们要调用这些成员,不写访问限定符默认是 private。简单的来说,访 
         //问限定符就是设置一个成员变量和成员函数的访问权限而已
    string name;   //string 是 C++的数据类型,方便好用,使用频率相当高。
    int age;

    void run()
    {
        cout << "小狗的名字是:" <<name<<","<<"年龄是"<<age<<endl;
    }

};


int main(int argc, char const *argv[])
{
    Dog dog1;   //从栈中实例化一个对象

    dog1.name = "旺财";
    dog1.age = 2;
    dog1.run();

    Dog *dog2 = new Dog();  //从堆中实例化一个对象
    
    if (dog2 == NULL)
    {
       return 0;
    }
    
    dog2->name = "富贵";
    dog2->age = 1;
    dog2->run();

    delete dog2;   //删除从堆空间申请的内存
    dog2 = NULL;
    
    return 0;
}

编译完成后执行的结果如下。

二、构造函数与析构函数

什么是构造函数?

构造函数在对象实例化时被系统自动调用,仅且调用一次。构造函数出 现在哪里?前面我们学过类,实际上定义类时,如果没有定义构造函数和析构函数,编译器就 会生成一个构造函数和析构函数,只是这个构造和析构函数什么事情也不做,所以我们不会注 意到一点。

 构造函数的特点如下:

(1) 构造函数必须与类名同名;

(2) 可以重载,(重载?新概念,后面学到什么是重载。);

(3) 没有返回类型,即使是 void 也不行。

 什么是析构函数?

与构造函数相反,在对象结束其生命周期时系统自动执行析构函数。实 际上定义类时,编译器会生成一个析构函数。

 析构函数的特点如下:

(1) 析构函数的格式为~类名();

(2) 调用时释放内存(资源);

(3) ~类名()不能加参数;

  (4) 没有返回值,即使是 void 也不行。

通过简单的例子来说明构造函数和析构函数的使用

#include <iostream>
#include <string.h>

using namespace std;

class Dog
{
public:
   Dog();     //构造函数
   ~Dog();    //析构函数

};

int main(int argc, char const *argv[])
{
    Dog dog;
    cout<<"构造与析构函数示例"<<endl;
    return 0;
}

Dog::Dog()
{
    cout<<"构造函数执行!"<<endl;
}

Dog::~Dog()
{
    cout<<"析构函数执行!"<<endl;
}

编译完成后执行的结果如下。

其实执行的结果也是可以预测的,在对象实例化时会调用构造函数,所以 Dog()先执行, 然后再在 main()函数里继续执行 cout<<"构造与析构函数示例"<<endl;  最后对象生命周期结束时才会执行析构函数。

三、 this 指针

一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么 成员函数如何知道要访问哪个对象的数据成员呢?

就是通过 this 指针。每个对象都拥有一个 this 指针,this 指针记录对象的内存地址。 在 C++中,this 指针是指向类自身数据的指针,简单的来说就是指向当前类的当前实例对象。

 关于类的 this 指针有以下特点:

  • (1) this 只能在成员函数中使用,全局函数、静态函数都不能使用 this。实际上,成员函数 默认第一个参数为 T * const this。也就是一个类里面的成员了函数 int func(int p),func 的原 型在编译器看来应该是 int func(T * const this,int p)。
  • (2) this 在成员函数的开始前构造,在成员函数的结束后清除。
  • (3) this 指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全 局变量。

下面以简单的例子来说明 this 的用法。我们还是以狗类为例,按上面的 this 解释,this 只 能够在成员函数使用,并可以指向自身数据。

#include <iostream>
#include <string.h>

using namespace std;

class Dog
{
public:
    string name;
    void func();
};


int main(int argc, char const *argv[])
{
    Dog dog;
    dog.func();

    return 0;
}

void Dog::func()
{
    this->name = "旺财";
    cout<<"小狗的名字叫:"<<this->name<<endl;
}

程序执行的结果如下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值