标题:C++11类中关于default、explicit、implicit、noexcept、final的详解
default
在C++11中,我们可以使用default
关键字来显式地声明函数的默认实现,它的作用是生成编译器默认的函数实现。下面是一个示例:
class MyClass {
public:
MyClass() = default;
MyClass(const MyClass& other) = default;
MyClass& operator=(const MyClass& other) = default;
~MyClass() = default;
};
通过在函数声明后添加= default
,我们告诉编译器不要生成默认的函数实现,而是使用预定义的默认实现。
explicit
explicit
关键字可以用于禁止隐式转换,只有当我们用explicit
修饰构造函数时,就不再允许隐式转换了。下面是一个示例:
class Example {
public:
explicit Example(int n) {
// ...
}
};
void test() {
Example ex1 = 123; // error: conversion from 'int' to 'Example' is not allowed
Example ex2(123); // OK
}
在上面的例子中,我们使用了explicit
关键字来修饰Example
的构造函数,这样我们就可以禁止隐式转换了。当我们使用Example ex1 = 123;
时,就会编译错误,我们必须使用显式的方式创建Example
对象,即Example ex2(123);
。
implicit
与explicit
相对的是implicit
关键字,它用于将单参数的构造函数定义为隐式转换。例如:
class Example {
public:
Example(int n) {
// ...
}
};
void test() {
Example ex = 123; // OK
}
在上面的例子中,Example
的构造函数只有一个参数,我们并没有使用explicit
关键字,因此可以进行隐式转换。当我们执行Example ex = 123;
这一语句时,编译器会自动将123
转换为一个Example
对象。
noexcept
noexcept
关键字用于指示函数不会抛出异常。这有助于编译器为我们生成更高效的代码。下面是一个示例:
void do_something() noexcept {
// ...
}
void another_func() {
try {
do_something();
} catch (...) {
// ...
}
}
在上面的例子中,do_something()
被声明为noexcept
,因此当我们在another_func()
中调用这一函数时,我们就不需要添加异常处理,因为它不会抛出任何异常。
final
final
关键字用于防止派生类重写基类中的虚函数。我们可以在虚函数后添加final
关键字,来指定其为“终止态”,也就是不能被派生类重写。下面是一个示例:
class Base {
public:
virtual void foo() final {
// ...
}
};
class Derived : public Base {
public:
virtual void foo() override { // error: 'Derived::foo' : overriding virtual function has been marked final
// ...
}
};
在上面的例子中,Base
类的foo()
函数被标记为final
,因此在Derived
类中我们不再可以重写这一函数了。当我们尝试编译Derived
类时,就会收到错误提示,指出我们试图重写一个被标记为final
的虚函数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++11 类中关于default、explict、implicit、noexcept、final的详解 - Python技术站