怎么分辨const修饰的是谁 是限定谁不能被改变的?
在C++中,const
关键字的用途和位置非常关键,它决定了谁不能被修改。const
可以修饰变量、指针、引用等不同的对象,并且具体的作用取决于const
的修饰位置。理解const
的规则能够帮助我们明确代码中哪些部分不能被改变
- const修饰普通类型变量,修饰的变量的值不能被改变。
- const int* ptr ptr指向的值不能被改变
- int* const ptr ptr指向的地址不能别改变 指向地址的值可以被改变 引用的底层原理
- const int* const ptr ptr指向的地址和地址存储的值都不能被改变
- const int& ptr 常量引用 本来就不能改变引用指向 const修饰后引用的值也不能被改变
const
的实际作用取决于它在声明中的位置。
两种在vector中删除元素的方法
1. std::remove
+ erase
:
nodes.erase(remove(nodes.begin(), nodes.end(), node), nodes.end());
这个方法是先通过remove先把k个与node匹配的元素移动到vector的最后 然后实现O(k)时间复杂度的删除操作。适合当数组中存在多个与node相匹配的元素时候使用。
2. std::find
+ erase
:
auto it = find(nodes.begin(), nodes.end(), node);
if (it != nodes.end()) {nodes.erase(it);
}
这个方法是通过find找到一个和node匹配的元素的迭代器,然后直接通过迭代器删除这个元素,总体是O(n)的时间复杂度,比较适合当数组中的元素是唯一的时候使用。
Map和unorderedMap的区别
C++类的大小由什么决定?
- 成员变量的大小:普通成员变量,数组成员变量
- 虚函数表和虚函数:如果类中定义了一个虚函数那么他会有一个虚函数表,类中会存储一个指向虚函数表的指针,虚函数表中存储指向虚函数的指针
- 继承关系:如果子类继承了一个基类,那么子类会继承父类的成员变量和虚函数,如果父类有虚函数,子类会继承父类的虚函数指针。
- 对齐:类中的成员变量会根据其类型要求进行内存对齐,为了满足对齐要求,编译器会在成员之间填充字节来满足对齐要求。
为什么C语言不能重载,C++可以
C语言缺少C++中的名称修饰机制,C语言的编译器无法分辨参数列表不同的同名函数,如果定义多个参数列表不同的同名函数,在调用函数的时候C语言的编译器无法分辨要调用的函数是哪个,会导致二义性。
函数重写和函数隐藏
函数重写:子类重写父类的虚函数,必须是虚函数,只有参数列表不同。创建一个父类指针指向子类对象就可以通过指针指向的对象来调用子类重写的虚函数。
函数隐藏:如果参数列表相同是函数重写,如果函数同名但是参数列表不同就是函数隐藏
子类指针可以调用父类函数吗?
子类指针可以调用父类函数,前提是子类没有隐藏该函数。如果子类没有隐藏父类的函数(即,子类中没有定义同名但参数不同的函数),那么子类指针可以调用父类中的虚函数(如果该函数在父类中是虚拟的)。
如果要调用的父类虚函数已经被子类重写了,子类指针调用这个虚函数是会默认调用子类中重写后的函数,如果想调用父类的重写之前的函数可以通过子类中的函数来使用作用域解析符来间接调用父类被重写的函数。
让类只能在栈或者堆上创建对象
只能在栈上创建对象
// 禁止堆上分配:删除 operator newvoid* operator new(std::size_t size) = delete;
// 禁止堆上删除:删除 operator deletevoid operator delete(void* pointer) = delete;
但事实上这种方法并不能实现限制类只能在栈上创建对象的目的,因为还可以通过 :: 全局作用域解析符来使用全局的new
只能在堆上创建对象
把析构函数设置为私有,由于创建在栈上的对象是由编译器自动分配和释放内存空间的,当在栈上创建对象时编译器会检查类的析构函数是否可用,如果不可用则编译器不会在栈上为对象分配空间。
声明和定义的对比
如何阻止类创建对象
- 将构造函数私有化或者删除构造函数
- 将类设置为抽象类
- 禁止拷贝构造和赋值操作符
为什么抽象类不能实例化
- 抽象类不能实例化的原因是它包含至少一个纯虚函数,这使得它成为一个不完整的类。
- 抽象类的设计目的是提供接口或基础实现,而具体的行为和实现应由派生类提供。
- 抽象类可以被派生类继承,并在派生类中实现纯虚函数,从而允许派生类的实例化。
C++的成员函数能调用this指针吗
成员函数可以使用 this
指针。this
指针是一个指向调用该成员函数的对象的指针。
什么是野指针、悬空指针、空指针
空指针:在C语言中用NULL来表示空指针((void*)0)C++中的空指针是nullptr 代表0