网站搭建怎么做,网站建设培训哪家好,建站公司没前端,天津网站公司delete
概述 delete关键字是c11新增的关键字#xff0c;主要用于的场景是#xff1a;当我们不希望类中的函数被类对象在外部调用的时候#xff0c;我们就可以使用这个关键字。 其实#xff0c;之前我们实现这种功能是将这些函数放在private修饰符下#xff0c;但是这种方…delete
概述 delete关键字是c11新增的关键字主要用于的场景是当我们不希望类中的函数被类对象在外部调用的时候我们就可以使用这个关键字。 其实之前我们实现这种功能是将这些函数放在private修饰符下但是这种方法是依靠语法特性来实现的有些地方可能并不合适。 举个例子: 使用private虽然在类外不能使用这些函数了但是在类的内部还是可以使用的但是我们目前的要求是在任何地方都不能使用这些函数那么这时候就得使用delete关键字了。(因为用来它之后就相当于删除了自然哪里也用不了了)疑问: 那我们不用直接将这些函数删除不就好了为什么多次一举呢? 对于普通的函数我们直接删除了自然时最好的也可以减少歧义。 但是对于类的构造函数呢? 即使我们删除了编译器也会自己给我们创建一个这样即使我们删除掉最起码在类内部还时可以使用的所以这时候我们就得使用delete关键字了。 使用delete修饰类的构造函数之后编译器就不会自动提供了而且编译器依然会认为它们被删除了无法使用。 1. 此关键字用于构造函数 对于构造函数无论隐式的(就是编译器自己提供的)还是显示的(我们自己写的)在创建实例对象的时候编译器都会默认去调用这些函数。但是有些时候我们并不希望外界使用我们这些函数那么就可以使用delete关键字修饰这样就相当于删除了对应的构造函数。 代码例子:
c中有四种构造函数: 默认构造有参构造拷贝构造赋值构造(运算符重载)
#include iostream
#include stdlib.husing namespace std;class A {
public:A() delete;A(const A a) delete;A(int a) delete;A operator(const A a) delete;
};int main(void) {A a; // 错误: 无法引用 A 的默认构造函数 -- 它是已删除的函数system(pause);return 0;
} 上面的代码我们对类A中的所以构造函数都使用了delete关键字。我们在main函数中创建对象a会报错因为创建对象会调用默认构造函数但是我们使用delete关键字修饰了默认构造函数就相当于它被删除了会报错。(其它的构造函数也一样可以自己尝试) 一般情况下我们是不会将所有的构造函数都用delete(除非你这个类不常见对象)否则建议只是根据需要将对应的构造函数delete即可。 比如将拷贝构造函数和复制构造函数用哪个delete修饰不允许对类对象进行拷贝了但是可以使用默认构造函数创建对象。(当然根据具体需要来选择) 2. 此关键字用于普通成员函数 其实用于普通成员函数也是一样的道理编译器会认为这个函数删除了但是成员函数和构造函数不一样我们为什么不直接将其删除了反正也不用了何必多此一举。 当然有一种情况下也是可以使用的 -- 避免传参时进行形式转换。 一般情况参数传递的时候编译器都会进行隐式转换比如:
#include iostream
#include stdlib.husing namespace std;class A {
public:void func(int a) {printf(%d\n, a);}
};int main(void) {A a; a.func(1.2); // 打印结果为1system(pause);return 0;
} 上面我们给函数func传入一个double的值1.2但是func的参数类型为int型所以传入之后进行了隐式转换将double的1.2转化为了int的1。 下面代码就可以避免这种隐式转换
#include iostream
#include stdlib.husing namespace std;class A {
public:void func(int a) {printf(%d\n, a);}void func(double a) delete;
};int main(void) {A a; a.func(1.2); // 出错system(pause);return 0;
} 其实我们使用函数重载就可以避免也就是我们在传入double的值调用的是形参为double的函数这样就避免了。 但是如果我们不希望外界使用形参为double的函数还要避免隐式转换就可以使用上面这种方式我们直接传入double的值就不会隐式转换而是直接报错了。 3. 一般情况下此关键字不要修饰析构函数 因为如果使用delete修饰析构函数那么我们创建的对象就无法释放了。会一直占用空间。因为释放对象是需要调用析构函数的。 default
概述 default就是默认的意思这个关键字用来修饰构造函数告诉编译器给函数实现默认的实现。 其实就是给指定函数实现对应默认的代码适当的使用可以提高代码效率和可读性。 只能用于默认构造拷贝构造赋值构造和析构 -- 因为这些函数我们不写编译器也会替我们写(编译器知道默认怎么写)default关键字就是让编译器替我们写函数的实现前提是编译器知道怎么写才行。(也就是默认构造拷贝构造赋值构造和析构才行) 当然如果函数中需要实现我们想要的功能(比如开辟空间释放空间等)或者说有函数实现就不能使用default来修饰。 如果在类内部给对应函数添加default那么其实现的函数是内联的如果不希望是内联的那就在类外部进行指定default。 代码例子
class A {
public:A() default;A(const A a) default;A operator(const A a) default;~A() default;
};