C++类的“包含”机制

C++中extern “C”深层探索 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。C引用C++函数例子工程中包含的三个文件的源代码如下://C++头文件 cppExample.h#endif。 阅读详情
//何为“包含”,其实说白了就是一个类可以包含另一个类的对象,即如下程序所示:
class A

{

                   //...

 

};

 

class B

{

                   //...

    A a;

    A b;

};

在上面这个程序中,我们定义了类A和类B。其中类B里面我们定义了类A的两个对象a和b。这样的情况就叫类B包含了类A。下面,我们用一个程序来看一下“包含”:

#include <iostream>

using namespace std;

class A

{

public:

    A(int i){x=i;cout<<"调用A类的构造函数\n";}

    ~A(){cout<<"调用A类的析构函数\n";};

    void get() {cout<<"A类中X的值为:"<<x<<endl;}

private:

    int x;

};

 

class B

{

public:

    B(int i,int j,int k):a(i),b(j),y(k){cout<<"调用B类的构造函数\n";}

    A geta(){return a;}

    A getb(){return b;}

    ~B(){cout<<"调用B类的析构函数\n";}

    void gety(){cout<<"B类中y的值为:"<<y<<endl;}

private:

    A a;

    A b;

    int y;

};

 

int main()

{

    B b(1,2,3);

    b.geta().get();

    b.getb().get();

    b.gety();

    return 0;

}


首先是对两个类进行分析:在上面这个程序中,我们定义了两个类A和B。其中可以看到,在类B的私有成员变量里面,我们定义了一个类B自己的成员变量,另外还定义了两个类A的对象a和b(22行和23行);另外在类B的公有函数中,我们定义了两个返回值为类A的函数:geta()和getb(),它们的作用就是返回在类B中定义的两个类A的对象a和b。在这里我们特别应该注意的是类B的构造函数:

B(int i,int j,int k):a(i),b(j),y(k){cout<<"调用B类的构造函数\n";}


 

这个构造函数很有意思。我们可以看到它不仅初始化了自己的私有成员变量y,而且也顺带初始化了类A的两个对象a和b。那么它肯定会调用类A的构造函数,而且会调用两次。然后再调用一次B类自己的构造函数。那么析构的时候顺序应该就是相反的,首先调用B类的析构函数,然后再调用两次A类的析构函数。我们可以看到后面的程序输出图这样说滴,^_^。(见输出的红色框和黄色框)

  • 现在我们再来看一看主函数中的东东。首先在程序的第29行,我们定义了B类的对象b,并调用了A类和B类的构造函数初始化了类A的对象a、b和类B的对象b。然后在程序的第30行我们就可以看到在博文一开始介绍的Qt中的东东。这里我们就搞不懂了,它们到底是干啥用的,什么都不说了,先看一下运行结果:

          我们可以看到,返回的类A的对象a中x的值为1,另外一个类A的对象b中x的值为2。好了,豁然开朗了,我们来解释一下程序第30行和31行。第29行用类B的对象b来调用成员函数geta(),该函数是在17行定义的,作用就是返回类A的对象a,因此第30行

    b.geta().get();


    就相当于

    A a(1);
    
    a.get();

    这里的原因就是,因为b.geta()返回的是x的成员值为1的对象a,所以再调用类A的get()函数就可以省略了对象a了。那么同理,程序第31行就相当于

    A b(2);
    
    b.get();


    这就说明了类B可以通过成员函数来访问被包含的类A对象的成员变量。就是文章一开始提到的方式,其实它是隐藏了声明类A的对象,因为由于包含的原因,类B已经帮类A搞定了对象的声明了

C++ 包含类两个类互相调用彼此的类成员变量和方法 C++,C 包含类两个类互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的类对象,简单易懂 立即下载

相关推荐

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 381

c++ A类包含B类指针,B类包含A类指针的情况

#include&lt;stdio.h&gt; class Bclass; class Aclass { public: friend Bclass; void func() { pB-&gt;funcB(); } int data; Bclass* pB; }; class Bcla...

weixin_34064653的博客 633

二阶系统的带宽(频域分析)

下面以典型I型系统为例,计算系统的开环截止频率和闭环截止频率。设I型系统为: 1:系统的开环截止频率为 2:系统的闭环截止频率 其实我们在工程整定时,把ζ = 0.707,也把系统的带宽近视看成自然震荡角频率即 (wb≈wc≈wnw_{b}\approx w_{c}\approx w_{n}wb​≈wc​≈wn​)对于二阶系统。 ...

wanrenqi的博客 2万+

python去空格函数_python练习题:利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法...

方法一:# -*- coding: utf-8 -*-# 利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:def trim(s):while s[:1] == ' ':s = s[1:]while s[-1:] == ' ':s = s[0:-1]return s# 测试:if trim('hello ') != 'hello':print(...

weixin_39975055的博客 251

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 110

单细胞转录组数据质控实战:如何用Seurat精准过滤低质量细胞(附完整代码)

本文详细介绍了使用Seurat进行单细胞转录组数据质控的实战方法,包括基因检出数、分子计数和线粒体基因比例等关键指标的解读与可视化技巧。通过动态阈值策略和高级质控技巧(如双细胞检测和红细胞过滤),帮助研究者精准过滤低质量细胞,提升数据分析可靠性。附完整代码示例,适合生物信息学研究人员参考实践。

ii567的博客 825

C++ 类的包含

C++ 类的包含详解

Aaron__Peng的博客 1526

