C++基础知识2

1、构造函数可以重载,析构函数不能被重载。

class Rectangle {
private:
    int width;
    int height;

public:
    Rectangle() {
        width = 0;
        height = 0;
    }

    Rectangle(int w, int h) {
        width = w;
        height = h;
    }

    void setDimensions(int w, int h) {
        width = w;
        height = h;
    }

    int getArea() {
        return width * height;
    }
};

2、智能指针和指针的区别?
(1)、智能指针其实就是对普通指针做了一层封装,智能指针就是一个类,当超出类的作用域时,类会自动调用析构函数,会自动释放资源,所以智能指针的作用原理就是函数结束时自动释放内存空间,避免了手动释放内存空间。 指针不会有这个步骤,必须手动释放。
(2)、智能指针能有效解决野指针、悬挂指针和内存泄漏问题。
(3)、智能指针产生的原因:申请的内存在试用结束时,需要delete,否则会形成内存碎片。在程序执行期间,new出来对象,在析构中delete掉,但是当new发生在全局函数里面,只有在程序结束时才进行delete操作,这会给程序员带来额外的负担,智能指针可以很好的解决这个问题。
3、智能指针的种类 ?分别解决什么问题?
(1)、unique_ptr实现独占式拥有或严格拥有概念,保证在同一时间内只有一个智能指针可以指向该对象,避免了资源泄露。 有效解决new后发生异常忘记调用delete。
(2)、shared_ptr共享式拥有,多个指针可以指向同一个对象,该对象和相关资源在“最后一个引用被销毁”时候释放。它使用祭祀刷机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数,除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr, weak_ptr来构造,当调用release(),当前指针会释放资源所有权,计数减一,当计数为0时,资源会被释放。
(3)、weak_ptr是一种不控制生命周期的智能指针,它指向一个shared_ptr管理的对象,只是提供了被管理对象的一个访问手段。weak_ptr的目的是为了配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它只可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起计数的增加或减少。weak_ptr是用来解决shared_ptr相互引用而导致的四锁问题。如果两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放,它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以互相转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。

unique_ptr<string> pu1(new string("hello world"));
unique_ptr<string> pu2;
//pu2=pu1//不被允许,这样会留下悬挂的unique_ptr(pu1)
unique_ptr<string> pu3;
pu3=unique_ptr<string>(new string("You"));//调用unique_ptr的构造函数,构造函数创建的临时对象将其所有权交给pu3后会被销毁
unique_ptr<string> pu4=move(pu1);//转化为右值
pu1 = make_unique<string>("xiaojie");
//pu1 = new string("xiaojie") 不能将一个裸指针直接赋值给unique_ptr
#include
#include
using namespace std;

class B;
class A
{
    public:
        weak_ptr<B> pb_;//这里如果为强引用,则会造成死锁问题
        A(){cout<<"Start A!"<<endl;}
        ~A(){cout<<"End A!"<<endl;}
};
class B
{
    public:
        shared_ptr<A> pa_;
        B(){cout<<"Start B!"<<endl;}
        ~B(){cout<<"End B"<<endl;}
};

int main()
{
    shared_ptr<B> pb(new B);
    shared_ptr<A> pa(new A);
    pb->pa_=pa;
    pa->pb_=pb;
    cout<<pb.use_count()<<endl;
    cout<<pa.use_count()<<endl;
    return 0;
}

4、C++空类默认有哪些成员函数?
无参的构造函数、析构函数、赋值函数、拷贝构造函数
Class A;
A a;
A b=a;//拷贝构造函数
A c(a);//拷贝构造函数a
A d;
d=a;//赋值函数
5、static小结
(1)、static修饰局部变量,局部变量就是在函数体内定义的变量,普通的局部变量,生存周期随着函数的结束而结束,每次函数重新执行时,局部变量都是重新赋值,不会保留新的值。当用static修饰后,局部变量的生存周期就是当程序结束才会结素,再次调用函数时,用static修饰的变量会保留一次。改变了生命周期,但没有改变作用域。原因是被static修饰的局部变量被存放在.bss段或者.data段,而普通的变量是存放在栈上的。static修饰的局部变量只被初始化一次,下一次依据上一次的值。
(2)、static修饰全局变量,没有改变生存周期。普通的全局变量是可以被其他文件引用的,一旦 被static修饰,就只能被定义该全局变量的文件使用,使得该全局变量的作用范围减小。static修饰的全局变量只被初始化一次,防止在其他文件中被引用。
(3)、函数被static修饰,改变了作用域,普通的函数可以通过头文件声明的方式被其他文件调用,被static修饰后就只能在本文件中调用,这样是为了数据的安全。
(4)、static修饰的函数,在内存中只有一份,普通函数在每个调用中维持一分拷贝。

你可能感兴趣的:(c++)