Base t1={1}这种如何对对象进行初始化初始化啥意思

文章每周持续更新各位的「三連」是对我最大的肯定。可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇)

文章是由自己笔试面试腾讯嘚笔记整理而来整理的时候又回顾了一遍,中间工作忙断断续续整理了半个月才完成现在的样子。主要是针对面试的C++后台开发岗位涵盖了大部分C++相关的可能会被问到的技术点,作为面试技术的参考回头查阅

文末提供了本文知识点学习资源获取方式,需要的同学自取

这篇笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构和分布式后台服务设计相关还有c++11新特性,这些笔试面试也会被问到泹不在这篇讨论范围可以关注专栏后面如果有机会再补上。

为什么析构函数要是虚函数

基类指针可以指向派生类的如何对对象进行初始化(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的如何对对象进行初始化完全被释放如果析构函数不被声明成虚函数,则编译器实施静态绑定在删除基类指针时,只会调用基類的析构函数而不调用派生类析构函数这样就会造成派生类如何对对象进行初始化析构不完全。所以将析构函数声明为虚函数是十分必要的。

当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数.

break filename:linenum thread all 在所有线程相应行设置断点注意如果主线程不会执行到该行,并且启动all-stop模式主线程执行n或s会切换过去

输入参数命令set args 后面加上程序所要用的参数,注意不再带有程序名,直接加参数如:

1、软链接就是:“ln –s 源文件 目标文件”,只会在选定的位置上生成一个文件的镜像不会占用磁盘空间,类似与windows的快捷方式

2、硬链接ln源文件目标文件,没囿参数-s 会在选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接文件都保持同步变化。

三种:简单工厂模式、笁厂方法模式、抽象工厂模式

为什么要用工厂模式原因就是对上层的使用者隔离如何对对象进行初始化创建的过程;或者是如何对对象進行初始化创建的过程复杂,

使用者不容易掌握;或者是如何对对象进行初始化创建要满足某种条件这些条件是业务的需求也好,是系統约束也好

没有必要让上层使用者掌握,增加别人开发的难度所以,到这时我们应该清楚了无论是工厂模式,

还是上面的战友说的開闭原则都是为了隔离一些复杂的过程,使得这些复杂的过程不向外暴露

如果暴露了这些过程,会对使用者增加麻烦这也就是所谓嘚团队合作。

关键:1.初始建堆从最后一个非叶节点开始调整 2.筛选从顶点开始往下调整

度为2节点数 = 叶子节点数 - 1

}注意select函数的第一个参数是所囿加入集合的句柄值的最大那个那个值还要加1.比如我们创建了3个句柄;

poll的实现和select非常相似,只是描述fd集合的方式不同poll使用pollfd结构而不是select的fd_set结構,其他的都差不多,管理多个描述符也是进行轮询根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大

LT模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件下次调用epoll_wait时,会再次响应应用程序并通知此事件

ET模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件如果不處理,下次调用epoll_wait时不会再次响应应用程序并通知此事件。

ET模式在很大程度上减少了epoll事件被重复触发的次数因此效率要比LT模式高。epoll工作茬ET模式的时候

必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死

UDP中使用 connect 函数成為已连接的套接字

已连接 UDP 套接字 相对于 未连接 UDP 套接字 会有以下的变化:

  1. 不能给输出操作指定目的 IP 地址和端口号(因为调用 connect 函数时已经指定),即不能使用 sendto 函数而是使用 write 或 send 函数。写到已连接 UDP 套接字上的内容都会自动发送到由 connect 指定的协议地址;
  2. 不必使用 recvfrom 函数以获悉数据报的发送者而改用 read、recv 或 recvmsg 函数。在一个已连接 UDP 套接字上由内核为输入操作返回的数据报只有那些来自 connect 函数所指定的协议地址的数据报。目的地為这个已连接 UDP 套接字的本地协议地址发源地不是该套接字早先 connect 到的协议地址的数据报,不会投递到该套接字即只有发源地的协议地址與 connect 所指定的地址相匹配才可以把数据报传输到该套接字。这样已连接 UDP 套接字只能与一个对端交换数据报;
  3. 由已连接 UDP 套接字引发的异步错误會返回给它们所在的进程而未连接 UDP 套接字不会接收任何异步错误;

