建行网站会员是什么,logo在线设计制作,网站seo设置,wordpress 招聘网站模板C构造函数有几种#xff0c;分别什么作用
在C中#xff0c;构造函数有几种不同的类型#xff0c;每种都有其特定的作用#xff1a;
默认构造函数#xff1a;没有参数的构造函数#xff0c;用于创建对象的默认实例。参数化构造函数#xff1a;带参数的构造函数#xf…C构造函数有几种分别什么作用
在C中构造函数有几种不同的类型每种都有其特定的作用
默认构造函数没有参数的构造函数用于创建对象的默认实例。参数化构造函数带参数的构造函数允许在创建对象时初始化成员变量。拷贝构造函数以同一类的实例为参数的构造函数用于复制已有对象。移动构造函数以同一类的实例的右值引用为参数用于利用即将销毁的对象的资源。转换构造函数允许将其他类型或值隐式转换为当前类类型的实例。委托构造函数一个构造函数调用另一个构造函数来完成初始化可以是同一个类的其他构造函数。初始化列表构造函数使用成员初始化列表来初始化成员变量这是最高效的初始化方式。常量构造函数声明为const的构造函数可以用于创建常量对象。constexpr构造函数允许在编译时初始化对象用于定义和初始化字面量类型的对象。 每种构造函数的使用场景不同例如 ● 默认构造函数用于快速创建对象而不需要显式提供任何初始化参数。 ● 参数化构造函数提供了灵活性允许在创建对象时定制其状态。 ● 拷贝构造函数和移动构造函数分别用于对象的复制和移动是实现资源管理的关键。 ● 转换构造函数和委托构造函数提供了更灵活的对象初始化方式。 ● 初始化列表构造函数是C中推荐的成员初始化方式因为它可以提高效率。
深拷贝与浅拷贝的区别
浅拷贝 ● 定义浅拷贝仅复制对象本身不复制对象所指向的动态分配的内存。换句话说它只复制内存中的对象副本而不复制对象内部指向的任何动态分配的资源。 ● 实现通常通过复制构造函数或赋值运算符实现。 ● 特点 ○ 速度快因为只涉及基本数据类型的复制。 ○ 如果原始对象包含指针浅拷贝会导致两个对象尝试管理相同的动态内存这可能导致多重释放和悬空指针问题。深拷贝 ● 定义深拷贝不仅复制对象本身还递归地复制对象所指向的所有动态分配的内存。这意味着每个对象都有自己的独立资源副本。 ● 实现通常需要自定义复制构造函数或赋值运算符来确保所有动态分配的资源都被正确复制。 ● 特点 ○ 速度慢因为需要递归地复制所有资源。 ○ 可以安全地使用复制出的对象而不担心资源管理问题。
STL 容器了解哪些
序列容器 ● std::vector: 动态数组提供快速随机访问。 ● std::deque: 双端队列提供从两端快速插入和删除的能力。 ● std::list: 双向链表提供高效的元素插入和删除。 ● std::forward_list: 单向链表每个元素只存储下一个元素的引用。 ● std::array: 固定大小的数组具有静态分配的内存。关联容器: ● std::set: 基于红黑树存储唯一元素的集合, 会默认按照升序进行排序。 ● std::multiset: 允许容器中有多个相同的元素。 ● std::map: 基于红黑树存储键值对的有序映射。 ● std::multimap: 允许映射中有多个相同的键。 ● std::unordered_set: 基于哈希表提供平均时间复杂度为 O(1) 的查找。 ● std::unordered_map: 基于哈希表存储键值对的无序映射。容器适配器Container Adapters: ● std::stack: 后进先出LIFO的栈。 ● std::queue: 先进先出FIFO的队列。 ● std::priority_queue: 优先队列元素按优先级排序。
vector和list的区别
vector ● 基于动态数组std::vector 基于可以动态扩展的数组实现这意味着它在内存中连续存储元素。 ● 随机访问提供快速的随机访问能力可以通过索引快速访问任何元素。 ● 内存分配通常在内存分配上更紧凑因为元素紧密排列没有额外的空间用于链接或指针。 ● 时间复杂度 ○ 元素访问O(1)即常数时间复杂度。 ○ 插入和删除在 vector 的末尾是 O(1)但如果需要在中间插入或删除元素则可能需要 O(n)因为可能需要移动后续所有元素。 ● 内存管理使用连续内存分配可以利用缓存的优势提高访问速度。list ● 基于双向链表std::list 是基于双向链表的容器每个元素通过节点链接到前一个和后一个元素。 ● 非连续存储元素在内存中不是连续存储的每个元素包含指向前一个和后一个元素的指针。 ● 时间复杂度 ○ 元素访问O(n)需要从头开始遍历到所需位置。 ○ 插入和删除非常快速特别是当需要在列表中间插入或删除元素时操作是 O(1)前提是已经拥有指向待插入或删除元素的迭代器。 ● 内存管理由于元素间通过指针链接内存分配可能更分散但插入和删除操作不需要移动其他元素。使用场景 ● std::vector ○ 当你需要快速随机访问元素时。 ○ 当你需要在末尾快速添加或删除元素时。 ○ 当你关心内存使用效率时。 ● std::list ○ 当你需要在列表中间高效地插入或删除元素时。 ○ 当你不需要随机访问元素时。 ○ 当你需要一个灵活的容器可以动态地添加和删除元素而不会引起大量的内存复制或移动。