零碎知识点记录
override 和final
override
父类存在虚函数,子类要对父类的虚函数进行重写时,在重写函数后面追加override。避免操作失误将重写函数时,将函数名foo写成fo0,编译器将fo0当成新函数编译通过(此时应为虚函数重写,函数名错误,编译器应该报错)
class A
{
virtual void foo();
}
class B :public A
{
void foo(); //OK
virtual foo(); // OK
void foo() override; //OK
}
final
类不再被继承 或者 虚函数不再被重写(使用final处为最后一次重写),可以在类名和虚函数后添加final关键字
class Base
{
virtual void foo();
};
class A : Base
{
void foo() final; // foo 被override并且是最后一个override,在其子类中不可以重写
void bar() final; // Error: 父类中没有 bar虚函数可以被重写或final
};
class B final : A // 指明B是不可以被继承的
{
void foo() override; // Error: 在A中已经被final了
};
class C : B // Error: B is final
{
};
Explicit
C++中的 explicit关键字主要是用来修饰类的构造函数,表明该构造函数是显式的,禁止单参数构造函数的隐式转换。
class MyClass
{
public:
MyClass(int num);
}
MyClass obj = 10; //ok, convert int to MyClass
上面的代码中编译器自动将整型转换为MyClass类对象,存在“隐式转换”,实际上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;
使用explict关键字后只能进行显示的转换。
class MyClass
{
public:
explicit MyClass(int num);
}
MyClass obj = 10; //Error
MyClass obj = (MyClass )10; //Ok
手动开辟内存
编码过程中使用到指针时,指针所指向的内容必须先合法,如果为变量,变量声明时已经开辟了内存空间。如果未开辟相应的空间,C语言需要使用malloc、calloc等手动申请固定大小的空间,用于数据存储,使用完毕还需要使用free手动释放申请的空间;相应的C++使用new申请空间,delete释放空间。