MTU是1500是指的以太网的MTU,可以用 netstat -i 命令查看这个值如果IP层有数据包要传,洏且数据包的长度超过了MTU

那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU

我们假设要传输一个UDP数据包,以太网嘚MTU为1500字节一般IP首部为20字节,UDP首部为8字节数据的净荷(payload)

部分预留是=1472字节。如果数据部分大于1472字节就会出现分片现象,

偏移量的单位為8Byte

以ID标示是不是同一个分片以偏移量标示在保文里的位置,每个不完整的ID报文有一个等待计时器到时丢弃IP层不保证能够送达,

如果丢叻上层自己处理参考rfc 791

4字节单位- 首部长度单位 1字节单位-总长度单位 8字节单位-片偏移单位

vector和数组类似拥有一段连续的内存空间,并且起始地址不变

因此能高效的进行随机存取,时间复杂度为o(1);

但因为内存空间是连续的所以在进行插入和删除操作时,会造成内存块的拷贝时間复杂度为o(n)。

另外当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝

list是由双向链表实现的,因此内存空间是不连续嘚

只能通过指针访问数据,所以list的随机存取非常没有效率时间复杂度为o(n);

但由于链表的特点,能高效地进行插入和删除

这个问题其实佷简单,在调用push_back时若当前容量已经不能够放入心得元素(capacity=size),那么vector会重新申请一块内存把之前的内存里的元素拷贝到新的内存当中,嘫后把push_back的元素拷贝到新的内存中最后要析构原有的vector并释放原有的内存。所以说这个过程的效率是极低的为了避免频繁的分配内存,C++每佽申请内存都会成倍的增长例如之前是4,那么重新申请后就是8以此类推。当然不一定是成倍增长比如在我的编译器环境下实测是0.5倍增长,之前是4重新申请后就是6

在某些情况下,希望覆盖虚函数机制并强制函数调用使用虚函数的特定版

本这里可以使用作用域操作符:

只有成员函数中的代码才应该使用作用域操作符覆盖虚函数机制。

为什么会希望覆盖虚函数机制最常见的理由是为了派生类虚函数调鼡基

类中的版本。在这种情况下基类版本可以完成继承层次中所有类型的公共任务,

而每个派生类型只添加自己的特殊工作例如,可鉯定义一个具有虚操作的 Camera 类层次Camera 类中的 display

函数可以显示所有的公共信息,派生类(如 PerspectiveCamera)可能既需要显

示公共信息又需要显示自己的独特信息可以显式调用 Camera 版本以显示公共

在这种情况下,已经确切知道调用哪个实例因此,不需要通过虚函数机制

派生类虚函数调用基类版夲时,必须显式使用作用域操作符

如果派生类函数忽略了这样做,则函数调用会在运行时确定并

且将是一个自身调用从而导致无穷递歸。

虽然可以直接访问基类成员就像它是派生类成员一样,但是成员保留了它

的基类成员资格一般我们并不关心是哪个实际类包含成員,通常只在基类和派

生类共享同一名字时才需要注意

与基类成员同名的派生类成员将屏蔽对基类成员的直接访问。

get_mem 中对 mem 的引用被确定為使用 Derived 中的名字如果编写如下代码:

使用作用域操作符访问被屏蔽成员

可以使用作用域操作符访问被屏蔽的基类成员:

作用域操作符指礻编译器在 Base 中查找 mem。

设计派生类时只要可能,最好避免与基类数据成员的名字相同

类成员函数的重载、覆盖和隐藏区别

a.成员函数被重載的特征:

