侯捷老师C++面向对象高级编程上——笔记(附带自己查询额外知识点)

构造函数

  • 成员变量赋值时,尽量采用初始化列表,这样效率更高,因为变量获值分为两步,1 初始化 2 赋值

  • 成员函数不修改成员属性的值时(读函数),声明为const常函数(getXX())

  • 写函数参数为&(T& param)

  • Const 常对象只能调用常函数

  • 不能同时存在,编译器遇到Complex c2()时不知道调用哪个构造函数(把上面的=0默认参数去掉即可)

  • 单例设计模式,构造函数放在private里面

  • 引用定义:常指针, int* const a = &b; 最好所有的参数都传引用。

  • &操作符:两种含义,一种引用(放在typename后面,得到的是对象的别名,引用),一种是取地址符(放在object前面,得到的是一个指针)

  • 引用赋值

  • 如果不修改参数值,则加const关键词。

  • 相同Class的不同对象互为友元。

  • 返回值是否为引用(reference)取决于返回值是否存在(局部生命周期还是已经存在)如果时函数创建的temp变量,则不能返回引用。(尽量返回引用)

操作符重载

  • 两种方式:1 成员函数 2 非成员函数

  • 所有的成员函数都带有一个隐藏的参数this(指向本对象)

  • 连续调用运算符重载,将函数返回值设计成为&

  • 全局函数和成员函数区别:是否带有类作用域Complex::

  • 当需要创建一个local object时,返回值一定时value 而不是 reference

  • 对于特殊操作符<<重载只能选择非成员函数

类设计

  • 首先构造函数初始化列表使用

  • 其次函数设计时是否设计为const常函数

  • 传参是否加引用,是否加const

  • 返回值是否为引用

  • 重载是否友元函数 友元函数放在private里面

  • A声明B为其友元类,则B所有成员函数可以访问A的私有成员变量

  • A声明FunC为其友元函数,则FunC可以访问A所有私有变量

  • 友元函数在C++中不具有传递性
    拷贝构造、拷贝赋值、析构函数

  • 拷贝构造是构造函数的一种,只有一个参数,是本对象类型的引用。如Complex(Complex& c) ,但是默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。(指针成员共用内存)

  • 当含有指针成员时,需要重写析构函数释放内存delete,因为程序默认的析构函数不能释放动态内存。

  • C++类中会有默认的拷贝构造函数和拷贝赋值。(浅拷贝)

  • 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

  • 只要你的成员还有指针,那么就不可以采用编译器自带的默认拷贝构造函数(会使指针按字节拷贝后,两个指针指向同一个空间地址,导致先前的s1
    被删除后,s2的数据也不复存在)

第二行为拷贝构造,第三行为拷贝赋值。

  • ‘\0’在strlen函数中不计算入长度。
  • C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
    如:
    char* m_data = new char[10];
    delete[] m_data;
    String s = new String(“hello”);
    delete s。
  • 带有指针成员的类析构函数必须delete指针成员所指向内存空间,否则会导致内存泄漏。
  • 声明对象采用堆栈结构 先声明后析构

堆、栈、内存管理

  • 堆、栈

栈里面的变量空间系统自行释放,而堆里面的需要手动释放(delete),c1是栈空间,p是堆空间。

  • {}划分作用域,但是加上static之后,变成静态变量,一直存在,直到程序结束才会调用析构函数

  • 堆 heap object 生命周期在delete之后(调用析构函数)结束

  • 内存泄漏

  • New分配内存三个步骤,第一步申请类型对象大小空间(对象大小一般为类成员变量大小);第二步类型转换(void* -> T*);第三步调用构造函数;

  • Delete两个步骤,第一步调用析构函数删除类成员变量;第二部删除类对象本身指针

  • 堆栈区别

  • Delete[] 一定要搭配 new[], new 搭配 delete(调用析构函数的次数不同)

  • Vc编译器内存分配

