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

中宁网站建设北京模型设计制作

中宁网站建设,北京模型设计制作,网页设计期末作业模板,天津做网站选择津坤科技cC是一种通用编程语言#xff0c;具有高级抽象、强类型和编译性能等特点。C语言具有许多特性#xff0c;包括面向对象编程、模板、多态、运算符重载等等。它广泛应用于各种领域#xff0c;如系统软件、嵌入式系统、游戏开发、科学计算等等。 1、C11相对于C98的新特性#xf…C是一种通用编程语言具有高级抽象、强类型和编译性能等特点。C语言具有许多特性包括面向对象编程、模板、多态、运算符重载等等。它广泛应用于各种领域如系统软件、嵌入式系统、游戏开发、科学计算等等。 1、C11相对于C98的新特性 类型推导auto、decltype 右值引用 nullptr关键字可以明确指定空指针避免和整型值0混淆 范围for循环可以遍历容器、数组和其它可迭代对象 列表初始化 lambda表达式可以定义匿名函数使代码更加灵活 静态断言在编译时检查程序的正确性 强类型枚举可以避免枚举类型的值被隐式地转换为整型 2、int和float相互转换是否有精度损失 Int转float会有精度损失这与float类型在内存中的存储方式有关float和double不一样浮点数转换为整型数会有小数截断问题 3、函数里面是否可以嵌套函数 可以在函数中嵌套函数的被嵌套的函数称为内部函数或局部函数。内部函数只在包含它的函数的作用域内可见对于函数外部的其他部分来说是不可见的。内部函数可以访问包含它们的函数的局部变量和参数但不能访问外部函数的局部变量和参数。 在C11之前内部函数必须在外部函数的开始处先进行声明然后再进行定义。而在C11之后可以在函数中直接定义内部函数而无需提前声明。 4、结构体里是否可以定义结构体 可以 结构体的自引用(self reference)就是在结构体内部包含指向自身类型结构体的指针。 结构体的相互引用mutual reference就是说在多个结构体中都包含指向其他结构体的指针。 5、仿函数functor 行为类似函数可作为算法的某种策略又称为函数对象Function Object是一个能行使函数功能的类即使一个类的使用看上去像一个函数从实现角度来看仿函数是一种重载了operator()的class或者class template。 6、lamda表达式 Lambda表达式是C11中引入的一种新特性它是一种用来创建匿名函数的语法 Lambda表达式在C中广泛应用可以用于STL算法、函数对象等等方面。它可以提高代码的简洁性和可读性同时也提供了一种方便的方式来定义临时的函数对象。 7、Unsigned int和unsigned long 在32位和64位下分别是多大 8、this指针 this指针是一个指向当前对象的指针。当我们在一个成员函数中调用成员变量或成员函数时编译器会自动将this指针作为一个隐藏参数传递给该函数以便在函数内部能够访问当前对象的成员。 this指针可以用来解决成员变量和函数参数同名的问题。在函数内部如果有一个局部变量和一个成员变量同名可以使用this指针来访问成员变量如 class MyClass { public:void setX(int x) { this-x x; } private:int x; };this指针存在的目的 保证每个对象拥有自己的数据成员但共享处理这些数据成员的代码 9、重载和重写 overload重载是指同一可访问区内被声明的几个具有不同参数列参数的类型个数顺序不同的同名函数根据参数列表确定调用哪个函数重载不关心函数返回类型。 override重写覆写是指派生类中存在重新定义的函数以实现不同的功能一般是用于子类在继承父类时重写父类方法。其函数名、参数列表、返回值类型、所抛出的异常所有都必须同基类中被重写的函数一致。被重写的方法不能为private。只有函数体不同花括号内派生类调用时会调用派生类的重写函数不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。 范围区别重载是在同一个作用域内定义多个同名函数通过参数的不同来区分而重写是在不同的类之间子类重新定义父类的虚函数。参数区别重载可以改变函数的参数类型、个数或顺序但不能改变函数的返回值类型和函数名而重写必须具有与被重写函数相同的函数名、参数列表和返回值类型。virtual重写的基类函数必须有virtual修饰重载函数和被重载函数可以被virtual修饰也可以没有。重载是静态绑定即在编译期间就确定了调用的函数而重写是动态绑定即在运行期间根据实际对象的类型来确定调用的函数。 使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。 重写和重载的本质区别是加入了override的修饰符方法此方法始终只有一个被使用的方法。 10、static关键字的作用 修饰全局变量时表明一个全局变量只对定义在同一文件中的函数可见只能该文件内访问修饰局部变量时表明该变量的值不会因为函数终止而丢失修饰函数时表明该函数只在同一文件中调用只能该文件内访问修饰类的数据成员表明对该类所有对象数据成员只有一个实例即该实例归所有对象共有修饰类的成员函数该成员函数先于类实例存在而存在且只能访问静态成员 作用用来控制变量的存储方式和可见性实现多个对象之间的数据共享隐藏并且使用静态成员还不会破坏隐藏规则默认初始化为0静态变量不会被重复初始化不会在函数结束时销毁 11、vector扩容机制 vector是C STL中的容器之一是一个动态数组可以自动扩容。当vector中的元素数量超过其容量时vector会自动重新分配一块更大的内存将原有元素拷贝到新的内存中并释放原有内存。 vector的扩容机制主要涉及以下几个概念 容量capacityvector的容量是指它当前分配的内存能够容纳的元素数量而不是实际元素数量。当元素数量超过容量时vector需要扩容。大小sizevector中实际存储的元素数量。增量策略growth policy当vector需要扩容时它会分配一块新的内存并将原有元素拷贝到新的内存中。vector的增量策略决定了新的容量应该是多少通常是原有容量的两倍。指向数据的指针pointer to datavector中存储元素的内存块的首地址。当vector需要扩容时它会执行以下步骤 计算新的容量通常为原有容量的两倍。分配一块新的内存大小为新的容量。将原有元素拷贝到新的内存中。释放原有内存。更新vector的容量和指向数据的指针。vector的扩容机制可以提高效率但同时也会带来额外的开销。因此在实际使用中应尽可能减少vector的扩容次数可以通过预分配足够的容量来避免频繁扩容。 12、请说出 const char * p 、 char const *p 与 char * const p的区别 声明一个指向字符或字符串常量的指针p所指向的内容不可更改p是指向char类型的指针const表示p指向的内容为const类型不可更改不能指向const char类型没有const*的运算所以与前面的一样从右至左Const修饰的是pp中的值不可更改p是一个地址 13、有哪些强制类型转换static_cast、dynamic_cast、reinterpret_cast 和 const_cast 几种 C 类型转换符的区别 C是一种强类型语言更加安全 const_cast用来将对象的常量属性移除使常量可以被修改针对常量指针、常量引用、常量对象。常量指针转换为非常量指针并且仍然指向原来的对象。常量引用被转换为非常量引用并且仍然指向原来的对象。dynamic_cast用来处理一种“安全向下转换”具有类型检查功能比static_cast更安全转换后必须是类的指针、引用或void*基类要有虚函数可以交叉转换。dynamic本身只能用于存在虚函数的父子关系的强制类型转换对于指针转换失败则返回nullptr对于引用转换失败会抛出异常reinterpret_cast是用于底层的强制转换导致不可移植的结果eg将一个指针转换成数组、将整形转换成指针static_cast用来处理隐式转换可以将int转换为float也可以将char转换为int将指向基类的指针转换为指向子类派生类的指针任何类型的表达式转化为void类型没有运行时类型检查来保证转换的安全性 14、Volatile作用 与const对立是类型修饰符影响编译器编译的结果用该关键字声明的变量随时可能发生改变 当一个值可能随时会发生改变时编译器就不能去假设这个变量优化器每次用到这个变量都必须去内存重新读取而不是使用保存在寄存器里边的值。 作用确保本条指令不会因编译器的优化而省略且要求每次直接读值保证对特殊地址的稳定访问 15、new和malloc的区别 new是操作符而malloc是函数。new在调用的时候先分配内存在调用构造函数释放的时候调用析构函数而malloc没有构造函数和析构函数。malloc需要给定申请内存的大小返回的指针需要强转new会调用构造函数不用指定内存的大小返回指针不用强转。new从自由存储区上为对象动态分配内存空间malloc从堆上动态分配内存new/delete 可以被重载malloc/free允许被重载new发生错误时抛出bac_alloc异常malloc分配内存失败时返回NULLnew可以用来创建对象和对象数组创建对象不一定需要定义初始值 16、内联函数和普通函数的区别 内联函数比普通函数多了关键字inline以代码膨胀复制为代价仅仅省去了函数调用的开销从而提高函数的执行效率。 如果一些函数被频繁调用不断地有函数入栈即函数栈会造成栈空间或栈内存的大量消耗内联函数避免了函数调用的开销普通函数有调用的开销 普通函数在被调用的时候需要寻址函数入口地址内联函数不需要寻址。 内联函数有一定的限制内联函数体要求代码简单不能包含复杂的结构控制语句(内联函数内不允许用循环语句和开关语句。)普通函数没有这个要求。 17、C和C的区别 C语言是C的子集C可以很好兼容C语言。但是C又有很多新特性如引用、智能指针、auto变量等 C是面对对象的编程语言C语言是面对过程的编程语言 C语言有一些不安全的语言特性如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C对此增加了不少新特性来改善安全性如const常量、引用、cast转换、智能指针、try—catch等等 C可复用性高C引入了模板的概念后面在此基础上实现了方便开发的标准模板库STL。C的STL库相对于C语言的函数库更灵活、更通用。 18、指针怎么分配内存分配好后怎么判断是否分配成功 在 C 中可以使用 new 运算符来动态地分配内存。分配内存后可以通过判断指针是否为空来判断分配内存是否成功。如果分配失败则指针将为 nullptr。或者使用 try-catch 块来捕获分配内存时可能抛出的 std::bad_alloc 异常。在使用完动态分配的内存后应当使用 delete 运算符释放内存以避免内存泄漏。 19、指针和引用的区别 引用总是指向一个对象指针可能不指向一个对象 指针存放某个对象的地址其本身就是变量本身就有地址可以有指向指针的指针可变性包括其所指向的地址的改变和其指向的地址中所存放数据的改变 引用就是变量的别名不可改变必须初始化 20、指针函数和函数指针的区别 指针函数是一个函数其返回的是一个指针。 函数指针则是一个指向函数的指针变量。它可以指向任何类型的函数包括带参数和不带参数的函数以及带返回值和不带返回值的函数。 21、内存对齐机制 不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常。 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于为了访问未对齐的内存处理器需要作两次内存访问而对齐的内存访问仅需要一次访问。 内存对齐或内存对其是计算机组成中的一个概念它是指存储器中的数据在分配存储空间时按照一定的规则排列以使存取数据的时间效率最高。CPU从内存中取出数据的时候通常会以缓存行Cache Line为单位进行如果数据的地址没有对齐到缓存行的起始地址就会跨两个缓存行访问这种情况下会导致额外的开销。 内存对齐的规则如下 数据类型对齐规则不同的数据类型有不同的对齐方式通常按照数据类型的大小进行对齐例如 char 是 1 字节对齐int 是 4 字节对齐double 是 8 字节对齐。 结构体对齐规则结构体的每个成员都要按照自身的对齐方式进行对齐同时结构体本身也要进行对齐对齐大小取结构体中最大数据成员的对齐值。 堆内存和栈内存对齐规则堆内存和栈内存的对齐方式一般取决于操作系统和编译器的实现一般情况下按照 8 字节对齐。内存对齐的优势在于能够提高程序的运行效率和性能但是它也会占用更多的存储空间特别是对于结构体和类对象这样的复合类型。 22、宏定义和内联函数的区别 define 定义预编译时处理的宏只是简单的字符串替换无类型检查不安全 inline 是先将内联函数编译完成生成了函数体直接插入被调用的地方减少了压栈、跳转和返回的操作没有普通函数调用时的额外开销内联函数是一种特殊的函数会进行类型检查对编译器的一种请求编译器有可能拒绝这种请求 23、全局变量、局部变量、静态变量的联系和区别 作用域全局变量的作用域是整个程序局部变量的作用域只在其定义的函数或语句块内部而静态变量的作用域与其定义的位置有关。局部静态变量在函数内部定义作用域是整个函数而全局静态变量在文件内定义作用域是整个文件。存储位置全局变量和静态变量都是存储在静态存储区中而局部变量通常存储在栈中。生命周期全局变量的生命周期从程序开始到程序结束而局部变量和静态变量的生命周期与其作用域有关。局部变量在其定义的函数或语句块执行完毕后被销毁而静态变量在程序执行期间一直存在。初始化全局变量和静态变量在程序开始时自动初始化为0或空值而局部变量不会自动初始化。未初始化的变量将包含随机值因此必须手动初始化。24、traits的原理及其作用 Traits是一种编程技术其原理是通过模板特化或模板偏特化来提供类型相关信息的统一访问接口。Traits的作用是将类型相关信息从算法或类中分离出来使得代码更加通用、灵活和可维护。 具体来说Traits的原理是通过定义一个模板类或模板函数其中包含一个或多个静态成员函数这些静态成员函数用于返回关于类型T的信息例如类型T的大小、类型T是否是指针类型、类型T是否是类类型等。然后在算法或类中使用这些静态成员函数来获取类型相关信息而不必直接操作类型本身。 Traits的作用是提高代码的可维护性和可复用性。通过使用Traits可以将类型相关的信息从代码中抽象出来使得代码更加通用、灵活和可扩展。例如一个排序算法可以使用Traits来获取元素类型的大小从而不必针对每种元素类型都写一份排序代码。又如一个泛型容器可以使用Traits来判断元素类型是否支持某种操作从而保证代码的类型安全性。 25、strlen和sizeof的区别 strlen是函数sizeof是运算符sizeof()返回所占总空间的字节数strlen()返回字符数组或字符串所占的字节数 strlen只能计算以’\0’结尾的字符数组的长度而且计算结果不包括’\0’而sizeof可以计算任意类型或变量的大小包括数组、结构体、指针等计算结果包括所有元素的大小。 26、union和struct的区别 主要区别在于内存布局和成员变量的访问方式 结构体是一种能够容纳多个不同类型的成员变量的数据结构它的每个成员变量都可以独立地访问和修改。结构体的内存布局是将各个成员变量按顺序依次存储每个成员变量都有自己的内存地址。 联合体中的成员变量共用同一块内存空间它们的值会相互覆盖。联合体的内存布局是将各个成员变量放在同一块内存空间中不同的成员变量使用同一块内存可以互相覆盖。 27、class和struct的区别 struct 一般用于描述一个数据结构集合而 class 是对一个对象数据的封装 struct 中默认的访问控制权限是 public 的而 class 中默认的访问控制权限是 private 的 在继承关系中struct 默认是公有继承而 class 是私有继承 class 关键字可以用于定义模板参数就像 typename而 struct 不能用于定义模板参数 28、 29、什么是野指针空指针它们俩的区别 野指针指针指向的位置是不可知的随机的、不正确的、没有明确限制的 产生原因释放内存后指针不及时置空依然指向了该内存可能出现非法访问 30、什么是虚函数虚函数表存放的内容 当基类希望派生类定义适合自己的版本就将这些函数声明为虚函数virtual 虚函数表保存虚函数地址当用基类指针指向派生类时虚表指针指向派生类的虚函数表 动态绑定使用虚函数的指针和引用能够正确找到实际类的对应函数而不是执行定义类的函数 何时共享虚函数地址表 如果派生类继承的第一个是基类且该基类定义了虚函数地址表则派生类就共享该表首址占用的存储单元 31、构造函数/析构函数可以是虚函数吗 构造函数不能是虚函数并且在构造函数中调用虚函数实际执行的是父类的对应函数 析构函数可以是虚函数并且在一个复杂类结构中这往往是必须的 32、空类编译器自动生成哪些函数 默认构造函数、默认析构函数、复制构造函数、赋值运算符 当空类被继承时编译器不会自动生成默认构造函数和默认析构函数因为派生类的构造函数和析构函数会调用基类的构造函数和析构函数如果基类没有默认构造函数和默认析构函数那么派生类就无法实例化。因此在空类被继承时必须显式提供构造函数和析构函数。 33、拷贝构造函数的细节 拷贝构造函数的参数必须是const引用否则在复制参数时会再次调用拷贝构造函数导致死循环。如果类中含有指针类型的成员变量在拷贝构造函数中需要重新为指针分配内存并将原来指针指向的数据复制到新分配的内存空间中避免浅拷贝的问题。如果类中含有静态成员变量或常量成员变量则不需要在拷贝构造函数中进行处理因为这些成员变量是类的属性而不是对象的属性。拷贝构造函数在什么情况下会被自动调用当一个对象被用作函数参数按值传递或者在函数中返回一个对象时都会调用拷贝构造函数。拷贝构造函数是浅拷贝还是深拷贝如果类中有指针类型的成员变量则默认拷贝构造函数是浅拷贝需要自定义拷贝构造函数来实现深拷贝。34、堆和栈的区别 堆的空间使用malloc/new和free/delete申请释放程序员手动管理 栈是在函数调用过程中用于存储局部变量等的存储空间由编译器自动生成代码管理 栈是向低地址扩展的数据结构是一块连续的内存区域 堆是向高地址扩展的数据结构是不连续的内存区域。 35、为什么需要虚继承 虚继承是为了解决多继承时的命名冲突和冗余数据问题二义性问题在多继承中如果两个基类拥有同名的成员函数或成员变量那么派生类就无法确定应该继承哪一个基类的成员。虚继承可以让派生类只继承一份共同的基类从而避免在派生类中出现多个拷贝的基类实例。虚继承使得基类在派生类中共享同一个实例从而消除了二义性。 C标准库的iostream就是一个虚继承的例子 36、什么是范型编程 泛型编程Generic Programming是一种以数据结构和算法为中心的编程方法。其核心思想是编写与特定数据类型无关的代码使得代码能够适用于多种数据类型从而提高代码的复用性和可移植性。 在C中泛型编程是通过模板Template实现的。模板是一种可重用的代码结构它可以让程序员编写一次代码而不必为每一种特定类型都编写一遍代码。通过使用模板程序员可以创建具有通用性的函数、类和数据结构从而实现真正的代码重用和泛化。 37、请简述privatepublicprotectedinternal的区别 private私有成员只能在类的内部访问外部不能访问public公有成员任何地方都可以访问protected保护成员可以被类内部以及派生类中访问但外部不能访问internal内部成员只能在当前程序集内部访问 38、C内存管理内存分配方式 大致分为四个区域 代码区存放CPU执行的二进制代码指令由操作系统进行管理 全局区存放全局变量和静态变量以及全局常量和字符串常量 栈区由编译器自动编译释放存放函数的参数值局部变量等 堆区由程序员分配释放如果程序员不释放则程序结束时由操作系统回收 内存分配方式 a、从静态存储区分配内存在程序编译的时候就已经分配好这块程序在程序的整个运行期间都存在如全局变量static变量 b、在栈上创建在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限 c、从堆上分配/动态内存分配程序在运行的时候用malloc或new申请任意多少的内存程序员负责在何时用free或delete释放内存。 39、如何在主函数之前先执行一段代码 在C中在程序开始执行时会先调用一组称为 “静态初始化” 的函数这些函数会在程序的 main() 函数之前执行。可以通过在代码中定义一个全局变量来实现在主函数之前先执行一段代码。在定义该全局变量时在其构造函数中编写需要在主函数之前执行的代码即可。 40、switch参数有什么限制 switch的参数必须是整型或枚举类型的值。 必须是常量表达式即其值必须在编译时已知参数不能是浮点数、字符数组或字符串类型参数不能是指针类型不能是表达式或变量。 enum Color { Red, Green, Blue }; //枚举类型的例子 void printColor(Color c) {switch (c) {case Red:std::cout 红色 std::endl;break;case Green:std::cout 绿色 std::endl;break;case Blue:std::cout 蓝色 std::endl;break;default:std::cout 未知颜色 std::endl;break;} }int main() {Color c Red;printColor(c);return 0; }41、strcpy和memcpy的区别 参数类型不同strcpy 的参数是 char* 类型而 memcpy 的参数是 void* 类型。目标内存空间的处理方式不同strcpy 会在遇到第一个 \0 字符时停止拷贝并把该字符也复制过去因此适用于字符串的复制而 memcpy 会完整地复制指定长度的内存块不会在遇到 \0 字符时停止。安全性不同strcpy 不检查目标内存空间是否足够大容易引起缓冲区溢出从而导致程序崩溃或安全漏洞而 memcpy 可以指定要复制的长度可以更加安全地处理内存拷贝。如果要复制字符串应该使用 strcpy而对于其他类型的内存块复制应该使用 memcpy。在使用 strcpy 时应当确保目标内存空间足够大以避免缓冲区溢出等问题。 42、类内static成员可以定义为const的吗 在 C 中类内的 static 成员变量可以定义为 const。这种情况下这个静态成员变量的值是编译时确定的并且在程序运行期间保持不变。 定义为 const 的静态成员变量需要在类定义之外进行初始化 43、什么是智能指针实现原理 智能指针是 C 中的一个重要概念它是一个类模板用于管理动态分配的对象可以自动释放对象避免内存泄漏等问题。智能指针包括 unique_ptr、shared_ptr 和 weak_ptr 等类型。 智能指针的实现原理是基于 RAIIResource Acquisition Is Initialization技术。当一个对象被创建时它可以自动地获取一个资源当这个对象不再需要时它会自动释放这个资源。智能指针就是利用了 RAII 技术将动态分配的对象封装在一个对象中并在对象的析构函数中自动释放这个对象。 44、深拷贝和浅拷贝 浅拷贝将一个对象的值复制到另一个对象这两个对象共享相同的内存地址。当一个对象更改值时另一个对象也会发生相应的更改。这种拷贝方式默认的拷贝构造函数和赋值运算符都是浅拷贝 深拷贝在堆中为对象分配新的内存然后将原对象的值复制到新对象中。新对象和原对象拥有不同的内存地址修改一个对象的值不会影响到另一个对象。要实现深拷贝需要自定义拷贝构造函数和赋值运算符 浅拷贝只是简单地复制指针而深拷贝则是在堆中创建新的内存来存储数据避免了多个对象共享相同内存的问题。 45、委托构造函数的优缺点 委托构造函数是C11新增的特性可以在一个构造函数中调用同一类的另一个构造函数从而减少了代码的冗余。 优点 代码简洁可以避免代码重复提高代码可读性和可维护性灵活性委托构造函数可以通过不同的参数调用其他的构造函数从而实现不同的初始化方式安全性委托构造函数能够确保所有的成员变量都被正确地初始化避免了忘记初始化的问题。 缺点 委托构造函数必须在初始化列表中首先被调用如果没有初始化列表就不能使用委托构造函数委托构造函数不能调用其他非委托构造函数也不能执行其他的操作只能用于初始化在使用委托构造函数时需要注意初始化顺序否则可能会引起不可预知的错误。 46、C中有几种智能指针分别有什么异同 在C中智能指针是一种特殊类型的指针它能够自动释放动态分配的内存从而避免内存泄漏。C11引入了三种主要类型的智能指针unique_ptr、shared_ptr和weak_ptr。 unique_ptr unique_ptr是一种独占式智能指针它拥有对其所指对象的独占权当unique_ptr离开作用域时它所指向的对象就会被销毁可以通过std::move()将unique_ptr的所有权从一个对象转移到另一个对象。shared_ptr shared_ptr是一种共享式智能指针可以多个指针共享同一对象通过计数器来维护资源的引用计数。每当有一个新的shared_ptr指向同一对象时计数器就会加1当有一个shared_ptr指向的对象被销毁时计数器就会减1当计数器为0时表示没有任何shared_ptr指向该对象就会自动释放对象。weak_ptr weak_ptr是一种弱引用的智能指针它可以指向一个由shared_ptr管理的对象但它不会增加该对象的引用计数当它所指的对象被销毁后它将自动变为一个空指针。47、C 语言中实现死循环有哪些方式 while(1){} //1换成 true是同样的效果for(;;){}start:// 执行代码 goto start;48、C标准库map std map是STL的一个关联容器map中的元素是关键字----值的对(key–value)关键字起到索引的作用值则表示与索引相关联的数据。每个关键字只能在map中出现一次。STL的map底层是用红黑树实现的查找时间复杂度是log(n) C标准库中的map是一种关联容器也被称为字典或关联数组它提供了一种将键映射到值的方法其中每个键只能在map中出现一次。它使用一种红黑树的数据结构实现保证了在log(n)的时间复杂度内进行插入、删除、查找等操作。 map的一些常用特性包括 它是一个自动排序的容器它默认按照键进行升序排序但也可以使用自定义比较函数来进行排序。它可以存储任意类型的数据只要支持小于比较运算符即可。它支持下标运算符[]可以用键作为下标来访问相应的值。它支持多种迭代器包括正向迭代器、反向迭代器和const迭代器。它提供了一些常用的方法如插入、删除、查找、计数、交换、比较等。使用map可以实现很多常见的数据处理任务例如词频统计、排序、去重等。在实际开发中map也被广泛应用于诸如缓存、路由表、索引等需要高效查找和插入的场景中。 49、友元函数 C中的友元函数是指在类定义中可以声明为友元的函数。友元函数是可以访问该类的私有成员的非成员函数。 使用友元函数的方式是在类定义中声明该函数为友元函数一般在类的私有部分声明 class MyClass { private:int my_private_member;friend void my_friend_function(MyClass); };友元函数通常用于类之间的协作可以让某些函数访问另一个类的私有成员从而减少公有接口增强程序的安全性。但同时友元函数也会破坏封装性需要谨慎使用。 50、define和typedef define 只存在简单的字符串替换没有类型检查在编译的预处理阶段起作用可以用来防止头文件重复引用不分配内存给出的是立即数有多少次使用就进行多少次替换 typedef 有对应的数据类型要进行判断在编译、运行时起作用在静态存储区中分配空间在程序运行过程中内存中只有一个拷贝 51、inline编译限制 在 C 中inline 是一种关键字用于告诉编译器将函数的代码插入到函数调用点处而不是调用函数。这样做可以避免函数调用的开销提高程序的运行速度。 使用 inline 关键字可以将函数定义为内联函数。内联函数通常被放在头文件中以便在多个源文件中使用因为内联函数可以在编译时直接替换调用点从而避免了在运行时执行函数调用的开销。 在使用 inline 关键字时需要注意以下几点限制 递归函数不能定义为内联函数。函数体不能包含任何循环语句或 switch 语句。内联函数的定义必须在调用点之前。编译器可能会忽略 inline 关键字并将其解释为普通函数。总之inline 可以用于优化程序性能但是需要遵守一些限制并且不能滥用。只有当函数被频繁调用且函数体简单时才应该考虑将其定义为内联函数。 (不能存在任何形式的循环语句不能存在过多的条件判断语句函数体不能过于庞大内联函数声明必须在调用函数前) 52、继承 让某种类型的对象获得另一个类型对象的属性和方法 它可以使用现有类的所有功能并在无须重新编写原来的类的前提下对这些功能进行扩展 方式实现继承、接口继承、可视继承 C Primer Plus中例子将人定义为一个抽象类拥有姓名性别年龄等公共属性吃饭睡觉等公共方法在定义一个具体的人时就可以继承这个抽象类既保留了公共属性和方法也可以在此基础上扩展跳舞唱歌等特有方法。 53、封装 将数据和代码捆绑在一起避免外界干扰和不确定性访问 把客观事物封装为抽象的类并且类可以把自己的数据和方法只让可信的类或对象操作对不可信的进行信息隐藏 54、多态 多态性允许将父对象设置成为和一个或更多的他的子对象相等的技术赋值之后父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作 允许将子类类型的指针赋值给父类类型的指针 实现 override子类重新定义父类的虚函数的做法 overload允许存在多个同名函数这些函数的参数表不同 55、为什么空类的大小不是0而是1 为了确保两个不同对象的地址不同类的实例化是在内存中分配一块地址每个实例在内存中都有独一无二的地址空类也会实例化所以编译器会给空类隐含的添加一个字节这样空类实例化后就有独一无二的地址了 若拥有虚函数表的地址或含有指向虚基类的指针则sizeof为4 56、什么是内存泄漏 内存泄漏memory leak是指由于疏忽或者错误造成了程序未能释放掉不再使用的内存的情况。并非指内存在物理上的消失而是应用程序分配某段内存后由于设计错误失去了对该段内存的控制因而造成了内存的浪费。 当派生类对象中有内存需要回收时如果析构函数不是虚函数不会触发动态绑定只会调用基类析构函数导致派生类资源无法释放造成内存泄漏。 57、STL六大组件的交互关系 容器、算法、迭代器、仿函数、适配器、空间配置器 a、容器通过空间配置器取得数据存储空间 b、算法通过迭代器存储容器中的内容 c、仿函数可以协助算法完成不同的策略的变化 d、适配器可以修改仿函数 58、析构函数 一个类有且仅有一个析构函数构造函数可以不止一个析构函数的名字与类名相同但要在前面加 ~析构函数没有参数和返回值析构函数可以在类内声明在类外定义不一定要在类内定义 59、deque deque是一个双端开口的连续线性空间其内部为分段连续的空间组成随时可以增加一段新的空间并链接 支持快速随机访问由于deque需要处理内部跳转因此速度上没有vector快 60、C和C中的struct有什么不同 C语言中struct不可以含有成员函数而C中的struct可以 61、STL优点 高可重用性高性能高移植性 62、解释一下C中的动态内存分配并描述new和delete关键字的作用 C中的动态内存分配指的是程序在运行时根据需要从系统中分配一块内存称为堆内存以供程序使用。动态内存分配可以让程序在运行时灵活地管理内存解决静态内存分配可能导致的内存浪费和不足的问题。 在C中使用new关键字来动态分配内存new关键字会在堆上分配一块指定大小的内存并返回一个指向该内存区域的指针。 使用delete关键字来释放内存delete会将指针所指的堆内存释放以供其他程序使用。 使用new和delete动态分配和释放内存可以避免静态内存分配可能导致的内存浪费和不足的问题。需要注意的是使用new动态分配的内存需要使用delete来释放否则会导致内存泄漏即程序无法再次访问该内存。同时使用delete释放内存后该内存区域的内容将不再可用使用该指针访问内存将导致未定义行为。 除了使用new和delete还可以使用new[]和delete[]来动态分配和释放数组。使用new[]动态分配数组时需要指定数组的长度 使用delete[]释放数组时需要使用数组名作为参数而不是数组中的元素指针 63、解释一下C中的拷贝构造函数和拷贝赋值运算符 拷贝构造函数和拷贝赋值运算符是C中用来实现对象之间深拷贝的两个重要函数。它们的作用是在对象之间进行数据拷贝使得每个对象都拥有一份独立的数据副本避免了对象之间的浅拷贝带来的问题。 拷贝构造函数的作用是在创建一个对象时以另一个同类对象作为初始化对象来完成新对象的初始化。 拷贝构造函数有一个重要的参数即同类对象的引用。在使用赋值语句或传递参数时拷贝构造函数会被自动调用用以复制数据成员。 class MyClass { public:MyClass(); // 默认构造函数MyClass(const MyClass other); // 拷贝构造函数 };拷贝赋值运算符是用来重载赋值运算符“”的函数。它的作用是在已经存在的对象之间完成数据成员的复制实现两个对象之间的深拷贝。 class MyClass { public:MyClass operator(const MyClass other); // 拷贝赋值运算符 };64、什么是类和对象它们之间有什么区别 在 C 中类是一种自定义的数据类型可以用来描述一类具有相同属性和行为的对象。类由成员变量和成员函数组成成员变量描述了对象的属性成员函数描述了对象的行为。类定义了一种新的数据类型可以创建该类型的对象。 对象是类的实例化是类的一个具体实例。对象是类的一个变量拥有类定义的所有属性和行为。类定义了一种新的数据类型而对象则是这种数据类型的具体实例。 类和对象的区别可以简单概括为类是一个模板或者蓝图而对象是根据这个蓝图创建出来的实体。类是定义对象是实现。类是一个数据类型而对象则是该数据类型的一个具体实例。 65、 list类型支持双向顺序访问在list中任何位置插入删除都很快多态分为三种模板类和模板函数函数重载虚函数一个类占用一个文件私有函数和私有变量采用static关键字修饰即限制了变量和函数的访问范围C为提高程序运行速度可将不太复杂的功能用“内联函数”实现AB a(2)相当于调用了一次构造函数这个构造函数是有参数的AB b[3] 调用了三次构造函数unique_ptr不可复制、赋值但可以使用move()转换对象所有权局部变量的返回值除外函数模板和类模板的参数可以是任意的数据类型函数默认参数设定了参数的默认值后在该参数后定义的所有参数都必须设定默认值编辑、编译、连接、运行C中要实现动态联编必须使用“基类指针”调用虚函数三大特性封装、继承、多态C设置虚基类的目的是消除二义性C中的三种传参方式值传递、指针传递、引用传递多态分为编译时的多态和运行时的多态编译时的多态可通过函数重载实现运行时多态性机制称为动态绑定do…while循环先循环后判断循环体至少被执行一次抽象类的声明必须包含abstract关键字抽象类只能用作其他类的基类不能使用抽象类定义对象抽象类不能用作参数类型、函数返回类型或显式转换的类型”函数代码少、频繁调用“适宜采用inline定义函数 按位与操作只有对应两个二进制数都为1结果才为1”动态分区分配“方案要求程序在主存必须连续存放OOP是重要的设计思想不要求具体语言C只是比C语言更适合于OOP编程局部变量的作用范围仅仅在定义它的方法内或是在定义它的控制流块中返回值不能作为区别函数重载的标志C中来自class的继承默认按照private继承处理来自struct的继承默认按照public处理C语言里的struct只是变量的聚合体struct不能有函数C的struct可有构造和析构函数一个.cpp文件会生成一个.obj文件.h文件不会生成.obj文件一个参数既可以是const同时是volatile希望它是只读的同时是易变的在C中含有纯虚函数的类称为抽象类它不能生成对象抽象类必须被继承且纯虚函数被覆盖后由子类实例化对象||或逻辑左边为真就会忽略右边表达式与逻辑左边为假就会忽略右边表达式函数名(实参1实参2实参3 … 实参n) 实参可以是具有确定值的常量、变量、表达式、函数等fopen、exit函数的调用必须进入内核才能完成虚函数用于实现运行时的多态或者称为晚绑定或动态绑定虚函数可以声明为inline静态函数不可以是虚函数二目运算符重载为类成员函数时 由于this指针的作用函数参数会少一个vector在堆中分配了一段连续的内存空间来存放元素continue是结束本次循环本次循环中continue下面代码不再执行直接进入下次循环。break直接跳出当前循环。析构函数的格式~类名(); 没有参数列表、返回值类型及返回值。封装的主要作用在于对外隐藏内部实现细节增强程序的安全性在函数体中一个被声明为静态的变量在这一函数被调用过程中只会被分配一次内存且整个运行期间不会重新分配C不同于C语言他有更严格的类型检查参数不写返回类型不会默认为intstrcpy拷贝函数不安全可能会导致内存溢出它不做任何的检查措施也不判断拷贝大小不判断目的地址内存是否够用memcpy拷贝函数与strcpy的区别就是memcpy可以拷贝任意类型的数据strcpy只能拷贝字符串类型map的迭代器的key是const类型无法对其进行修改list是双链表实现插入的元素的复杂度为O(1)递归过程的局部变量过多、递归深度过大是造成系统栈溢出的原因
http://www.dnsts.com.cn/news/123639.html

