c++面试知识点-------------(一)
文章目录
- 数组名是指针常量不可以改变
- 右移运算正数高位补零,负数高位补1
vector的resize和reserve的区别?
在vector
中size()
和capacity()
属性分别对应着resize(size_type)
和reserve(size_type)
这两个方法。
size
: 表示实际容器中保存元素的个数capaciy
: 表示在发生重新分配之前允许存放多少元素
resize
对某个vector容器调用resize方法会在该容器尾部添加或删除一些元素,使容器达到指定的大小
reserve
对某个vector容器调用reserve方法仅仅设置capacity
这个值
reserve(size_type)只是改变了capaciy
的值,此时这些内存空间可能还是==“野”的。如果使用[]操作符进行访问,可能出现数组越界==问题。
如果有大量的数据需要进行push_back,应当使用reserve()函数提前设定其容量大小,否则会出现许多次容量扩充操作,导致效率低下.
这是vector的一个好处它的capacity()机制减少了内存分配的次数。等于说resize()还替我们做了reserve()的事。
vector的[]索引和at的区别?
访问字符串中的字符
可以使用==[]或者at()==方法来访问字符串中的字符,起始索引是0.最大有效索引是string.length()-1
.(特别的,如果是const string类型的对象,那么最大有效索引是string.length()
,最后一个字符是'\0’
.)
[]和at()的区别在于[]不检查索引是否有效,而at()在遇到无效索引时会抛出out_of_range异常.
构造函数可以为虚函数吗?
答案: 不能
1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的。而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等等
2)虚函数的调用需要虚函数表指针,而该指针存放在对象的内存空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数即构造函数了
手写链表结构
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
关键点,最后有个分号,结构体里面也用的是分号
虚函数的机制
虚函数是用来实现动态多态的;
虚函数的声明是在函数的前面加上关键字virtual
。
而多态的实现是依赖虚函数表和虚表指针。
只要类里面有虚函数,那么这个类就会有虚表,虚表的确定是在编译阶段的时候确定的,所有类的对象都是共用一份虚表,所有声明虚函数会增大开销。
虚表里面放的是虚函数的地址,,对象构造的十号拥有虚表的对象会拥有一个虚指针,这个指针会指向虚表。如果派生类继承基类,且重写了基类的虚函数的方法那么派生类虚表会更新虚函数的地址变成自己虚函数的地址。虚表指针是属于基类的,所以可以调用虚函数的时候,先通过虚表指针找到对应的虚表,再进行函数的调用,实现动态绑定
了解const的作用吗
C++const
允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const
,这样可以获得编译器的帮助。
const
修饰常量便是不可以更改 eg const int a =5;const
修饰指针变量
A: const 修饰指针指向的内容,则内容为不可变量。 const int * p = 5;
B: const 修饰指针,则指针为不可变量。 int * const p = &a
C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。const int * const p = &a
const
修饰函数参数和返回值
修饰按值或者按引用传递的参数时候,表示不能修改内容
修饰指针时候可以防止指针被篡改
const 修饰内置类型的返回值,修饰与不修饰返回值作用一样。
const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想让用户干什么。
-
const
修饰函数的时候const 修饰类成员函数,其目的**是防止成员函数修改被调用对象的值**,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。 注意:**const 关键字不能与 static 关键字同时使用,因为 static 关键字修饰静态成员函数,静态成员函数不含有 this 指针,即不能实例化,const 成员函数必须具体到某一实例。**