新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++学习日记 Day7:类对象作为类成员+友元

发布时间:2026/9/27 5:24:43来源:尧图网络
C++学习日记 Day7:类对象作为类成员+友元
## 今天学了什么今天学习C类对象作为类成员语法、类和对象-友元。## 类对象作为类成员在C中类中的成员可以是另一个类的对象在构造时会先构造其他类对象再构造类自身析构顺序则相反。验证打开VIsio studio2022分别创建两个类Person、Phone将Phone类对象作为Person类的成员变量#include iostream using namespace std; #includestring class Phone { public: Phone(string name) { string p_name name; cout Phone 类构造函数 endl; } ~Phone() { cout Phone 类析构函数 endl; } string p_name; }; class Person { public: Person(string name, string phonename):M_name(name), M_phone(phonename) { cout Person 类构造函数 endl; } ~Person() { cout Person 类析构函数 endl; } string M_name; Phone M_phone; }; void test() { Person p(张三,苹果); cout p.M_name 拿着 p.M_phone.p_name 手机 endl; } int main() { test(); return 0; }在test下一个断点进入调试观察发现首先进入的是Phone的构造函数然后进入Person类的构造函数之后在析构时先进入Person的析构函数后进入Phone的析构。*发现如果自己写了有参构造{}里面赋值不写无参构造在创建对象时会出现错误。原因在有参构造情况下编译器不再自动生成无参构造如果类B里面包含另一个类A实体对象创建B的对象时会优先初始化B里面的所有成员再执行B的构造函数{}里的代码。编译器初始化实体对象时会自动调用A的无参构造函数若A写了有参构造没有无参构造编译器找不到A的无参构造就会报错。解决办法手写初始化列表让编译器知道使用A的有参构造。任何构造函数一定存在初始化列表自己不写编译器会帮你隐式生成默认对成员做无参初始化## 友元定义让一个函数或者类访问另一个类中的私有成员。关键字friend三种实现方式全局函数做友元class Personbuild { friend void visitbuild(Personbuild visit); public: Personbuild() { house 客厅; bedroom 卧室; } string house; private: string bedroom; }; void visitbuild(Personbuild visit) { visit.bedroom 厨房; cout 全局函数正在访问 visit.bedroom endl; } test() { Personbuild p; visitbuild(p); }如果不写 friend void visitbuild(Personbuild visit); visitbuild 只能访问 house 不能访问 bedroom 。断点调试无法观察出具体实现步骤在 visitbuild 中尝试改变 Personbuild 的私有成员变量 bedroom进入调试发现在执行这一行代码以后bedroom的值发生改变。类做友元class Personbuild { friend class visiter; public : Personbuild() { house 客厅; bedroom 卧室; } string house; private: string bedroom; }; class visiter { public: void visit() { Personbuild pd; cout visiter类正在访问 pd.house endl; cout visiter类正在访问 pd.bedroom endl; } }; void test() { visiter vs; vs.visit(); }加入 friend class visiter; 实现访问私有成员。成员函数做友元class building; class visiter { public: visiter(); void visit1(); void visit2(); building* build; //building building2; }; class building { friend void visiter::visit2(); public: building() { house 客厅; bedroom 卧室; } string house; private: string bedroom; }; visiter::visiter() { build new building; } void visiter::visit1() { cout 通过指针visit1访问 build-house endl; //cout visit1访问 building2.house endl; } void visiter::visit2() { cout visit2访问 build-bedroom endl; } void test() { visiter vs; vs.visit1(); vs.visit2(); }加入 friend void visiter::visit2(); 实现访问私有成员。*注类A的成员函数类B的做友元代码步骤①前向声明类B②定义类A类内只写函数声明不写函数体实现类内定义B类型成员只能用指针定义不能定义实体对象。③定义类B在内部写友元声明函数体实现也可以写在类外④在B类定义下方写A成员函数的实现⑤创建对象调用函数。## 思考** 在C中传递自定义类传递类型的使用时机 **答在C中传递自定义类如果需要只读优先使用const引用需要修改用引用没有具体实例、需要判空用指针自定义类很少用值传递原因1.开销较大2.如果类里有指针但没写深拷贝构造函数值传递会触发浅拷贝析构时双重释放程序崩溃。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3个实战案例揭秘模板网站配置文件如何救活丑站 2026/9/27 6:15:08

3个实战案例揭秘模板网站配置文件如何救活丑站

3个实战案例揭秘模板网站配置文件如何救活丑站 别被那些花里胡哨的模板界面骗了,很多设计师转前端的兄弟都栽在同一个坑里: 模板网站太丑不够用 。…

阅读更多 →
《计算机工程》投稿全流程指南:从选题到审稿意见回复的实操经验 2026/9/27 6:14:55

《计算机工程》投稿全流程指南:从选题到审稿意见回复的实操经验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
网站编辑器哪个好?老手吐血整理的避坑指南 2026/9/27 6:14:49

网站编辑器哪个好?老手吐血整理的避坑指南

网站编辑器哪个好?老手吐血整理的避坑指南 改个需求建站公司拖一周,改个Logo还要收维护费? 别忍了。这种“甲方爸爸”体验,90%的中小企业老板都踩过。 很多老板问我: 网站编辑器哪个好? 是找外包,还是自己上手? 今天不聊虚的,直接上…

阅读更多 →
爱立信通信工程师面试题解析:协议、现网、CLI三维能力图谱 2026/9/27 6:14:49

爱立信通信工程师面试题解析:协议、现网、CLI三维能力图谱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
CyberDog开源代码实战:基于ROS2的四足机器人运动控制与导航 2026/9/27 6:14:42

CyberDog开源代码实战:基于ROS2的四足机器人运动控制与导航

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Expect架构全景图:Supervisor、Agent、Browser、Cookies五大核心包如何协作 2026/9/27 6:14:36

Expect架构全景图:Supervisor、Agent、Browser、Cookies五大核心包如何协作

Expect架构全景图:Supervisor、Agent、Browser、Cookies五大核心包如何协作 【免费下载链接】expect Expect tests your agents code in a real browser 项目地址: https://gitcode.com/gh_mirrors/expect6/expect Expect 是一款让 AI 编程代理在真实浏览器里…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