C++三大特性及应用

news2025/1/13 15:33:14

C++三大特性

面向对象程序设计(OOP)是一种编程范式,它使用“对象”来设计软件。在OOP中,对象是类的实例,类包含数据(属性)和可以对数据执行操作的方法(行为)。

面向对象的核心概念包括封装、继承和多态(C++三大特性)。

什么是类?

在C++中,类是一种用户定义的数据类型,它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态,而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图,根据这个蓝图可以创建对象,这些对象在内存中是类的实例。

比如说,我们可以定义一个Car类来表示汽车。这个类可以有数据成员如brand、color和maxSpeed来存储汽车的品牌、颜色和最高速度等属性。同时,Car类可能有函数成员如accelerate()和brake()来定义汽车加速和刹车的操作。

在现实生活中,每辆汽车都是根据汽车制造商设计的蓝图制造出来的,蓝图定义了汽车的特性和功能,类似地,在编程中,我们根据类创建对象来表示现实世界中的各种事物和概念。

class A
{
private:
    int a;
public:
    void print()
    {
        cout << "a=" << a << endl;
    }
    A(int a)
    {
        this->a = a;
    }
};

封装

封装(encapsulation):是指将数据(属性)和操作数据的代码(方法)打包在一起,形成一个独立的对象。这样可以隐藏对象的内部细节,只暴露必要的操作接口。比如,一个汽车对象封装了引擎、变速器等细节,只提供加速和刹车等接口。

封装实际就是为类中的函数和变量设置访问权限。访问权限包括public,private,protect。其中类对象的默认访问控制权限为private。

(1)public(共有),所有类均可访问

(2)protected(保护),可以被自身和子类访问

(3)private(私有),只能自身和友元函数访问

说明:

(1)public成员可以在类外直接访问。

(2)protected和private成员在类外(在此将这两种限定符都可以看成是私有的,在继承出区别)不能够访问。

(3)它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。

(4)class的默认访问权限是private,而struct为public型(因为struct要兼容C)。C++常用的是class

(5)类外:即脱离了类的作用域或者说访问时不在类的成员函数中。

继承

继承:继承是面向对象软件技术当中的一个概念。如果一个类B继承自另一个类A,就把这个B称为A的子类,而把A称为B的父类。**继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。

子类继承基类后,可以创建子类对象来调用基类函数,变量等。继承包括以下形式:

(1)单一继承:继承一个父类,这种继承称为单一继承,一般情况尽量使用单一继承,使用多重继承容易造成混乱易出问题

(2)多重继承:继承多个父类,通过逗号进行分隔可以让派生类指定多个基类。例如 狗:public 哺乳动物,public 犬科动物

(3)菱形继承:多重继承掺杂隔代继承1-n-1模式,此时需要用到虚继承,例如 B,C虚拟继承于A,D再多重继承B,C,否则会出错

继承的代码表示为:

class B : public A
{
private:
    int b;
public:
    void print()
    {
        cout << "b=" << b << endl;
    }
    B(int a, int b) : A(a)
    {
        this->b = b;
    }
};

继承方式规定了如何访问继承的基类的成员。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限

继承权限:子类继承基类除构造和析构函数、基类的重载运算符、基类的友元函数以外的所有成员,继承可以扩展已存在的代码,目的也是为了代码重用。

另外,继承可分为接口继承和实现继承:

(1)普通成员函数的接口总是会被继承:  子类继承一份接口和一份强制实现

(2)普通虚函数被子类重写     :  子类继承一份接口和一份缺省实现

(3)纯虚函数只能被子类继承接口  :  子类继承一份接口,没有继承实现

访问权限图如下:

友元函数是C++中的一个概念,它允许某些非成员函数访问类的私有成员和保护成员,这通常是为了提高程序的运行效率。友元函数虽然在语法上看起来像普通的函数,但在定义时需要在类体内使用关键字friend进行说明,以表明它不是该类的成员函数,但可以访问类的私有和保护成员。(1)(2)

友元函数的特点和注意事项如下:

  • 特点。友元函数可以访问类中的私有和保护成员,这使得它在某些情况下比类的成员函数更灵活。然而,这也意味着它可能会破坏类的封装性,因为非成员函数现在可以直接访问类的私有部分。

  • 注意事项。友元函数在类中的声明位置(如private、protected、public区域)并不影响其访问权限,友元函数可以在任何位置定义,并且不需要是类的成员函数。友元函数也不能被继承,即父类的友元函数不会自动成为子类的友元函数。

另外,友元关系不具有对称性和传递性,这意味着如果A是B的友元,那么B不一定是A的友元,且A和B的友元关系不会传递到其他类。总的来说,友元函数是一种在特定情况下提高程序效率的工具,但使用时需要权衡其对封装性的影响。

" 友元函数 " 中 , 需要有一个参数是 类对象的 指针 ;

问题1:下面的代码会输出什么?