android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测

MindSpore作为一个端边云协同的开源的全场景AI框架,今年3月份开源以来,受到了业界的广泛关注和应用,欢迎大家参与开源贡献、模型众智合作、行业创新与应用、学术合作等,贡献您在云侧、端侧 (HiMindSpore 应用程序)、边侧以及安全领域的应用案例。MindSpore与您在AI领域共同成长,让AI使能千行百业,释放出强大的生产力。本文讲述的是MindSpore对篮球运动员目标的检测应用,通...

weixin_33603813的博客 835

c++ STL set集合中包含的函数及其应用(一)

set简介: set是STL中一种标准关联容器,它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_differ...

Light2Chasers的博客 2628

【系统架构设计师】2025年下半年真题论文回忆版及写作要点

本文摘要围绕云原生数据库、性能测试、无服务器架构和秒杀场景等关键技术进行论述。云原生数据库通过容器化、微服务和自动化运维实现弹性扩展;性能测试需要规划测试场景并关注响应时间等关键指标;无服务器架构以事件驱动为核心,简化开发流程;秒杀场景需组合运用扩容、缓存、限流等技术应对高并发。这些技术方案为构建现代高可用系统提供了重要参考。

数据知道的博客 6160

【机器人学】常用的小车底盘运动学模型推导(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对小车底盘运动学模型介绍做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容对于小车的分析,仅仅考虑XY轴的线速度和Z轴的角速度,不考虑和横滚和俯仰的速度,【防盗标记–盒子君hzj】也不考虑Z轴的高度变化【即:车底盘的运动可以用三个独立变量来描述:x轴平动、y轴平动、yaw轴转动】

qq_35635374的博客 1932

c++检测a字符串是否包含b字符串_Python编程基础—字符串

字符串是python中最常用的数据类型。一、字符串定义方法我们可以使用单引号(' ')或者双引号(" ")来创建字符串。创建字符串只要为变量分配一个值即可,可以使用print()函数显示字符串字面量。a="123" b="字符串" print(a) print(b)a="123" type(a)单引号和双引号还可以同时使用,但是不可以混用print('老师说:"好好学习,天天向上"')print(...

weixin_39551188的博客 432

点云统计滤波 (python详细过程版)【2025最新版】

统计滤波python详细过程版,博客长期更新,本文最近更新时间为:2025年1月12日。

点云侠的博客 5639

谈谈:C++类的“包含”机制

http://www.cnblogs.com/uniqueliu/archive/2011/08/01/2124261.html      本人在学习Qt的时候发现了一个非常有趣的现象。有很多函数的调用方法都写成了如下的形式: ? object.func().func2();   这令小弟着实不懂。在上面这

yarsen的专栏 1192

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++ 在类中包含另一个类

除了继承关系外,另一种常用的关系是包含关系,一个类中包含了另一个类实例化的对象作为数据成员。 class Subtarget{ Subtarget(int Parameter1, int Parameter2){}; } //定义一个类Subtarget,在其他类中可以像使用内置类型一样将该类的对象作为成员对象 class Target{ std::shared_ptr<Subtarget> subtarget_=nullptr; //方法一 (优选)

yly的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【c++】cpp类和对象

c++中类和对象基本用法

hutaotaotao的博客 1270

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

c++的类的前置声明,类的互相包含

C++类的前置声明 一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:  class B; class A{       public:           B b; }; class B{       public:           ...

u012230798的博客 1531

【c++】cpp类的继承

c++类的继承

hutaotaotao的博客 2299

C++类的前置声明和头文件包含

一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的: class B; class A{ public: B b; }; class B{ public: A a; }; 因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的,在这里我们只需要把其中的一个A

DayDayUp 2460

C++实战:类的包含编译模型

本实战通过实例演示了C++普通类与模板类的编译模型:普通类实现接口与功能分离,编译时链接合并;模板类则在编译时期根据传入类型生成具体代码,定义与实现常置于同一头文件中。通过创建、编译和运行包含普通类`Student`及模板类`Base`的程序,直观展示了模块化编程和模板机制的应用实践。

howard2005的专栏 1365

【C++】你对“string类”的了解又有多少呢?

一. string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作(精讲) 求大小:函数size()或 length(): 求容量:函数capacity() 判空:函数empty() 清理:函数clear()(不释放空间) 扩容:函数reserve() 扩充:函数resize() 总结: 3. string类对象的访问及遍历操作 4. string类对象的修改操作

2303_80737493的博客 2061

C++中.cpp和.hpp的区别

c++中 cpp和hpp 首先,我们可以将所有东西都放在一个.cpp文件内,编译器会将这个.cpp编译成.obj,即编译单元。一个程序可以由一个编译单元组成,也可以由多个编译单元组成。一个.cpp对应一个.obj,然后将所有的.obj链接起来(通过一个叫链接器的程序),组成一个.exe,即程序。如果一个.cpp要用到另一个.cpp定义的函数怎么办,只需在这个.cpp中写上它的函数声明。 链接器将所...

Qzx9059的博客 1万+

C++中类前置声明和包含头文件区别

C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:     class B; class A{       public:           B b; }; class B{       public:        

qq_28833741的博客 1958

c++头文件相互包含

一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题。假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的: class B; class A { public: B b; }; class B { public: A a

L_yangliu的专栏 2516
上一篇: C++中const用法总结
下一篇: C++之“友元类”学习笔记
p_m_notes
博客等级 码龄14年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值