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

产品是做网站做网站能做职业吗

产品是做网站,做网站能做职业吗,文学网站模板,seo网站培训班阿里C二面面经 公众号#xff1a;阿Q技术站 来源#xff1a;https://www.nowcoder.com/feed/main/detail/fc4a48403b534aafa6a6bce14b542c4e?sourceSSRsearch 1、智能指针#xff1f; std::shared_ptr#xff1a; 原理#xff1a;std::shared_ptr是基于引用计数的智能指…阿里C二面面经 公众号阿Q技术站 来源https://www.nowcoder.com/feed/main/detail/fc4a48403b534aafa6a6bce14b542c4e?sourceSSRsearch 1、智能指针 std::shared_ptr 原理std::shared_ptr是基于引用计数的智能指针用于管理动态分配的对象。它维护一个引用计数当计数为零时释放对象的内存。 使用场景适用于多个智能指针需要共享同一块内存的情况。例如在多个对象之间共享某个资源或数据。 std::shared_ptrint sharedInt std::make_sharedint(42); std::shared_ptrint anotherSharedInt sharedInt; // 共享同一块内存std::unique_ptr 原理std::unique_ptr是独占式智能指针意味着它独占拥有所管理的对象当其生命周期结束时对象会被自动销毁。 使用场景适用于不需要多个指针共享同一块内存的情况即单一所有权。通常用于资源管理例如动态分配的对象或文件句柄。 std::unique_ptrint uniqueInt std::make_uniqueint(42); // uniqueInt 的所有权是唯一的std::weak_ptr 原理std::weak_ptr是一种弱引用指针它不增加引用计数。它通常用于协助std::shared_ptr以避免循环引用问题。 使用场景适用于协助解决std::shared_ptr的循环引用问题其中多个shared_ptr互相引用导致内存泄漏。 std::shared_ptrint sharedInt std::make_sharedint(42); std::weak_ptrint weakInt sharedInt;std::auto_ptr已废弃 原理std::auto_ptr是C98标准引入的智能指针用于独占地管理对象。但由于其存在潜在的问题已在C11中被废弃。 使用场景在C98标准中可用于独占性地管理动态分配的对象。不推荐在现代C中使用。 std::auto_ptrint autoInt(new int(42)); // 已废弃2、栈和堆的区别 分配方式: 栈栈是一种自动分配和释放内存的数据结构它遵循后进先出LIFO原则。当你声明一个局部变量时该变量存储在栈上。函数的参数和局部变量也存储在栈上。栈的分配和释放是自动的由编译器管理。堆堆是一种手动分配和释放内存的数据结构。在堆上分配内存需要使用new或malloc等函数释放内存则需要使用delete或free。堆上的内存不会自动释放必须手动管理。 存储内容: 栈栈主要存储局部变量、函数参数和函数调用的上下文。它的存储生命周期通常是有限的当超出其作用域时内存会自动释放。堆堆主要用于存储动态分配的对象和数据结构。它的存储生命周期没有那么明确需要手动释放。 生命周期: 栈栈上的变量生命周期与其作用域通常是一个函数的执行相对应。一旦超出作用域栈上的变量将自动销毁。堆堆上的内存生命周期由程序员控制。在程序员显式释放内存之前内存将一直存在。 分配速度: 栈由于栈上的内存分配和释放是自动管理的通常比堆更快。堆堆上的内存分配和释放需要较多的开销通常比较慢。 大小限制: 栈栈的大小通常受到限制因为它由操作系统管理可以很小通常在几MB以内。堆堆的大小可以较大受到系统资源的限制通常比栈要大得多。 数据访问: 栈栈上的数据访问速度较快因为它是线性存储访问局部变量通常只需要一次寻址操作。堆堆上的数据访问速度较慢因为它是散乱存储需要进行额外的寻址操作。 3、c和c的不同 C是面向过程的语言而C是面向对象的语言。C和C动态管理内存的方法不一样C是使用malloc/free函数而C除此之外还使用new/delete关键字。C的类是C里没有的但是C中的struct是可以在C中正常使用的并且C对struct进行了进一步的扩展使得struct在C中可以和class有一样的作用。而唯一和class不同的地方在于struct成员默认访问修饰符是public而class默认的是private。C支持重载而C语言不支持。C有引用C没有。C全部变量的默认链接属性是外链接而C是内链接。C 中用const修饰的变量不可以用在定义数组时的大小但是C用const修饰的变量可以。 4、用const的目的 防止修改变量的值 将变量声明为 const 后编译器会确保该变量的值在初始化后不能被修改。这有助于在程序中创建更加稳定和可维护的代码。 const int maxAttempts 3; // maxAttempts 4; // 错误无法修改常量指定函数参数为只读 在函数定义中使用 const 可以指定某个参数是只读的防止在函数内部修改参数的值。 void printMessage(const std::string message) {// message !; // 错误无法修改只读参数std::cout message std::endl; }确保成员函数不修改对象状态 在成员函数声明和定义中使用 const 关键字可以确保该成员函数不会修改调用对象的状态。这种方法被称为常量成员函数。 class MyClass { public:void modifyState(); // 普通成员函数void queryState() const; // 常量成员函数不修改对象状态 };指定常量指针或常量引用 在指针或引用声明中使用 const 可以指定指针指向的对象是常量或者引用的对象是常量。 const intptrToConst; // 指向常量的指针 int constconstPtr; // 同样是指向常量的指针避免不必要的拷贝 在函数参数传递和返回值中使用 const 可以避免不必要的拷贝提高性能。 5、指针和数组的区别 概念 数组存储连续多个相同类型的数据 指针变量存的是地址 赋值 同类型的指针变量可以相互赋值数组不行只能一个一个元素的赋值或拷贝 存储方式 数组连续内存空间。 指针灵活可以指向任意类型的数据。指向的是地址空间的内存。 sizeof 数组的sizeof求的是占用的空间字节。 在32位平台下无论指针的类型是什么sizeof指针名都是4在64位平台下无论指针的类型是什么sizeof指针名都是8。 传参 作为参数时数组名退化为常量指针。 6、重载和重写的区别 重载Overloading 定义在同一个作用域内允许存在多个同名的函数但是这些函数的参数列表必须不同包括参数的个数、类型、顺序等。目的通过相同的函数名来处理不同类型的参数提高代码的灵活性。发生条件函数名相同但参数列表不同。 int add(int a, int b) {return a b; }double add(double a, double b) {return a b; }重写Overriding 定义 在派生类中重新实现覆盖其基类的虚函数。发生在继承关系中子类重新定义基类的虚函数实现子类自己的版本。目的 支持多态性允许基类的指针或引用在运行时指向派生类对象并调用相应的派生类函数。发生条件 子类继承自父类子类中的函数与父类中的虚函数具有相同的函数签名。 class Shape { public:virtual void draw() const {// 具体的实现} };class Circle : public Shape { public:void draw() const override {// Circle 版本的实现覆盖了基类的虚函数} };总结 重载是指在同一作用域中定义多个同名函数通过参数列表的不同来区分重写是指派生类重新实现覆盖其基类的虚函数以支持多态性。 7、定义指针时要注意的问题 初始化指针在定义时最好立即初始化可以为其赋予 nullptrC11 及以上或 NULL或者指向有效的内存地址。未初始化的指针具有不确定的值。 int* ptr nullptr; // 推荐使用 nullptr 初始化指针悬空指针当指针指向的内存被释放后如果不将指针置为 nullptr该指针就成了悬空指针。使用悬空指针可能导致未定义行为。 int* ptr new int; delete ptr; // ptr 现在是悬空指针野指针 指针指向未知的内存地址可能是未初始化的指针或者指向已释放的内存。使用野指针可能导致程序崩溃或不可预测的行为。 int* ptr; // 未初始化的指针 *ptr 42; // 野指针空指针解引用尝试解引用空指针会导致未定义行为。在解引用指针之前应该确保指针不为 nullptr。 int* ptr nullptr; // *ptr; // 错误解引用空指针指针的生命周期指针在超出其作用域后不再有效但如果指针指向的是动态分配的内存需要手动释放以防止内存泄漏。 void foo() {int* ptr new int;// 使用 ptrdelete ptr; // 释放动态分配的内存 } // ptr 超出作用域但内存已经释放指向栈上的内存当指针指向栈上的内存时应该确保在指针超出作用域之前该内存仍然有效。 int* func() {int x 42;return x; // 错误返回指向栈上的内存地址 } // x 超出作用域指向的内存已经无效空指针与野指针 空指针nullptr表示指针不指向任何有效的内存地址而野指针是指指针的值是一个不确定的地址。合理使用空指针并尽量避免野指针。 8、c内存分配 栈区Stack用于存储局部变量和函数调用的信息。栈是一种后进先出LIFO的数据结构。每当进入一个新的函数系统会为其分配一个栈帧用于存储局部变量、参数和函数调用的返回地址等信息。当函数执行完成对应的栈帧会被销毁。堆区Heap用于动态分配内存。程序员通过new运算符从堆上分配内存通过delete运算符释放堆上的内存。堆上的内存分配和释放需要程序员手动管理确保在不再使用时及时释放以防止内存泄漏。全局区/静态区Global/Static Area用于存储全局变量和静态变量。全局变量存储在全局数据区静态变量存储在静态数据区。这些变量在程序启动时被分配直到程序结束时才会释放。常量区Constant Area用于存储常量字符串和全局常量。这部分内存是只读的程序运行期间不能修改。代码区Code Area用于存储程序的执行代码。在程序运行时代码区是只读的。 9、new/delete和malloc/free的联系及区别 new 和 delete 是 C 中用于动态内存分配和释放的运算符而 malloc 和 free 是 C 语言中对应的库函数。 联系 目的相同 new 和 malloc 都用于在堆上动态分配内存而 delete 和 free 用于释放动态分配的内存。使用方式 new 和 delete 是 C 中的运算符可以直接使用而 malloc 和 free 是 C 语言中的库函数需要包含头文件 cstdlib。 区别 类型安全 new 和 delete 是类型安全的它们会调用对象的构造函数和析构函数。malloc 和 free 是基于 void*不会调用构造和析构函数因此不是类型安全的。大小参数 new 和 delete 不需要显式指定要分配的内存大小它们会根据类型自动计算。而 malloc 和 free 需要显式指定分配或释放的内存大小。操作对象 new 和 delete 主要用于操作对象而 malloc 和 free 可以用于分配任意大小的内存块。对NULL的处理 new 在分配失败时会抛出 std::bad_alloc 异常而 malloc 在分配失败时返回 NULL。适用范围 new 和 delete 是 C 中的运算符而 malloc 和 free 是 C 标准库中的函数。在 C 中推荐使用 new 和 delete因为它们更符合面向对象的编程思想。 10、c是类型安全的语言吗面试官提到了动态联编和静态联编 C 是一种相对而言更加类型安全的编程语言。类型安全是指在编译时和运行时程序对数据类型的使用都是合法的不会发生未定义行为。C 在设计上考虑了类型安全并提供了一些机制来减少类型相关的错误。 静态联编Static Binding在编译阶段编译器将函数调用与具体的函数实现关联起来这被称为静态联编。C 是静态类型语言因此大部分的联编工作在编译时完成。这有助于在编译期发现一些类型相关的错误提高了类型安全性。动态联编Dynamic Binding在运行时通过虚函数和多态性实现动态联编。C 支持运行时多态允许在父类的指针或引用上调用子类的虚函数。这种机制在一定程度上提高了灵活性但也引入了动态联编的概念。强类型C 是一种强类型的语言即在编译时对类型的检查比较严格不同类型之间的操作需要进行明确的类型转换。静态类型检查C 是一种静态类型检查语言这意味着变量的类型在编译时就已经确定不会发生隐式的类型转换错误。面向对象的封装C 支持面向对象编程通过类的封装特性可以将数据和操作封装在一起防止未授权的访问和修改。模板和泛型编程C 提供了模板和泛型编程的支持允许程序员编写与类型无关的代码提高了代码的通用性和类型安全性。 11、main函数前会有其他函数语句被执行吗 在标准的 C 程序中main函数是程序的入口点程序从main函数开始执行。在main函数执行之前不会有其他普通函数被自动调用。然而有一些特殊情况可能导致main函数执行前调用其他函数或执行其他代码。 全局对象的构造在 C 中全局变量和静态变量的构造函数会在main函数执行之前调用。这意味着如果你有全局对象它们的构造函数将在main函数执行前执行。 #include iostreamclass GlobalObject { public:GlobalObject() {std::cout GlobalObject constructed! std::endl;} };GlobalObject globalVar; // 全局变量构造函数会在 main 函数执行前调用int main() {std::cout Inside main function! std::endl;return 0; }例子中GlobalObject 类的构造函数会在 main 函数执行前被调用。 特殊初始化函数在一些特殊的嵌入式系统或特定编译器中可能存在一些特殊的初始化函数这些函数可能在 main 函数之前执行。 12、虚函数实现 虚函数表vtable对于每个包含虚函数的类编译器会在该类的对象中添加一个指向虚函数表的指针。虚函数表是一个数组其中存储了类的虚函数的地址。每个类有一个对应的虚函数表。虚函数指针vptr对象中的虚函数指针指向虚函数表。在对象的构造过程中虚函数指针被设置为指向类的虚函数表。动态绑定当通过基类指针或引用调用虚函数时实际调用的是对象的实际类型的虚函数。这种调用方式被称为动态绑定。编译器通过虚函数指针找到对象的虚函数表然后在表中查找对应虚函数的地址。 看个例子 #include iostreamclass Base { public:virtual void show() {std::cout Base::show() std::endl;} };class Derived : public Base { public:void show() override {std::cout Derived::show() std::endl;} };int main() {Base baseObj;Derived derivedObj;Base* basePtr baseObj;Base* derivedPtr derivedObj;// 调用虚函数实际执行 Derived::show()basePtr-show();derivedPtr-show();return 0; }例子中Base 类有一个虚函数 show而 Derived 类覆盖了这个虚函数。在 main 函数中通过基类指针调用虚函数实际执行的是对象的实际类型的虚函数。这就是虚函数实现动态绑定的基本原理。 13、TLS握手 客户端向服务端发起第一次握手请求告诉服务端客户端所支持的SSL的指定版本、加密算法及密钥长度等信息。服务端将自己的公钥发给数字证书认证机构数字证书认证机构利用自己的私钥对服务器的公钥进行数字签名并给服务器颁发公钥证书。服务端将证书发给客户端。客服端利用数字认证机构的公钥向数字证书认证机构验证公钥证书上的数字签名确认服务器公开密钥的真实性。客户端使用服务端的公开密钥加密自己生成的对称密钥发给服务端。服务端收到后利用私钥解密信息获得客户端发来的对称密钥。通信双方可用对称密钥来加密解密信息。 14、手撕算法冒泡排序 基本思想是通过重复遍历要排序的数列一次比较两个元素如果它们的顺序错误就交换它们直到没有需要交换的元素为止。 思路 从第一个元素开始依次比较相邻的两个元素。如果顺序不对就交换这两个元素的位置。继续遍历整个数组执行相同的操作。一轮遍历结束后最大的元素就会沉到数组末尾。重复上述步骤但不包括已经排序好的元素直到整个数组有序。 参考代码 #include iostream #include vectorvoid bubbleSort(std::vectorint arr) {int n arr.size();for (int i 0; i n - 1; i) {// 每一轮遍历把最大的元素放到末尾for (int j 0; j n - i - 1; j) {// 如果前面的元素比后面的大交换它们的位置if (arr[j] arr[j 1]) {std::swap(arr[j], arr[j 1]);}}} }int main() {// 测试数据std::vectorint arr {64, 34, 25, 12, 22, 11, 90};// 打印排序前的数组std::cout 排序前的数组;for (int num : arr) {std::cout num ;}// 调用冒泡排序函数bubbleSort(arr);// 打印排序后的数组std::cout \n排序后的数组;for (int num : arr) {std::cout num ;}return 0; }了解了一些密码学的相关知识后面就属于聊天了。面试官依旧人很好给予了很积极的反馈说了一下笔试的问题给了一些建议。
http://www.hkea.cn/news/14265911/

