在C++中,final是一个关键字,用于修饰类的成员变量和成员函数。
1.final修饰成员变量:当一个类中的成员变量被声明为final时,它就变成了常量,即它的值不能再被修改。final修饰的成员变量必须在类定义中进行初始化,且只能初始化一次。
假设我们有一个名为Person的类,其中包含一个成员变量name,我们想将其声明为final:
class Person
{
public:
final string name; // 将name声明为final
Person(string n) : name(n) {} // 初始化name
};
现在,我们可以创建一个Person对象并初始化其name属性:
int main()
{
Person p("Alice"); // 正确使用final修饰的成员变量
p.name = "Bob"; // 错误:无法修改final修饰的成员变量
return 0;
}
在这个例子中,我们将name变量声明为final,这意味着它不能被修改。当我们尝试将其值更改为"Bob"时,编译器会报错,因为这是不允许的。只有在类定义中进行初始化后,我们才能访问和修改name变量的值。
2.final修饰成员函数:当一个类中的成员函数被声明为final时,它就变成了不可调用的虚函数,即它的指针不能被指向派生类的函数重载覆盖。final修饰的成员函数必须在类定义中进行声明,且只能声明一次。
class MyClass
{
public:
void foo() const final; // foo是final修饰的成员函数
};
class MyDerivedClass : public MyClass
{
public:
void foo() const override final; // error: cannot override 'const' final function 'MyClass::foo() const'
};
3.final修饰构造函数:当一个类中的构造函数被声明为final时,它就变成了不可调用的构造函数,即它的指针不能被指向派生类的构造函数重载覆盖。final修饰的构造函数必须在类定义中进行声明,且只能声明一次。
假设我们有一个名为Shape的类,其中包含一个构造函数:
class Shape
{
public:
Shape() {} // 定义了一个默认构造函数
Shape(int x, int y) { // 定义了一个带参数的构造函数
width = x;
height = y;
}
int getWidth() const { return width; }
int getHeight() const { return height; }
private:
int width, height;
};
现在,我们想将其中一个构造函数声明为final:
class Shape
{
public:
final Shape(int x, int y); // 将带参数的构造函数声明为final
Shape() {} // 定义了一个默认构造函数
Shape(int w, int h) : width(w), height(h) {} // 定义了一个新构造函数,用于覆盖final修饰的构造函数
int getWidth() const { return width; }
int getHeight() const { return height; }
private:
int width, height;
};
现在,我们可以创建一个Shape对象并调用它的构造函数:
int main()
{
Shape shape1(10, 20); // 调用默认构造函数或新构造函数都可以,因为final修饰的构造函数不可调用
int w1 = shape1.getWidth(); // 可以访问width属性,因为它没有被覆盖
int h1 = shape1.getHeight(); // 可以访问height属性,因为它没有被覆盖
Shape shape2(30, 40); // 此时编译器会报错,因为无法调用带有参数的final修饰的构造函数
int w2 = shape2.getWidth(); // 不能访问width属性,因为它已被覆盖为新构造函数
int h2 = shape2.getHeight(); // 不能访问height属性,因为它已被覆盖为新构造函数
return 0;
}
标签:name,int,修饰,Shape,override,101,final,构造函数
From: https://www.cnblogs.com/codemagiciant/p/17525482.html