void main()
{
    A a1(1);
    B b1(2,3);
    a1.print();//输出啥?1
    b1.print(); //输出啥?3
    system("pause");
}

void main()
{
    A a1(1);
    B b1(2,3);
    A *base1 = NULL;
    base1 = &a1;
    base1->print();  //父类  1
    A *base2 = NULL;
    base2 = &b1;
    base2->print();   //父类  2
    A &base3 = a1;
    base3.print();   //父类  1
    A &base4 = b1;
    base4.print();   // 父类  2

    system("pause");
}

多态

但是这不是我想要的,我希望的是,可以输出对应类的print()

希望编译器根据实际的对象类型来判断重写函数的调用

如果父类指针指向的是父类对象则调用父类中定义的函数

如果父类指针指向的是子类对象则调用子类中定义的函数

因此就出现了面向对象的多态概念。

多态(Polymorphisn):不同类的对象可以通过同一接口调用,具有不同的行为。例如,如果有一个函数接受车辆类的对象,那么任何车辆的子类对象,如汽车或摩托车,都可以使用该函数,但具体的行为会根据对象的实际类型而有所不同。多态性在C++中都是通过虚函数(Virtual Function)实现的。虚函数就是允许被其子类重新定义的成员函数,用virtual修饰。而子类重新定义父类虚函数的做法,称为“覆盖”或者称为“重写”(override)。

ps:虚函数是在函数前加了virtual的函数;纯虚函数是前面加了virtual,同时函数被=0的函数,纯虚函数不能被调用

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。简单地说,多态意味着单个函数可以有多个不同的实现。

解决方案:在同名的成员前,加上virtual。

  • C++中通过virtual关键字对多态进行支持

  • 使用virtual声明的函数被重写后即可展现多态特性

改写上面的例子:

#include <iostream>
using namespace std;
class A
{
private:
    int a;
public:
    virtual void print()
    {
        cout << "a=" << a << endl;
    }
    A(int a)
    {
        this->a = a;
    }
};
class B : public A
{
private:
    int b;
public:
    virtual void print()
    {
        cout << "b=" << b << endl;
    }
    B(int a, int b) : A(a)
    {
        this->b = b;
    }
};

void main()
{
    A a1(1);
    B b1(2,3);    
    A *base1 = NULL;
    base1 = &a1;
    base1->print();   //1
    A *base2 = NULL;
    base2 = &b1;
    base2->print();   //3
    A &base3 = a1;
    base3.print();  //1
    A &base4 = b1;
    base4.print();  //  3

    system("pause");
}

多态是基于虚函数来实现的。多态实现的三大条件:

(1)要有继承

(2)要有虚函数重写(被调用的函数必须是虚函数,且完成了虚函数的重写)

(3)父类指针或引用指向子类对象

#include <iostream>
class Person 
{
public:
    virtual void BuyTicket(int)
    {        std::cout << "Adult need Full Fare!" << std::endl;
    }   
};

class Child : public Person
{
public:
    virtual void BuyTicket(int)
    {        std::cout << "Child Free!" << std::endl;
    }   
};

void fun(Person& obj)
{
    obj.BuyTicket(1);                                                                                                                             
}

