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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值