相关文章:

  • 2016个人网站备案怎么做网页宣传
  • 网站导航容易做网站建设评比标准
  • 一 网站开发背景wordpress发布文章页面错误
  • 网站建设方案书阿里云skype在网站上怎么做链接
  • 微网站的图标怎么做做网站排名工具
  • 陕西专业做网站广告制作合同
  • 优化 导航网站用wordpress建站一个人可以吗
  • 百度有没有做游戏下载网站吗想学平面设计哪个网上可以学
  • 做网站通过什么挣钱阳泉推广型网站开发
  • 小企业网站建设怎样可以快速东方网景做网站怎么样
  • 唐山网站建设唐山谷歌推广费用
  • 网站如何实现微crm客户管理系统
  • 网站设计培训班哪家好邯郸网站设计服务平台
  • 网站建设公司官方网站蓝色网站设计
  • 网站建设首页面口碑营销的产品有哪些
  • 简洁大方的电商网站模板运城购物网站开发设计
  • 云服务器怎么架设网站哈尔滨快速建站点击查看
  • 做网站需要技术wordpress资源销售
  • 西安百度网站建设北京监理协会培训网站
  • 安庆城乡建设局网站做网站上传服务器
  • 辽宁网站建设哪里好找学前心理学课程建设网站
  • 哪里有网站制作平台电商小程序名字大全
  • 公司网站后台是什么怎么提交网站
  • 高清视频素材下载网站网站需要哪些费用
  • 同城服务网站开发重庆建设工程信息网官网入口30系统登入
  • 网站建设后需要维护吗卫生间装修效果图
  • 有口碑的唐山网站建设h5网站建设 网站定制开发
  • 百度建站平台官网2016市网站建设总结
  • 海城市建设局网站西安百度
  • 网站做导航设计的作用是什么南昌网站建设方案优化