当前位置: 首页 > news >正文

1688做网站费用临沂网站制作加速企业发展

1688做网站费用,临沂网站制作加速企业发展,wordpress友情链接排序,网页站点什么意思文章目录 一、基础常见面试题1、数组和链表区别2、深拷贝和浅拷贝相关问题的区别3、a和a区别4、c内存模型5、四种强制转换和应用场景 二、指针相关1、指针和引用的区别2、函数指针和指针函数3、传指针、引用和值4、常量指针和指针常量5、野指针6、智能指针的用法 三、关键字作用… 文章目录 一、基础常见面试题1、数组和链表区别2、深拷贝和浅拷贝相关问题的区别3、a和a区别4、c内存模型5、四种强制转换和应用场景 二、指针相关1、指针和引用的区别2、函数指针和指针函数3、传指针、引用和值4、常量指针和指针常量5、野指针6、智能指针的用法 三、关键字作用1、define、typdef、inline2、overrride和overload3、new和malloc4、costexpr和const区别5、const关键字和用法6、static关键字和用法7、extern 四、类/结构体相关1、构造函数和析构函数调用顺序2、虚函数用法3、虚析构作用4、三大特性5、抽象类 一、基础常见面试题 1、数组和链表区别 **1数组**一组具有相同数据类型的变量的集合。 2链表一种物理存储单元上非连续、非顺序的存储结构逻辑顺序是通过链表中的指针链接次序实现的。 逻辑结构 1数组在内存中连续链表用动态内存分配的方式内存中不连续。 2数组在使用前固定长度不能改变数组长度链表动态增删元素。 3数组元素减少时会造成内存浪费链表使用malloc或new来申请内存使用free或delete来释放内存。 内存结构 数组从栈上分配内存使用方便但自由度小链表在堆上分配内存自由度大但要注意造成内存泄漏。 访问效率 数组在内存中顺序存储下标访问效率高插入删除效率低链表需要从头遍历访问访问效率低插入删除效率高。 越界问题 数组大小固定存在访问越界的风险链表只要能申请空间就无越界风险。 2、深拷贝和浅拷贝相关问题的区别 拷贝构造函数 建立对象时可用同一类的另一个对象来初始化该对象的存储空间。这个拷贝过程只需要拷贝数据成员而函数成员是共用的只有一份拷贝。没有自己定义拷贝构造函数时会在拷贝对象时调用默认拷贝构造函数进行的是浅拷贝。 用到拷贝构造的情况 a.一个对象以值传递的方式传入函数体 b.一个对象以值传递的方式从函数返回 c. 一个对象需要通过另外一个对象进行初始化。 1.当函数的参数为对象时实参传递给形参的实际上是实参的一个拷贝对象系统自动通过拷贝构造函数实现 2.当函数的返回值为一个对象时该对象实际上是函数内对象的一个拷贝用于返回函数调用处。 浅拷贝是让两个指针指向同一个位置仅复制指针变量的地址没有复制指向的对象。没有重新分配资源。假如B复制A如果改变A则B也被改变就是浅拷贝 深拷贝是让另一个指针自己再开辟空间。一个类拥有资源当这个类的对象发生复制过程的时候会重新开辟内存空间。假如B复制AA改变而B不变就是深拷贝。 什么时候使用深拷贝 在对含有指针成员的类对象进行拷贝时须自定义拷贝构造函数进行深拷贝避免内存泄漏。 浅拷贝带来问题在于析构函数释放多次堆区内存使用std::shared_ptr可以解决这个问题。 调用一次构造函数调用两次析构函数。在没有自己定义拷贝构造函数时会在拷贝对象时调用默认拷贝构造函数进行浅拷贝。对指针拷贝后会出现两个指针指向同一个内存空间。 指针被分配一次内存但是程序结束时该内存却被释放了两次会导致崩溃。 3、a和a区别 a是先取值后自增取a的地址把它的值装入寄存器然后增加内存中的a的值a是先自增后取值。取a的地址增加它的内容然后把值放在寄存器中。 如 a 3aa 8; 4、c内存模型 栈区: 存放函数参数以及局部变量在出作用域时将自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但分配的内存容量有限。 堆区 new 分配的内存块包括数组类实例等需 delete 手动释放。如果未释放在整个程序结束后操作系统会自动回收掉。 全局/静态区: 保存自动全局变量和static变量包括static全局和局部变量。静态区的内容在整个程序的生命周期内都存在有编译器在编译的时候分配数据段存储全局数据和静态数据和代码段可执行的代码/只读常量。 常量存储区: 常量存于此处此存储区不可修改。 代码区 存放函数体的二进制代码由操作系统进行管理的。 5、四种强制转换和应用场景 (1) static_cast: 作用 ⽤于基本数据类型之间的转换如把int转换成char。 把任何类型的表达式转换成void类型。 特点 没有运⾏时类型检查来保证转换的安全性 进⾏上⾏转换把派⽣类的指针或引⽤转换成基类表示是安全的 进⾏下⾏转换把基类的指针或引⽤转换为派⽣类表示由于没有动态类型检查所以是不安全的。 (2) dynamic_cast: 在进⾏下⾏转换时dynamic_cast具有类型检查信息在虚函数中的功能⽐static_cast更安全。 转换后必须是类的指针、引⽤或者void*基类要有虚函数可以交叉转换。 dynamic本身只能⽤于存在虚函数的⽗⼦关系的强制类型转换对于指针转换失败则返回nullptr对于引⽤转换失败会抛出异常。 (2) reinterpret_cast: 进行无关类型的转换可以将整型转换为指针也可以把指针转换为数组可以在指针和引⽤⾥进⾏转换平台移植性⽐价差。 int *p new int(5); int p reinterpret_castint(p);(2) const_cast: 常量指针转换为⾮常量指针并且仍然指向原来的对象。常量引⽤被转换为⾮常量引⽤并且仍然指向原来的对象。去掉类型的const或volatile属性。 二、指针相关 1、指针和引用的区别 1定义性质指针是变量存储地址引用是变量的别名与原始变量是同一块内存 2指针可以不初始化引用必须初始化。指针可以改变指向地址和指向地址中存放数据的改变。引用不可变 3指针可以多级引用只能一级。 4指针可以指向空值, 引用不可以指向空值。 5sizeof运算结果不同自增运算意义不同。 2、函数指针和指针函数 (1) 函数指针指向函数的入口的指针函数名替换*p 声明返回int类型形参为int, intint (*p)(int, int); (2) 指针函数返回值是指针的函数。 声明形参为int, intm 返回值是int型指针的函数 int *p(int, int); 类似地 3指针数组和数组指针 指针数组一个数组包含元素为指针 int* arr[10] 数组指针: 一个指针指向一个数组int(*arr_ptr)[10]; 4函数模板和模板函数 函数模板一个模板用于生成函数。 template void fun(T a) {} 模板函数一个函数由模板生成而来。 funShape*:fun(int)、fun(double)… 5类模板和模板类 类模板一个模板生产类的模板 template class vector {}; 模板类一个类由模板生成的类。 vectorShape*:vector 、vector… 3、传指针、引用和值 值传递 1形参和实参各占一个独立的存储空间。 2形参的存储空间是函数被调用时才分配的调用开始系统为形参开辟一个临时的存储区然后将各实参传递给形参这是形参就得到了实参的值。 形参是实参的拷贝改变形参的值并不会影响外部实参的值。值传递是单向的实参-形参形参的操作无法反作用到实参上参数的值只能传入不能传出。 当函数内部需要修改参数并且不希望这个改变影响调用者时采用值传递。 指针传递 形参为指向实参地址的指针当对形参的指向操作时就相当于对实参本身进行的操作。 指针类型也可以作为函数参数的原型视为把变量的地址传入函数此时在函数中对地址中的元素进行修改则原先的数据就会确实地被修改。 引用传递 形参相当于是实参的“别名”对形参的操作其实就是对实参的操作在引用传递过程中被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间但是这时存放的是由主调函数放进来的实参变量的地址。 被调函数对形参的任何操作都被处理成间接寻址即通过栈中存放的地址访问主调函数中的实参变量。被调函数对形参做的任何操作都影响了主调函数中的实参变量。 引用和指针传递 形参可以修饰实参 值传递不如地址传递高效因为值传递先从实参的地址中取值再赋值给形参代入函数计算。而指针则把形参的地址直接指向实参地址使用时直接取出数据效率提高。 *指针需要检查是否为空引用不需要。 4、常量指针和指针常量 1常量指针指针指向可以改指针指向的值不可以改。 int a 10; int b 10; const int *p1 a; p1 b // 正确 //*p1 100 // 错误2指针常量指针指向不可以变值可以更改 int const p2 a //p2 b //错误 *p2 100 //正确5、野指针 野指针 访问一个已销毁或者访问受限的内存区域的指针野指针不能判断是否为NULL来避免指针指向了一块随机的空间不受程序控制。 空悬指针 指针正常初始化曾指向一个对象该对象被销毁了但是指针未制空那么就成了悬空指针。 野指针产生的原因 1.指针定义时未被初始化指针在被定义的时候如果程序不对其进行初始化的话它会随机指向一个区域因为任意指针变量除了了static修饰的指针它的默认值都是随机的 2.指针被释放时没有置空我们在用malloc开辟空间的时候要检查返回值是否为空如果为空则开辟失败如果不为空则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()和delete释放后如果程序员没有对其进行置空或者其他赋值操作的话就会成为一个野指针。 3.指针操作超越变量作用域不要返回指向栈内存的指针或者引用因为栈内存在函数结束的时候会被释放。 野指针的危害 指针指向的内容已经无效了而指针没有被置空解引用一个非空的无效指针是一个未被定义的行为也就是说不一定导致错误野指针被定位到是哪里出现问题在哪里指针就失效了不好查找错误的原因。 规避方法 初始化指针的时候将其置为nullptr之后对其操作。 释放指针的时候将其置为nullptr 6、智能指针的用法 优点 1处理资源泄露问题 2处理空悬指针的问题 3处理比较由异常造成的资源泄露new失败抛出异常没delete   三种智能指针 auto_ptr已废弃C98中的Class auto_ptr在C11中已不再建议使用。两个指针同类型不能指向同一个资源复制或赋值都会改变资源的所有权。 unique_ptr独占式/禁止拷贝 独占式拥有exclusive ownership或严格拥有strict ownership概念保证同一时间内只有一个智能指针可以指向该对象。可以避免资源泄露。 shared_ptr引用计数/自动析构/死循环 实现共享式拥有shared ownership多个智能指针可以指向相同对象该对象和其相关资源会在“最后一个引用reference被销毁”时候释放。多个智能指针共享一个控制块constrol block包含指向资源的 shared_ptr对象个数、指向资源的 weak_ptr 对象个数以及删除器delete用户自定义的用于释放资源的函数可以默认没有。 基于引用计数模型 每次有 shared_ptr 对象指向资源引用计数器就加1 当有 shared_ptr 对象析构时计数器减1 当计数器值为0时被指向的资源将会被释放掉。 且该类型的指针可复制和可赋值即其可用于STL容器中。此外shared_ptr 指针可与多态类型和不完全类型一起使用。 缺点 无法检测出循环引用如一颗树其中既有指向孩子结点的指针又有指向父亲结点的指针即孩子父亲相互引用。这会造成资源无法释放从而导致内存泄露。 weak_ptr弱引用解决shared_ptr死循环的问题。 指向有shared_ptr 指向的资源即其需要shared_ptr的参与其辅助 shared_ptr 之用但是不会导致计数。一旦计数器为0不管此时指向资源的 weak_ptr 指针有多少资源都会被释放。 所有的这些 weak_ptr 指针会被标记为无效状态即 weak_ptr作为观察shared_ptr 的角色存在着shared_ptr 不会感受到 weak_ptr 的存在。通过函数 expired() 来检查是是否 weak_ptr 处于无效状态。 weak_ptr 在访问所引用的对象前必须先转换为 shared_ptr。 作用 weak_ptr 是用来表达临时所有权的概念当某个对象只有存在时才需要被访问而且随时可以被他人删除时可以使用 weak_ptr 来跟踪该对象。需要获得临时所有权时则将其转换为 shared_ptr 此时若原来的 shared_ptr 被销毁则该对象的生命周期将延长至这个临时生成的 shared_ptr 同样被销毁为止。 三、关键字作用 1、define、typdef、inline 1define: 简单的字符串替换没有类型检查 在预处理阶段起作⽤ 防⽌头⽂件重复引⽤ 不分配内存给出的是⽴即数有多少次使⽤就进⾏多少次替换。 2typedef 用于定义类型别名有对应的数据类型是要进⾏判断的 在编译、运⾏的时候起作⽤ 在静态存储区中分配空间在程序运⾏过程中内存中只有⼀个拷⻉ 两者其他区别 define没有作用域的限制之前预定义过的宏在以后的程序中都可以使用而typedef有自己的作用域。 #define INTPTR1 int* typedef int* INTPTR2; INTPTR1 p1, p2; // 声明一个指针变量p1和一个整型变量p2 INTPTR2 p3, p4; //声明两个指针变量p3、p43inline避免频繁调用的小函数大量消耗栈空间栈内存 将内联函数编译完成⽣成了函数体直接插⼊被调⽤地⽅减少了压栈跳转和返回的操作。没有普通函数调⽤时的额外开销 内联函数是⼀种特殊的函数会进⾏类型检查 对编译器的⼀种建议编译器有可能拒绝这种请求 inline编译限制 不能存在任何形式的循环语句不能存在过多的条件判断语句函数体不能过于庞⼤内联函数声明必须在调⽤语句之前内联函数的定义放在头文件。 2、overrride和overload 1overrride 用于子类继承父类重写父类方法。 参数列表、返回值和抛出异常与被重写方法一致。 被重写方法不能为私有private 静态方法不能重写为非静态方法 重写的访问修饰符大于被重写方法的访问修饰符。 2overload 一个方法的参数形式不同 不同的参数类型如不同的参数个数、参数顺序 3、new和malloc 1返回状态new失败抛出异常。malloc失败返回NULL。 2内存大小 new无需指出内存块大小malloc需要指出内存尺寸大小。C提供了new[]与delete[]来专门处理数组类型使用new[]分配的内存必须使用delete[]进行释放 A *ptr1 new A A *ptr2 (A*)malloc(sizeof (A)) //数组 A * ptr new A[10];//分配10个A对象 delete [] ptr;3重载 operator new/operator delete可以被重载而malloc/free并不允许重载。 4构造函数和析构函数 new/delete会调用对象的构造函数和析构函数malloc不会。5malloc与free是标准库函数new/delete是c运算符。 6内存位置 new是从自由存储区上为对象动态分配内存空间而malloc函数是从堆上动态分配内存。 7返回类型安全 new操作符内存分配成功时返回的是对象类型的指针类型严格与对象匹配故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void* 需要通过强制类型转换将void*指针转换成我们需要的类型。 4、costexpr和const区别 const 表示只读constexpr 表示常量/常量表达式。 constexpr 只能定义编译期常量在编译程序时可以将其结果计算出来⽽ const 可以定义编译期和运⾏期常量。 如果标记为constexpr则同样它是const的。但相反并不成立 5、const关键字和用法 6、static关键字和用法 1修饰局部变量使得被修饰的变量成为静态变量存储在静态区。作用范围为该函数体不同于auto变量该变量的内存只被分配一次 因此其值在下次调用时仍维持上次的值。变量的值不会因为函数终止而丢失 2修饰全局变量改变了作用域。被static修饰的全局变量只能被包含该定义的文件内所有函数访问。只对定义在同一文件中的函数可见。 3修饰函数使得函数只能在包含该函数定义的文件中被调用。对于静态函数声明和定义需要放在同一个文件夹中。 4修饰类的数据成员使其成为类的全局变量会被类的所有对象共享包括派生类的对象所有的对象都只维持同一个实例。 因此static成员必须在类外进行初始化(初始化格式int base::var10;)而不能在构造函数内进行初始化不过也可以用const修饰static数据成员在类内初始化。 5修饰成员函数使这个类只存在这一份函数所有对象共享该函数不含this指针因而只能访问类的static成员变量。静态成员是可以独立访问的无须创建任何对象实例就可以访问。 例如可以封装某些算法比如数学函数如lnsintan等等这些函数本就没必要属于任何一个对象所以从类上调用感觉更好比如定义一个数学函数类Math调用Math::sin(3.14); 还可以实现某些特殊的设计模式如Singleton 7、extern extern 声明外部变量在函数或者文件外部定义的全局变量。 修饰全局变量 表明该变量定义于其他翻译单元。 修饰全局常量 表明该全局常量拥有外部链接可以被其他翻译单元发现否则全局常量默认是只有内部链接即不可被其他翻译单元发现。 //file1 extern const int a 10; //定义拥有外部链接的全局常量J //file2 extern const int a; //声明全局常量J来自于其他翻译单元修饰局部变量 表明该局部变量在其他翻译单元中被定义需要在链接的时候去解析。 对于局部变量来说extern可用于声明该局部变量来自其他翻译单元但是不能使用extern定义一个拥有外部链接的局部单元 void Fun() {extern int a; //表明a来自于其他翻译单元extern int b 10; //错误因为局部变量b的生命周期在退出函数的时结束不允许其建立 外部链接 }修饰一个字符串** 形如extern “C” 之类的用法大家肯定见过了表明后接的代码块或者后接的声明使用C语言调用惯例。 修饰一个模板 表明该模板已经在其他翻译单元实例化不需要在这里实例化。 四、类/结构体相关 1、构造函数和析构函数调用顺序 1构造函数顺序基类构造函数、对象成员构造函数、派生类本身的构造函数 。 2派生类本身的析构函数、对象成员析构函数、基类析构函数与构造顺序相反 2、虚函数用法 **定义**在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数通过基类访问派生类定义的函数实现多态性必须是基类的非静态成员函数。 使用方法 在基类用virtual声明成员函数为虚函数。在派生类中重新定义此函数为它赋予新的功能。在类外定义虚函数时不必在定义virtual。在派生类中重新定义此函数要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同并根据派生类的需要重新定义函数体。 虚函数表 每个包含了虚函数的类都包含一个虚表虚表是一个指针数组其元素是虚函数的指针每个元素对应一个虚函数的函数指针。虚函数指针的赋值发生在编译器的编译阶段。 同一个类的所有对象都使用同一个虚表对象内部包含一个虚表的指针来指向自己所使用的虚表。为了让每个包含虚表的类的对象都拥有一个虚表指针编译器在类中添加了一个指针*__vptr用来指向虚表。 3、虚析构作用 析构函数为什么是虚函数 为了当用一个基类的指针删除一个派生类的对象时派生类的析构函数会被调用。 虚函数的作用就是用基类的指针操作对象时能在运行时判断出对象的真正类型。 如A为基类B为派生类 A * p new B(); delete p; 如果A中的析构函数为虚函数那么delete p的时候程序就会发现p指向的是一个B的对象然后调用B的析构函数。 如果A中的析构函数不是虚函数那么编译器就认为p指向的是一个A的对象然后调用A的析构函数。B中定义的部分没有被析构造成内存泄漏。 但并不是要把所有类的析构函数都写成虚函数。只有当一个类被用来作为基类的时候才把析构函数写成虚函数。 4、三大特性 继承 封装 多态 5、抽象类 类中至少有一个函数被声明为纯虚函数则这个类就是抽象类。纯虚函数是通过在声明中使用 “ 0” 来指定的如下所示 class Box { public:// 纯虚函数virtual double getVolume() 0;private:double length; double width; };侵权联系删持续更新中~ 如果你对自动驾驶预测规划决策控制学习规划、科研方向、求职感兴趣欢迎咸鱼搜索“技术咨询小店”。
http://www.zqtcl.cn/news/456517/

