C++ 服务器开发面试题整理(3)

1.可以在构造函数和析构函数中调用虚函数吗?
可以,但基类构造函数中调用的仍然是基类版本的虚函数,派生类中调用的仍然是派生类版本的虚函数。如果不是这样的话,一般派生类的构造函数会调用基类的构造函数来构造基类对象,如果这个基类的构造函数中调用了虚函数,如果这个虚函数派生类重写了,由于派生类还没有构造好,会访问不确定的值,容易造成程序错误。

2.指针和引用的区别?
(1)指针保存的是所指对象的地址,引用是所指对象的别名,指针需要通过解引用间接访问,而引用是直接使用别名就能访问。
(2)指针可以改变所指向的对象,引用必须永远绑定在一个对象上。
(3)引用在定义的时候必须初始化,而指针则不需要。
(4)指针有指向常量的指针和指针常量,而引用没有引用常量,因为引用不是对象。
(5)引用比指针安全。

3.数组与指针
(1)把数组当参数传递给函数时,数组退化为对应其元素类型的指针。
(2)sizeof数组得到的是整个数组的大小,而将指针用作其参数时,得到的是指针大小。

4.智能指针是怎么实现的?什么时候改变引用计数?
(1)构造函数中计数初始化为1。
(2)拷贝构造函数中计数值加1。
(3)赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一。
(4)析构函数中引用计数减一。
(5)在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。
(6)每次创建类的新对象时,初始化指针并将引用计数置为1,如果引用计数减至0,则删除基础对象。

5.weak_ptr和shared_ptr
(1)weak_ptr指向对象时不增加其shared_ptr的引用计数。
(2)weak_ptr可以解决循环引用的问题,循环引用可能造成内存泄漏:

class A {
public:
    share_ptr<B> p;
};

class B {
public:
    share_ptr<A> p;
}

int main() {
    {
        share_ptr<A> pa(new A());    // pa的引用计数初始化为1
        share_ptr<B> pb(new B());    // pb的引用计数初始化为1
        pa->p = pb;    // pb的引用计数变为2
        pb->p = pa;    // pa的引用计数变为2
    }
    // 假设pa先离开,A对象的共享指针的引用计数减一变为1,不为0因此不会调用class A的析构函数,因此其成员p也不会被析构,pb的引用计数仍然为2
    // 同理pb离开的时候,引用计数也不能减到0
    return 0;
}
posted @   epiphanyy  阅读(20)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-03-24 剑指offer 学习笔记 丑数
点击右上角即可分享
微信分享提示