类模板、函数模板

  • Static声明的成员变量(只有一份)独在一个区(全局,静态区),非静态变量每个对象开辟一个空间存储

  • 类成员函数体在内存中只有一份(位于程序代码区)

  • 静态函数static没有this指针,因此静态函数只能访问静态成员,静态函数访问推荐以类名加作用域符调用如Complex::get_test()

  • Static成员变量,类内声明,类外初始化

  • 宏与模板的区别

  • Namespace 包装封锁代码空间 采用using namespace xxx;

  • Explicit 防止类型隐式转换,用于构造函数声明

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
11-30 21:28
已编辑
南京市金陵中学 C++
最后以华为13级这个并不那么满意的offer结束支离破碎的秋招。bg:本硕双9电子信息类,非计算机,论文只有一篇ei会议。秋招目标:私企(问就是亲眼所见国企关停)转码前:研一时虽然大部分师兄师姐在转码,但是各种渠道渲染我们的专业很强,当时的想法是不转码肯定能找到满意的私企,然后拿本科毕设投了个ei会议,并开始自己找课题研究(导师放养)。研一下找到方向,研二上在仿真和写论文的时候开始意识到形势不好,越来越多的学长学姐申请华为的对口职位流程挂或只有个别勉强拿到offer,在萌生转码的念头时论文写到一半,于是决定论文写完再转码,觉得论文对找工作有用(现在来看对找开发的工作作用聊胜于无)。论文写完已经是12月中旬,一次次找导师改收到的是一次次拖延,直到3月份一个字没改让我投顶刊我才意识到这一年半的努力在秋招时不可能再转化为成果了。一个408只学过计算机网络,语言只学过c++且期末也只是刚及格的牛马从12月底才开始了转码。转码:算法卷院校卷顶刊没戏,只可能转开发,由于很多学长学姐都转码拿到华为的offer,难度不高,所以我最开始的目标是通过c++技术栈拿下华为并尝试互联网后端。零基础一切都要现学,所以就先从数据结构、操作系统、算法题这些开发类必备的知识学起,寒假开始刷力扣,当时根本不算是刷题,全是在看题解,印象很深刻的是第一题两数之和折磨了我一下午。三月刷力扣+背408八股,到三月底听计算机的同学说暑期实习后端卷麻了,相反前端今年相对简单,经过几天的考虑,最终决定两线作战:前端和c++,此时认为华为能稳稳作为保底。四月9106匆忙学了html+css+js,五月学了vue就去投实习了,b站腾讯阿里国际美团滴滴给了面试,但只有美团到了终面,结果还因为过于紧张以及没经验说错了话,与offer失之交臂。五月剩下的时间为华为准备了一个c++开源项目,六七月学react并准备了一个前端项目。本来的梦想是秋招签阿里等华为,然而噩梦就要开始了。秋招:先说结论吧,眼高手低,互联网一个都没拿到,老本行拿到某雷达所,前端拿到体面厂和性价比厂,c++拿到某学历厂、华子外包、迪子和两个通信大厂,两个前端base一个杭州一个南京,总包都不到25,c++的几个里华子外包和迪子base深圳,另外三个base上海且薪资降序。八月九月上旬集中投递前端岗位,每天都在笔试测评,但给面试的只有美团京东淘天,美团终面面试官百般刁难,甚至拷打前端发展历史这种问题,寄了之后美团再没捞我,必然是脏了面评,京东一面hr面,拷打我本科成绩和无竞赛奖项,直接寄,淘天二面挂。然后九月中旬发现互联网希望渺茫,慢一步投递了c++相关岗位,华为线下面试一天速通池子后拒了研究所的oc,抱着华为稳了的想法准备结束秋招,结果几天后问面试情况被告知面评非3A。这最后一根稻草压垮了996半年的我,整日的emo和严重的焦虑导致我不停的胡思乱想,加上那几天我的室友和我同一时间投递的三家都有进展甚至oc而我没有任何进展,我在发呆焦虑迷茫中度过了那一周。而一周之后算是有些好消息,开始有offer了,至少不至于毕业即失业。为了给华为留一线生机拒了最早来的一家(听说华为不等这家毁约),体面厂在接受意向后,华为在经过一系列沟通后告知可以给offer,因此未签三方,性价比厂oc后紧接着收到华为通知报批通过,接着就是现在华为第一批开奖了。总结:看着现在同学没有杂七杂八想法单一技术栈allin华为oc14甚至15级很不甘心,回想起来我可能在每个节点都做错了选择:在研一时不做充分调研就对不转码找工作过于自信,不该在只有几个月时间准备的情况下开辟第二战场转前端,不该在找不到暑期实习后还继续梭哈前端,不该在互联网全线溃败时面试华为导致面试官觉得我不够自信……太多的错误导致了这个结局。看好华为的平台以及去上海的意愿让我最后做出了接受13级的选择。回顾这接近19年的学习阶段,我总是在尝试向上卷:中考和全市人竞争重点高中,高考和全省人竞争985,考研更是千军万马过独木桥。我卷进了重点高中,但是我的努力收获的是高三一次比一次差的成绩,高考我考了一个高三从未考到过的成绩,曾经我认为这才是我的真实水平,但是现在我觉得我错了,本科时我卷不过同学,花费几倍于别人的努力却只能勉强达到差不多的水平;考研初试我靠着接近一年的995才收获高分,而准备同样时间的复试我就远远落后于别人;花费同样的时间在科研上也不能获得与别人差不多的成果。曾经我也自命不凡,但我现在意识到自己就是个平凡到不能再平凡的人,我的努力在命运面前仿佛沧海一粟。借用自己很喜欢的一首歌的歌词来结尾吧:“难以释怀的&nbsp;让时间冲淡&nbsp;至少我还在期盼。”希望工作顺利,希望生活如意。
牛客220859485号:唉,加油吧老哥,硕士拿13已经很吃亏了。感觉老哥是选择做错了,卷一卷java去互联网后端没问题的,华子也不是只收c++。all in C++是把路走窄了。
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务