int main(void)
{
    Person p;
    Child c;

    fun(p);
    fun(c);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 合并两个有序链表我们的思路是创建一个新链表&#xff0c;然后遍历已知的两个有序链表&#xff0c;并比较其节点的val值&#xff0c;将小的尾插到新链表中&#xff0c;然后继续遍历&#xff0c;直到将该两个链表…

请求路径引发的http308错误

记录一个请求路径输错引发的问题。 正确路径&#xff1a; /user/bind-email 请求路径我们如果输错故意多打一个s /user/bind-emails 正常预检请求会报错404未找到&#xff0c;我们下意识的就去排查路径是不是写错了 但是如果多打一个/ /user//bind-email 此时预检请求会报308永…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL&#xff08;selector&#xff09;IMP&#xff08;implementation&#xff09;IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

做国外数据采集,更改ip后还被封是ip质量的原因吗?

IP质量低确实会出现封锁情况&#xff0c;但不是唯一的因素。 高质量的IP地址通常不容易被锁定&#xff0c;因为他们往往是由正规的ISP&#xff08;互联网服务商&#xff09;。但是&#xff0c;即使是高质量的IP地址&#xff0c;也有可能受其他因素影响导致封锁&#xff0c;如滥…

详解封装,继承,多态

java是一种面向对象的编程语言。 面向对象&#xff1a;是把构成问题的事务分解成各个对象&#xff0c;而建立对象的目的也不是为了完成一个个步骤&#xff0c;而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性&#xff0c;所以易维…

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…

【论文阅读】ChipNeMo中的领域适配检索模型

前面先总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》。然后发现文章中还有细节需要继续学习&#xff0c;前一篇看了领域适配分词&#xff0c;今天接着看领域数据微调的预训练检索模型。 领域适配检索模型 众所周知&#xff0c;LLM 可以生成不准确的文本&…

DVWA靶场

DVWA是指Damn Vulnerable Web Application&#xff0c;是一个用于教育和训练网络安全人员的虚拟漏洞应用程序。DVWA模拟了一个包含了多种常见Web安全漏洞的虚拟环境&#xff0c;包括SQL注入、XSS攻击、CSRF攻击等等。通过使用DVWA&#xff0c;安全人员可以学习和实践各种Web安全…

科研学习|论文解读——CVPR 2021 人脸造假检测(论文合集)

随着图像合成技术的成熟&#xff0c;利用一张人脸照片合成假视频/不良视频现象越来越多&#xff0c;严重侵犯个人隐私、妨碍司法公正&#xff0c;所以人脸造假检测越来越重要&#xff0c;学术界的论文也越来越多。 一、研究1 1.1 论文题目 Multi-attentional Deepfake Detecti…

从零开始构建大语言模型(MEAP)

原文&#xff1a;annas-archive.org/md5/c19a4ef8ab1664a3c5a59d52651430e2 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、理解大型语言模型 本章包括 大型语言模型&#xff08;LLM&#xff09;背后的基本概念的高层次解释 探索 ChatGPT 类 LLM 源自的 Transfo…

第二证券投资参考:汽车以旧换新细则发布 云厂商AI投资持续加码

上星期五&#xff0c;A股放量大涨。两市股指盘中单边上行&#xff0c;午后再度攀升&#xff0c;沪指涨超1%&#xff0c;创业板指大涨超3%&#xff1b;到收盘&#xff0c;沪指涨1.17%报3088.64点&#xff0c;深证成指涨2.15%报9463.91点&#xff1b;创业板指涨3.34%报1823.74点&…

git 的迁移

现象是gitlab经常会挂掉&#xff0c;linux会显示磁盘空间不足&#xff0c;实际上&#xff0c;我们linux某个目录的空间是4T。这个空间应该是足够的。猜测是gitlab的安装目录不对导致的空间不足。 1、查找原因 用rpm 安装gitlab会有自己的目录&#xff0c;很多安装文件会在opt…

当非遗遇上全身动作捕捉设备,创新非遗文化传承形式

随着全身动作捕捉设备不断革新&#xff0c;越来越多行业运用全身动作捕捉设备保护并传承非遗文化&#xff0c;如越剧、戏曲、武术等非遗项目&#xff0c;可以通过全身动作捕捉设备实时动态采集非遗演绎数据&#xff0c;搭建非遗数据框架&#xff0c;使传统戏剧、游艺与杂技等多…

【收藏全开源】JAVA智慧社区系统粉丝生活同款系统支持跑腿家政本地生活上门服务商城支持微信小程序+微信公众号+H5+APP_博纳软云

JAVA智慧社区系统&#xff1a;打造一站式本地生活服务新体验 在现代快节奏的生活中&#xff0c;社区服务的便捷性愈发受到重视。我们倾心打造的JAVA智慧社区系统&#xff0c;正是为了满足居民对高效、便捷社区服务的期待。该系统不仅融合了粉丝生活同款系统的优秀元素&#xf…

今年做电商,视频号小店可以冲一下,这次腾讯不负所望站在了风口

腾讯做电商&#xff0c;能不能搞&#xff1f; 对于腾讯做电商这件事&#xff0c;很多玩家并不看好&#xff0c;毕竟腾讯想做的东西太多了&#xff0c;做电商这件事也曾失败过&#xff1b; 但是这次&#xff0c;无论是电商老玩家还是新手玩家&#xff0c;腾讯推出的视频号小店…

AI智能体崛起:未来挑战与机遇解析

随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们生活中的一部分。而在众多AI应用中&#xff0c;Agent AI智能体因其高度的自主性、交互性和智能化水平&#xff0c;被广泛应用于各种场景。在未来社会中&#xff0c;Agent AI智能体的角色将会如何定位…

Java 写一个死锁的例子

public class DeadLock {public static void main(String[] args) {Object lock1 new Object();Object lock2 new Object();new Thread(new A(lock1,lock2),"线程A").start();new Thread(new B(lock1,lock2),"线程B").start();} }class A implements Run…

【探索Linux】P.33(HTTP协议)

阅读导航 引言一、认识URL二、URL编码和解码1. Urlencode&#xff08;URL编码&#xff09;2. Urldecode&#xff08;URL解码&#xff09; 三、HTTP的方法四、HTTP的状态码五、HTTP常见Header六、最简单的HTTP服务器温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了“自…

【CAN】知识点:帧类型、数据帧结构、传输速率、位时间、采样点

1、帧类型 CAN (Controller Area Network) 帧格式是为了高效、可靠地在多个节点间传输数据而设计的。CAN 帧有几种类型,包括数据帧(标准帧和扩展帧)、远程帧、错误帧和过载帧,其中数据帧和远程帧是最常用的。 2、数据帧 数据帧包括:标准帧和扩展帧。 两者的主要区别: …