相关文章:

  • 百度网首页登录入口宁波seo管理
  • 怎么把网站做的更好常州网站制作建设
  • 站长平台seo深圳有做公司网站
  • dedecms怎么部署网站云南网站定制
  • 禅城网站开发我赢网seo优化网站
  • 百度收录规则桂林seo公司推荐23火星
  • 做百度推广是网站好还是阿里好python开发工具
  • 秦皇岛网站制作小程序开发作图网站
  • 网站建设完整版指数是什么意思
  • 高端企业网站要多少钱网络推广文案招聘
  • 仿门户网站多功能js相册画廊源码 支持缩略小图浏览wordpress模版如何使用
  • 群晖nas可以做网站网页设计与制作步骤
  • 单位网站维护 网站建设岗位兰溪网站建设公司
  • 网站开发什么语言最好网站建设在国内外研究现状
  • 怎么看网站是用什么系统做的永久观看不收费的直播
  • 网站开发如何避免浏览器缓存的影响资讯网站开发的背景
  • 建网站 几个链接站长工具在线平台
  • 东营网站建设策划内容个人备案网站投放广告
  • 建立网站时服务器的基本配置有哪些做网站电信运营许可证
  • 如何阿里巴巴网站做推广方案怎么做网站的浏览栏
  • 织梦做中英文企业网站ui设计工资一般多少钱
  • php网站调试环境搭建关于网站开发的毕业设计
  • 如何在网站上做评比wordpress 图标代码
  • 网站优化建议怎么写pageadmin怎么样
  • 中外商贸网站建设平台合肥响应式网站开发
  • 雨花区区网站建设公司上传文章网站
  • 长春网站z制作自己做背景的网站
  • 浙江英文网站建设陕西百度推广的代理商
  • 怎么看网站蜘蛛网站价格评估 优帮云
  • 南充高端网站建设什么是搜索引擎营销