相关文章:

  • 网站空间哪里便宜山西房地产网站建设
  • 民生热点新闻seo咨询价格找推推蛙
  • 宁波网站建设方案报价长沙网开亿面做网站多少钱
  • 国内外网站大连建设工程交易中心
  • 建筑毕业设计代做网站网站侧边菜单
  • seo网站建设规划做网站好的网络公司
  • 黄页网页的推广网站wordpress jexus
  • 外贸网站建设不可缺少的灵活性一般做企业网站需要什么
  • 揭阳网站开发mituad网站备案管理办法
  • 做网站服务费税率邯郸网站建设优化排名
  • 做网站需要会编程吗网站建设通常用到哪些编程
  • 中国网站建设市场排名做设计素材在哪个网站
  • 贵阳手机网站开发商务网站建设与维护 ppt
  • 域名网站注册最划算当前主流的网络营销方式
  • 搭建网站需要多少钱网站建设方式丨金手指排名26
  • 如何搭建网站教程南通做网站优化
  • 创建个人网站的流程平台搭建步骤
  • 做网站建设需要什么资质商城app开发价格
  • 如何提升网站的搜索排名网站快照
  • 关于做一动物网站的界面个互联网做网站怎么赚钱
  • 值得相信的西安网站开发英文网站建设公司 杭州
  • 职高门户网站建设标准书画网站建设方案策划
  • 门户网站什么意思游戏开发引擎
  • 做棋牌网站犯法吗石家庄有什么做网站的公司
  • asp做学生信息网站网上做头像用什么网站
  • 网站搜索不到公司网站外贸搜素网站
  • 河南建设厅网站查证阜宁做网站工作室
  • 百度网盘搜索引擎网站微信公众平台运营
  • 公司网站制作需要多少钱河北省住房城乡建设厅网站
  • 自己的网站什么做优化e时代速递搜索引擎网站建设