面试总结(1)

1、2原文链接:https://blog.csdn.net/lina_suda/article/details/88861573

1、静态成员函数

静态成员函数总结:

1.静态成员函数是类中的特殊的成员函数
2.静态成员函数没有隐藏的this指针:当调用一个对象的非静态成员函数时,系统会将该对象的起始地址赋值给成员函数的this指针。但是,静态成员函数不属于某个对象,为该类的所有对象共享,所以静态成员函数没有this指针。
4.静态成员函数可以通过类名直接访问
5.静态成员函数可以通过对象访问
6.静态成员函数只能直接访问静态成员变量(函数),而不能直接访问普通成员变量(函数)

使用静态成员函数的原因:

静态成员函数主要是为了处理静态成员变量。

2、静态成员变量

类的静态成员变量属于类的成员而不是对象,供所有对象共享,存放于全局区,因而不计入类的内存计算。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员变量可以通过类直接访问。

静态成员变量的初始化

1.静态成员不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化。
2.关键字static只出现类的内部。
3.在类外定义且初始化
4.常量静态成员可以在类内初始化

静态成员变量的访问

使用类作用域运算符直接访问
使用类的对象访问
成员函数可以直接访问
在这里插入图片描述

3、智能指针

(原文链接:https://blog.csdn.net/peachzy/article/details/114404859)
智能指针的底层就是使用一个原生指针对内存进行绑定,然后自动进行管理,申请和释放。

为什么使用智能指针

当我们使用new操作,分配了堆中的内存,但是忘了delete释放掉分配的内存,此时就会造成内存泄漏;
如果我们记得delete释放内存,也有可能存在内存泄露的问题,比如:

void remodel(std::string & str){
	std::string * ps = new std::string(str);
	...
	if(weird_thing())
		throw exception();
	str = *ps;
	delete ps;
	return;
}

当出现异常的时候,delete将不会被执行,因此也将导致内存泄漏。

智能指针的定义

智能指针的行为类似于指针的类对象,但是这种对象还有其它功能。
思想:如果是指针它是一个对象,那么在对象过期的时候,它的析构函数就会自动删除所指向的内存。
有三个功能的智能指针 auto_ptr(C98提出的)、unique_ptr、shared_ptr(C11)
这三个都定义了类似指针的对象,可以将new获得(直接或者间接)的地址赋给这种对象。
当智能指针过期的时候,其析构函数将使用delete来释放内存。
shared_ptr:允许多个指针指向同一个对象
unique_ptr:则独占所指向的对象
标准库还定义了一个名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象。
这三种类型都定义在memory头文件中

4、malloc free与new delete

区别:

1.new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在所有的new操作过程中,总是分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象。同样,在调用delete的时候,需要先调用析构函数,然后在销毁堆内存。
2. new/delete通常来说是操作符,就是"+","-"一样,而malloc/free是库函数。
3. new/delete是可以重载的,而重载之后,就成为了函数。
4. malloc在申请内存的时候,必须要提供申请的长度,而返回的指针是void*型,必须要强转才能成为需要的类型。
5. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。
6. C++默认的new/delete操作符内部,其实也调用了malloc/free这两个函数。

共同点:

1.都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露。
2. 都是申请内存,释放内存,free和delete可以释放NULL指针。
注意点:

  1. new/delete与malloc/free不能混合使用,有些人对这个观点持怀疑态度,因为在很多时候,他混合使用之后也没有严重的后遗症,那是因为在通常情况下,new操作符的确调用了malloc这个函数,所以free函数可以正常的释放new出来的内存空间。但这并不能保证所有的new操作符都是调用C++的new的原始操作符,而最常见的是,在类中,我们是可以重载new这个操作符的,这样的话,如果一但在operator=new()函数中调用了其它的申请函数的话东西,free将无法正常工作,或者说也将导致内存泄露。

内容来自CSDN博客 jerry4711的专栏 (如有侵权,删!)

5、inline

原文链接:https://blog.csdn.net/f__yuan/article/details/96505711

inline函数也称为内联函数或内嵌函数,inline定义的类的内联函数,函数代码被放入符号调用表,使用时直接展开,不需要调用,即在编译期间将所调用的函数的代码直接嵌入到主调函数中,是一种以空间换时间的函数。

inline函数与普通函数的比较

普通函数有开栈和清栈,inline函数无开栈和清栈。
当执行开销(代码小)< 调用开销(开栈)时,建议用inline
当执行开销(代码小)> 调用开销(开栈)时,不建议使用inline

inline和static 的区别

(1)内联函数没有开栈清栈的开销,static函数有;
(2)inline编译阶段代码展开导致函数本文件可见,而static是因为符号属性为local本文件可见。

inline和宏的区别

不同点:
(1)inline编译时处理有类型检查和安全检查,宏预编译时处理无类型检查和安全检查
(2)宏无法调试,而内联可以进行调试。
(3)内联比宏更加安全,是一种更加安全的宏

相同点: 两个都代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高运行速度。

inline函数的注意事项

一般写在头文件中
只在release版本生效
给编译器的一个建议,循环、递归、switch一定不会出现inline。
inline基于实现,不是基于声明,即在声明点无效(先声明后内联)

6、虚函数表、继承

虚函数表

7.C++构造函数能否是虚函数

1.存储的角度:构造函数不能是虚函数。因为虚函数是由一个虚函数列表维护的,如果一个构造函数是虚函数,这个虚函数列表还没有被创建出来,所以是有问题的。

2.使用的角度:父类和子类出现同名虚函数称为覆盖 父类指针=new 子类名(…);父类指针->函数名(…);//调用子类的虚函数。而构造函数是创建对象时自动调用的, 不是通过父类的指针或引用调用的。

3.对析构函数的影响:如果构造函数是虚函数,不能明确的确定其对象,如果析构函数不是虚函数,则无法确定其调用的正确性。

4.构造函数一个生命周期只执行一次,不是对象的动态行为,不需要为虚函数。

5.虚函数指针的状态是最后一个调用的函数决定的,如果构造函数设置为虚函数,则一定是调用自己的虚表中构造函数。
————————————————
版权声明:本文为CSDN博主「yoki_hiahia」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_34382237/article/details/79295849

8.C++的三大特性为

继承,多态,封装
(1)继承。一个对象直接使用另一个对象的属性和方法。
优点:
1.减少重复的代码。
2.继承是多态的前提。
3.继承增加了类的耦合性。
缺点:
1.继承在编译时刻就定义了,无法在运行时刻改变父类继承的实现;
2.父类通常至少定义了子类的部分行为,父类的改变都可能影响子类的行为;
3.如果继承下来的子类不适合解决新问题,父类必须重写或替换,那么这种依赖关系就限制了灵活性,最终限制了复用性。

虚继承:为了解决多重继承中的二义性问题,它维护了一张虚基类表。
(2)多态。
C++中有两种多态,称为 动多态(运行期多态) 和 静多态(编译期多态) ,而 静多态主要通过模板来实现,宏也是实现静多态的一种途径 。 动多态在C++中是通过虚函数实现的 ,即在基类中存在一些接口(一般为纯虚函数),子类必须重载这些接口。这样通过使用基类的指针或者引用指向子类的对象,就可以实现调用子类对应的函数的功能。动多态的函数调用机制是执行期才能进行确定,所以它是动态的。
接口的多种不同实现方式即为多态。可以举个例子加深记忆,比如电脑的USB接口,既可以插优盘,又可以插鼠标,USB接口就类似类的接口。
优点:
1.大大提高了代码的可复用性;
2.提高了了代码的可维护性,可扩充性;
缺点:
1.易读性比较不好,调试比较困难
2.模板只能定义在.h文件中,当工程大了之后,编译时间十分的变态

(3)封装。隐藏对象的属性和实现细节,仅仅对外提供接口和方法。
优点: 1)隔离变化;2)便于使用; 3)提高重用性; 4)提高安全性
缺点: 1)如果封装太多,影响效率; 2)使用者不能知道代码具体实现。

重载(overload)和覆盖(override):
重载: 写一个与已有函数同名但是参数表不同的函数;
覆盖:虚函数总是在派生类中被改写。

9.get和post区别

1
2

10.url最长为多少

上一问的1

11.c++11特性

C++11常用新特性汇总

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淮杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值