C++11新特性
auto decltype 就是可以自动推到变量或者数据类型 auto会自动被释放 栈区 auto和decltype区别在于auto一定要初始化 并且表达式的值就是初始化的值 而decltype就无关 lambda表达式 就是类似于一个匿名函数 可以有引用传递 值传递 混合传递 优点就在于定义完就立刻运行 而且在要使用的地方可以立刻定义 方便更改 一般配合auto 形成函数指针使用 如果用引用可能会造成悬挂引用 就是在引用前这个对象就被销毁了 造成指向被清理的内存空间 右值引用 && 什么是右值就是放在赋值号右边的值 一般就是不能被修改的值 右值引用也一定要初始化 左值可以寻址 右值不行 右值一般在常量区 全局区 而左值一般就是在堆栈区 move函数
智能指针 把普通的指针封装成栈对象 生命周期结束后就会在析构函数中释放掉内存 shared_ptr 每次被拷贝赋值初始化时 比如初始化 作为形参传入 或者指向别人的地址 都会计数+1 当值为0的时候就会自动销毁 他创建就等于内部new了一个地址 然后如果不初始化的话 系统自动赋初值为0 union_ptr 不允许拷贝和赋值 weak_ptr 主要是用来打破shared_ptr的指向循环造成的死锁问题 我们就用weak_ptr打破这个循环 weak_ptr就只有观测权 在使用时就会变成shared_ptr C和C++的区别 C是面向过程C++面向对象 就是添加了类对象之类的 以类驱动程序运行 C主要是用于嵌入式和硬件打交道 C++主要是和操作系统应用层打交道 C++增加了强大的STL容器 泛型编程 重载 异常处理等 与JAVA就是什么垃圾回收啊 多重继承 虚拟机上运行 与开发平台无关 C++直接编译成可执行文件
重写 重载 隐藏的区别
隐藏:只需要同名并且父类不写virtual 如果参数不同 父类不写virtual也是隐藏 重写(覆盖)就是子类继承来的函数可以实现重写 函数名 返回类型 参数要完全一致 基类也要有virtual修饰 重载是同一个类 或者一个文件中一个函数可有多个类型 主要重载在于参数个数的不同 const也能实现重载
sizeof和strlen
strlen是库函数 字符数组作为形参调用sizeof的时候会被降为指针 所以是4 strlen不会 strlen一定要是char*类型变量 而sizeof都行 sizeof以\0结束
static
作用于类中的函数和成员变量时 就使该对象和类只和类有关 和对象无关 作用于局部变量 改变了生命周期 在程序结束时销毁 作用于全局变量和函数时改变了作用于 只能在当前文件使用 不具有全局性 类的静态成员只能访问类的静态成员变量 静态成员函数 主要是因为static实际上是取消了类的this指针 所以不能使用virtual const 和volatile const和volatile主要就是修饰this指针 将他变成const 现在取消了自然就没有意义了 静态成员变量要在类内声明类外初始化 静态成员变量是被所有对象和继承类 继承对象共享 静态成员变量也可以在类中作为其他成员函数的参数 普通成员变量不行
const
就是将变量变为常量 不能修改 相较于宏定义 可以进行类型检查 修饰函数参数 使函数参数在函数中不能被修改 修饰成员函数就是修饰this 自然就不能修改成员类的任何成员变量 const成员变量只能在狗仔函数初始化列表初始化 这个const成员变量只是相对于某个对象的 因为每个对象在创建的时候都是可以初始化一次这个变量
const和宏的区别
宏是直接将字符替换 用多少次就替换多少次 所以占用内存较大 不会进行任何类型判断 const是在编译阶段确定值 会进行安全性检查 在静态区 只有一份
typedef和宏的区别
typedef是在编译时处理 有类型检查功能 主要用来定义类型的别名
内联函数
不像正常函数需要将参数压入栈 再寻找函数地址 将参数从栈中拿出 得出结果再返回原来运行处 再进行调用 而是直接将函数在调用处展开 减少了调用函数的开销 提高了运行效率 类内定义的成员函数会自动声明成内联函数
new和malloc的区别
malloc 和 free 是库函数,而new 和 delete 是运算符 关键字 new在申请内存也会调用对象的构造函数 而且会自动计算大小 malloc 只会申请内存 指定大小 new申请空间返回的就是该对象类型的对象指针 会自动推断 malloc是先返回void* 然后 就是(int*)malloc(sizeof(int)) 前面那个(int*)就是强制转换 new分配失败的时候返回异常 malloc分配失败时返回空指针 new是在自由存储区为对象动态分配内存 而malloc是在堆上分配 delete 在释放内存之前 会调用对象的析构函数 free 只会释放内存。
虚函数的实现机制
虚函数的地址存放虚函数表中 类的对象地址中存储了指向虚函数表的虚函数表指针vptr 虚函数表在编译阶段建立 虚表指针vptr放在类对象的最前面
构造函数为什么不能定义成虚函数
第一 虚函数需要虚函数指针才能调用 但是构造函数是在对象构造时调用 此时还没有虚函数指针 所以没办法找到虚函数的位置
析构函数为什么要设置成虚函数
因为如果用基类指针指向子类时 在销毁时 如果不将析构函数设置成虚函数 只会调用基类的析构函数 会造成内存泄漏
空类问题
空类定义时会自动生成六个函数 字节为1 主要是唯一表示该类的位置
类对象的初始化顺序
基类构造函数–>派生类成员变量的构造函数–>派生类自己的构造函数 就是要注意中间那个 如果派生类的成员变量中有父类对象 则也会再调用一次父类的构造函数
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
};
class B
{
public:
B() { cout << "B()" << endl; }
~B() { cout << "~B()" << endl; }
};
class Test : public A, public B
{
public:
Test() { cout << "Test()" << endl; }
~Test() { cout << "~Test()" << endl; }
private:
B ex1;
A ex2;
};
int main()
{
Test ex;
return 0;
}
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/cpp-interview-highlights/efurq1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
深拷贝浅拷贝
仔细去看一下
指针和引用
指针会分配内存地址 引用不会 引用必须被初始化且不能再改变指定 而指针可以
|