本文主要是介绍c++中default、explicit、override、final、volatile关键字(持续更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、default关键字
C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。例如:
class X{
private: int a;
}; X x;
上述程序中,程序员并没有定义类 X
的默认构造函数,但是在创建类 X
的对象 x
的时候,又需要用到类 X
的默认构造函数,此时,编译器会隐式的为类 X
生成一个默认构造函数。该自动生成的默认构造函数没有参数,包含一个空的函数体,即 X::X(){ }
。虽然自动生成的默认构造函数仅有一个空函数体,但是它仍可用来成功创建类 X
的对象 x
,程序也可以编译通过。
但是,如果程序员为类 X 显式的自定义了非默认构造函数,却没有定义默认构造函数的时候,下面程序将会出现编译错误:
class X{
public: X(int i){ a = i; }
private: int a;
}; X x; // 错误 , 默认构造函数 X::X() 不存在
编译出错的原因在于类 X
已经有了用户自定义的构造函数,所以编译器将不再会为它隐式的生成默认构造函数。如果需要用到默认构造函数来创建类的对象时,程序员必须自己显式的定义默认构造函数。例如:
class X{
public: X(){}; // 手动定义默认构造函数X(int i){ a = i; }
private: int a;
}; X x; // 正确,默认构造函数 X::X() 存在
可以看出,原本期望编译器自动生成的默认构造函数需要程序员手动编写了,即程序员的工作量加大了。此外,手动编写的默认构造函数的代码执行效率比编译器自动生成的默认构造函数低。类的其它几类特殊成员函数也和默认构造函数一样,当存在用户自定义的特殊成员函数时,编译器将不会隐式的自动生成默认特殊成员函数,而需要程序员手动编写,加大了程序员的工作量。类似的,手动编写的特殊成员函数的代码执行效率比编译器自动生成的特殊成员函数低。
Defaulted 函数的提出
为了解决两个问题:1. 减轻程序员的编程工作量;2. 获得编译器自动生成的默认特殊成员函数的高的代码执行效率,C++11 标准引入了一个新特性:defaulted 函数。程序员只需在函数声明后加上“=default;
”,就可将该函数声明为 defaulted 函数,编译器将为显式声明的 defaulted 函数自动生成函数体。例如:
class X{
public: X()= default; X(int i){ a = i; }
private: int a;
}; X x;
编译器会自动生成默认构造函数 X::X(){}
,该函数可以比用户自己定义的默认构造函数获得更高的代码效率。
Defaulted 函数的用法及示例
Defaulted 函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。例如:
class X {
public: int f() = default; // 错误 , 函数 f() 非类 X 的特殊成员函数X(int) = default; // 错误 , 构造函数 X(int, int) 非 X 的特殊成员函数X(int = 1) = default; // 错误 , 默认构造函数 X(int=1) 含有默认参数
};
二、explicit关键字
首先explicit的字面翻译是:详述的,明晰的,明确的
如果某个自定义类实现了带参数的构造函数,如下所示class A,当显示调用该构造函数时:A a1(1) 可编译成功,创建对象a1。也可以隐式的调用该构造函数:A a2 = 1;创建对象a2。
在构造函数前加上explicit关键字,则规定了程序不能隐式调用该构造函数,即上述A a2 = 1;的写法会编译失败。总结来说,explicit构造函数是用来防止隐式转换的。
class A {A(int num) {num_=num;}int num_;
};
class Test1
{
public:Test1(int n){num=n;}//普通构造函数
private:int num;
};
class Test2
{
public:explicit Test2(int n){num=n;}//explicit(显式)构造函数
private:int num;
};
int main()
{Test1 t1=12;//隐式调用其构造函数,成功Test2 t2=12;//编译错误,不能隐式调用其构造函数Test2 t2(12);//显式调用成功return 0;
}
三、override && final关键字
override:在成员函数声明或定义中,override
确保该函数为虚函数并覆盖某个基类中的虚函数。
final:当在虚函数声明或定义中使用时,final
确保函数为虚并指定其不可被派生类覆盖;当在类定义中使用时,final
指定此类不可被继承。
四、volatile
C++中volatile的作用
常用点:
①多线程应用中被多个任务共享的变量;
②防止编译器优化:项目中遇到,中断信号的控制;直接从内存中读取数据,而不是寄存器;
这篇关于c++中default、explicit、override、final、volatile关键字(持续更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!