(1)相同的范围(在同一个类中);

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数特征是:

(1)不同的范围(分別位于派生类与基类);

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数规则如下:

(1)如果派生類的函数与基类的函数同名,但是参数不同此时,不论有无virtual关键字基类的函数将被隐藏(注意别与重载混淆,仅同名就可以)

(2)洳果派生类的函数与基类的函数同名,并且参数也相同但是基类函数没有virtual 关键字。此时基类的函数被隐藏(注意别与覆盖混淆)

含有(或继承)一个或多个纯虚函数的类是抽象基类。除了作

为抽象基类的派生类的如何对对象进行初始化的组成部分甚至不能创建抽象类型Disc_item的如何对对象进行初始化。

输出操作符通常是非成员函数定义成类的友元

算术和关系操作符定义为非成员函数

为了与内置操作符保持┅致,加法返回一个右值而不是一个引用。

包括一个拷贝构造函数,一个赋值运算符一个析构函数,一对取址运算符

// 为虚函数看下攵说明

类赋值操作符必须是类的成员以便编译器可以知道是否需要合成一个, 赋值必须返回对 *this 的引用。

一般而言赋值操作符与复合赋值操作符应返回操作符的引用

注意,检查对自己赋值的情况 // 检查对自己赋值的情况

python判断文件是否存在的几种方法:

python--文件操作删除某行:

pytho3字典遍历的几种操作:

功能描述: 改变文件或目录权限

 备注: u:所有者 g:所属组 o:其他人 a:所有人
 +:为用户增加权限 -:为用户减少权限 =:为用戶赋予权限
 r:读权限 w:写权限 x:执行权限 
 r为读权限可以用4来表示,
 w为写权限可以用2来表示,
 x为执行权限可以用1来表示。

区分以下几種操作符号:

placement new-在指定内存调用构造函数初始化类

new [] operator-如果是类如何对对象进行初始化会在首部多申请4字节内存用于保存如何对对象进行初始囮个数

当我们使用关键字new在堆上动态创建一个如何对对象进行初始化A时,比如 A* p = new A()它实际上做了三件事:

向堆上申请一块内存空间(做够容納如何对对象进行初始化A大小的数据)(operator new)

调用构造函数 (调用A的构造函数(如果A有的话))(placement new)

当然,如果我们创建的是简单类型的变量那么苐二步会被省略。

当我们delete的时候也是如此比如我们delete p 的时候,其行为如下:

定位到指针p所指向的内存空间然后根据其类型,调用其自带嘚析构函数(内置类型不用)

然后释放其内存空间(将这块内存空间标志为可用然后还给操作系统)

将指针标记为无效(指向NULL)

这部分詳细内容可以参考

通过虚表指针访问虚成员函数,对普通成员函数的访问区别于虚成员函数具体如下:

不同继承层次的如何对对象进行初始化内存布局




终于写完了篇幅较长,写这篇文章是一方面是希望能给想来鹅厂或者准备面试任何一家公司C++开发的同学一些参考另一方媔是对知识的回顾。对编程和技术感兴趣的小伙伴可以关注我的公众号以后有更新会第一时间推送。

本文提到的后台开发学习的知识点我整理了电子书和学习资料,在公众号 「后端技术学堂」 关注后回复 「1024」 即可免费获取资料和书都是我几年来学习过程中收集整理的汾享给大家。

可以微信搜索公众号「 后端技术学堂 」回复「资料」有我给你准备的各种编程学习资料文章每周持续更新,我们下期见!

:类data的常如何对对象进行初始囮由于2113是常量,所以只能在类student的构5261造函数的成4102初始化列表里进行初始化在构造函数函1653数体内部或者在m_bb的定义处进行初始化都是错误嘚。

你对这个回答的评价是


需要类的组合,自己看看书吧!

你对这个回答的评价是


你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

我要回帖

更多关于 如何对对象进行初始化 的文章

 

随机推荐