商务服务
C++ 笔记
2024-12-16 13:19

公有成员

        对其对象是可见的

        继承时,对派生类是可见的

保护成员

        对其对象不可见,等同于私有成员

        继承时,对派生类是可见的

私有成员

        对其对象不可见。

        继承时,对派生类是不可见的。(派生类新增加的成员函数不能访问基类的私有成员,但继承基类的成员函数可以访问

保护成员,在不继承时等同于私有成员。当在继承时,等同于公有成员。

对于对象,只有公有成员可见。

        当创建一个派生类对象时,系统会自动创建一个基类对象。在调用派生类构造函数创建派生类对象之前,系统会先调用基类的构造函数创建基类对象。当派生类对象生命周期结束,首先调用派生类的析构函数,然后调用基类的析构函数。

        如果基类拥有构造函数但是没有默认的构造函数,那么派生类的构造函数必须显示的调用基类的某个构造函数。

        在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的情况发生,基类的析构函数必须为虚函数。

        基类的指针指向派生类的对象,指向的是派生类中基类的部分。所以只能操作派生类中从基类中继承过来的数据和基类自身的数据。

  1.  :独占资源所有权的指针。
  2.  :共享资源所有权的指针。

简单说,当我们独占资源的所有权的时候,可以使用 std::unique_ptr 对资源进行管理——离开 unique_ptr 对象的作用域时,会自动释放资源。

shared_ptr通过引用计数,来控制共享资源的释放。

shared_ptr 需要维护的信息有两部分

  1. 指向共享资源的指针。
  2. 引用计数等共享资源的控制信息——实现上是维护一个指向控制信息的指针。

所以,shared_ptr 对象需要保存两个指针。shared_ptr 的 的 deleter 是保存在控制信息中,所以,是否有自定义 deleter 不影响 shared_ptr 对象的大小。

派生类的地址或者指针赋值给基类指针时,可以隐式转换,也可以使用static_cast显示转换,不过一般都用隐式转换。

倒过来,基类指针赋值给派生类指针的时候必须要显示转换。这个转换,使用dynamic_cast或者static_cast都不会报错。

static_cast是在编译期进行转换。而dynamic_cast可以在运行的时候,对地址的实际类型进行检测,当不能转换的时候,将会返回一个nullptr值。

基类和派生类的智能指针转换要使用std::dynamic_pointer_caststd::static_pointer_cast。由于std::dynamic_pointer_castdynamic_cast原理一样std::static_pointer_caststatic_cast原理一样。

        在类中,static成员数据,成员函数,不依赖于对象。可以认为他们是全局存在的。因此static数据不应在对象的构造函数初始化。且static成员函数不能访问类的非静态数据,因为static成员函数执行时,非静态数据可能还不存在。

        在类定义体中由关键字friend加以修饰说明的非成员函数,在它的函数体中能够通过该类的对象来访问类中的private/protected成员。在友员函数体内可以利用对象访问类中的private成员,但非成员函数则不能

class Window
{public: Window(int x, int y, int h, int w)
    { X=x , Y=y , H=h , W=w
    }
    friend long Area(Window & WinObj) ; //在类中定义出友员函数的原型
    int getH()
    { return H
    }
    int getW()
    { return W
    }
    private: int X,Y,H,W
}
long Area(Window & WinObj) //在类外定义出友员函数的函数体
{ return (long)WinObj.H*WinObj.W
}

        友员类一个类为另一个类的友员类---此类的所有成员函数都能访问对方类的私有成员。应用目的:在类的封装和共享两方面合理选择---类的主要优点是实现数据隐藏与保护,从而将数据与方法相互组合产生独立的代码块,但这样将使各个类相互孤立,无法实现类之间的共享。但在应用需求中可能要实现多个类之间的共享,这可以采用友元类的方式来实现。

        C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板。模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

//template 关键字告诉C++编译器 要开始泛型编程了 //T - 参数化数据类型

template <typename T>

T Max(T a, T b)

{ return a > b ? a : b; }

        类模板与函数模板的定义和使用类似,有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,我们可以通过如下面语句声明了一个类模板

template <typename T>

class A

{

    public:

        A(T t){

        this->t = t;

        } 

       T& getT(){

            return t;

        }

    public:

        T t;

};

        运算符重载是什么?使对象操作更美观的技术。运算符重载是一种形式的c++多态。要重载运算符,需使用被称为运算符函数的特殊函数形式。

运算符函数的格式如下

        operatop( argument-list)

        例如,operator+() 重载+运算符
           operator*()重载*运算符
 
        op必须是有效的c++运算符,不能虚构一个新的符号

以下运算符不能重载

    sizeof
    .   成员运算符
    .*   成员指针运算符
    ::   作用域解析运算符
    ?:   条件运算符
    typeid   一个RTTI运算符
    const_cast   强制类型转换运算符
    dynamic_cast   强制类型转换运算符
    reinterpret_cast   强制类型转换运算符
    static_cast   强制类型转换运算符
下列运算符只能通过成员函数进行重载
    =:赋值运算符
  :函数调用运算符
    []:下标运算符
    ->:通过指针访问类成员的运算符

        虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。

虚函数表

        对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

        这里我们着重看一下这张虚函数表。在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。 这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。

        构造函数不能为虚函数,因为构造函数执行的时候,虚函数表还没有建好。

    以上就是本篇文章【C++ 笔记】的全部内容了,欢迎阅览 ! 文章地址:http://keair.bhha.com.cn/news/4636.html 
     文章      相关文章      动态      同类文章      热门文章      栏目首页      网站地图      返回首页 康宝晨移动站 http://keair.bhha.com.cn/mobile/ , 查看更多   
最新文章
5款文案自动生成器,高质量创意文案一键为你生成
  在当今竞争激烈的内容创作领域,每一个字、每一句话都承载着巨大的价值。对于创作者而言,文案自动生成器的出现
SEO搜索引擎优化怎么做?全面指南让你快速上手!
在当今的数字化时代,SEO(搜索引擎优化)已经成为企业和个人提升在线存在感和吸引目标用户的关键手段。无论你是初学者还是有经
Apple 苹果 iPhone 13系列 A2634 5G手机 256GB 绿色
iPhone 13 边缘采用平坦设计、配备独家超瓷晶面板,支持 IP68 抗水性能,拥有绿色、粉色、蓝色、午夜色、星光色和红色可选择。屏
【A6搜狗手机输入法下载】海尔A6搜狗手机输入法12.1.1免费下载
搜狗输入法,拥有超大中文词库,输入更加精准,智能。搜狗智能旺仔带你用表达,斗图,妙语,输入更加有趣。******特色功能******
制氧机十大品牌排行榜:吸氧机技术排名TOP 3
制氧机是一种重要的医疗设备,用于治疗呼吸系统疾病。随着科技的不断发展,市场上出现了众多品牌的制氧机,伴随着人们对健康的重
【瑕疵检测】基于matlab GUI OTSU织物疵点检测【含Matlab源码 860期】
⛳️座右铭:行百里者,半于九十。 更多Matlab图像处理仿真内容点击👇 ①Matlab图像处理(进阶版ÿ
微信公众号文章信息(阅读量、在看、点赞数)获取
  实现这一个功能主要用到了selenium、mitmproxy和wechatarticles,利用selenium可以实现脚本模拟浏览器访问,mit
上海九院口腔科怎么样?医生排名名单、技术特长介绍、真人种牙术后评价~
此价格信息为当地市场参考价,通过用户反馈大数据整理仅供参考!机构实际价格以到院面诊为准!
'智能AI文章生成器:海外脚本与一键创作工具'
在数字化时代的浪潮中人工智能技术正以前所未有的速度改变着咱们的工作和生活途径。智能文章生成器的出现无疑为内容创作者们打开
微信推文重复率
论文免费查重庞大的数据库支持,论文免费查重拥有全球最大的比对库资源。其比对库拥有超过1亿篇的学术期刊和学位论文、1000多家的
相关文章