首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

文章目录 一、函数形参使用推荐方法 二、完整代码示例 一、函数形参使用推荐方法 ---- 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收...形参中的 指针变量 , 具体操作的是 函数中 定义的 局部指针变量 ; 直接使用 *to_tmp++ 样式的代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ; 如果 将...数组首地址 的 常量指针 的 指针指向 进行修改 , 直接就报错了 ; 函数形参 的 值 , 不要轻易进行改变 , 因此一般函数的形参 , 都定义为 const char * 指针常量 类型 ; 引入...辅助 局部变量 , 接收 函数 形参变量 ; 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 ; 代码示例 : /* * 实现字符串拷贝 ( 实现了模块化 ) * 将 from...指针指向的字符串 拷贝到 to 指针指向的字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 形参 char *from_tmp

1.1K10

深拷贝与浅拷贝

当遇到指针类型成员变量时,深拷贝会为目标对象分配新的内存空间,并将源对象指针所指向的实际数据复制到新的内存空间中。这样,即使源对象或目标对象修改了它们各自的数据,彼此之间不会相互影响。...当一个类包含原始指针类型的成员,并且使用默认的拷贝构造函数进行浅拷贝时,会出现两个对象指向同一块内存的情况。...为了避免这种情况,需要实现深拷贝,确保每个对象都有自己独立的内存副本。 代码示例 浅拷贝 在MyClass类中,使用了默认的移动构造函数、复制构造函数、移动赋值函数和复制赋值函数。...这些默认的特殊成员函数对于处理指针成员是不安全的,因为它们会执行浅拷贝,即拷贝指针本身而不是指针所指向的数据。这样,在对象复制或移动时,两个对象将共享相同的数据。...在复制构造函数MyClass::MyClass(const MyClass &other)中,首先创建了一个新的int类型的指针,并将其初始化为other.data所指向的值,从而创建了一个新的数据副本

14110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向..." << endl; } }; 1、父类指针 指向 子类对象 定义 一个子类对象 Child child ; 定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ; 代码示例...// 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer(&child); // 接收父类引用 , 此处传入子类引用 fun_reference...// 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer(p_parent); // 接收父类引用参数 fun_reference(*

    31020

    解锁C++继承的奥秘:从基础到精妙实践(上)

    具体来说,子类会继承基类的成员变量和成员函数,并且可以添加新的成员或修改已有的成员。子类通过继承关系,可以拥有基类的公共和受保护(protected)成员。...这意味着通过基类指针或引用访问派生类对象时,无法直接访问派生类中特有的成员函数或属性。 如果基类中的方法使用了虚函数(virtual),则在运行时会调用派生类中的重写方法(即多态)。...析构函数:基类的析构函数如果是虚函数,派生类对象被销毁时会先调用派生类的析构函数,再调用基类的析构函数。这在使用指向基类的指针删除派生类对象时尤为重要。...,使用基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能会导致内存泄漏或资源未正确释放。...4.3 移动构造函数 如果你没有定义移动构造函数,编译器会为派生类自动生成一个默认的移动构造函数,它会调用基类的移动构造函数并移动派生类的成员。

    17310

    七、构造函数与析构函数

    析构函数可以是虚函数,这在处理基类指针指向派生类对象(多态)时非常重要。通过将基类的析构函数声明为虚函数,可以确保在删除基类指针时调用正确的析构函数(即派生类的析构函数)。...拷贝构造: 当使用另一个同类型的对象来初始化一个新对象时,拷贝构造函数会被调用。 拷贝构造函数有两种主要形式:浅拷贝和深拷贝。浅拷贝只是复制对象的指针,而深拷贝会复制指针指向的实际数据。...用途: 在处理临时对象或即将被销毁的对象时,使用移动构造函数可以避免资源的浪费。 总结:构造函数的分类主要基于其参数和用途。...在C++中,编译器提供的默认拷贝构造函数和拷贝赋值运算符通常执行浅拷贝。 深拷贝(Deep Copy) 深拷贝会创建一个新的内存区域来存储对象的成员变量值,特别是当成员变量是指针或引用类型时。...但是,由于str2的data成员变量指向了相同的内存区域,因此它现在成为了一个悬挂指针。为了避免这种情况,应该使用深拷贝构造函数来确保每个对象都有自己的数据副本。

    14310

    第4章 | 移动

    ——译者注 4.2 移动 在 Rust 中,对大多数类型来说,像为变量赋值、将其传给函数或从函数返回这样的操作都不会复制值,而是会移动值。...从函数返回值 调用 Vec::new() 构造一个新向量并返回,返回的不是指向此向量的指针,而是向量本身:它的所有权从 Vec::new 转移给了变量 composers。...该结构体拥有这个字符串的所有权。 将值传给函数 整个 Person 结构体(不是指向它的指针)被传给了向量的 push 方法,此方法会将该结构体移动到向量的末尾。...("{}", s); } 当我们将向量直接传给循环(如 for ... in v)时,会将向量从 v 中移动出去,让 v 变成未初始化状态。for 循环的内部机制会获取向量的所有权并将其分解为元素。...虽然 C++ 允许重载赋值运算符以及定义专门的复制构造函数和移动构造函数,但 Rust 并不允许这种自定义行为。在 Rust 中,每次移动都是字节级的一对一浅拷贝,并让源变成未初始化状态。

    7710

    《C++Primer》第十三章 拷贝控制

    无论何时一个对象被销毁,就会自动调用其析构函数: 变量离开其作用域时被销毁 当一个对象被销毁时,其成员被销毁 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁 对于动态分配的对象,当对指向它的指针使用...我们使用一个allocator来获取原始内存,由于allocator获取的原始内存是未构造的,我们将在需要添加新元素时使用constructor在原始内存中创建对象,在删除元素时使用destory销毁元素...假设每个string都有一个指向char数组的指针,可以假定string的移动构造函数进行了指针的拷贝,而不是为字符分配内存空间然后拷贝字符。...使用移动而不是拷贝的另一个原因在于IO类或者unique_ptr这样的类,这些类都包含不能被共享的资源(如指针或者IO缓冲),因此这些类型的对象不能被拷贝但是可以被移动。 1....如果vector使用的是拷贝构造函数并且发生异常,在新内存中构造元素时旧元素保持不变,这时候如果发生异常vector可以直接释放新分配(但还没构造成功)的内存并返回。vector中的元素仍然存在。

    1.6K40

    C++相关基础知识总结笔记

    拷贝构造函数:用于创建一个新对象作为现有对象的副本。拷贝构造函数接受一个同类型对象的引用作为参数。 移动构造函数:用于创建一个新对象作为另一个对象的移动(move)。...移动构造函数接受一个同类型对象的右值引用作为参数。 构造函数的调用顺序 当一个类继承自另一个类时,基类的构造函数会在派生类的构造函数之前被调用。...如果类中定义了任何构造函数,但没有定义拷贝构造函数或移动构造函数,编译器会自动生成默认的拷贝构造函数和移动构造函数。 构造函数的应用场景 初始化成员变量:确保对象在使用前处于有效状态。...容器或STL算法:当使用容器(如std::vector、std::list等)或STL算法(如std::sort、std::copy等)时,通常需要拷贝构造函数来创建对象的副本。...深拷贝和浅拷贝 浅拷贝是指在复制对象时,仅仅复制对象的成员变量的值,而不复制成员变量指向的数据。如果成员变量是指针或引用,则浅拷贝只会复制指针或引用本身,而不是指针所指向的数据。

    21330

    C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧

    // 在这里添加其他成员函数和成员变量 }; } 成员变量的的私有数据成员: iterator _start;: 这个成员变量保存了一个指向容器中第一个元素的指针。...iterator _finish;: 这个成员变量保存了一个指向容器中最后一个元素之后的位置的指针。...默认参数的作用:当构造函数被调用而未提供 value 参数时,value 会被初始化为 T(),即一个 T 类型的默认值。 如果提供了 value 参数,那么构造函数会使用提供的值,而不是默认值。...影响: 内存重新分配会导致所有原有的指针和迭代器失效,因为 vector 内部的元素被移动到新的内存位置。 在内存重新分配后,原来的迭代器和指针将不再有效,因为它们指向的是旧的内存区域。...移动操作:使用移动构造函数或移动赋值操作时,也可能导致内部数据的重新分配和元素的重新排列,从而使迭代器失效。

    17410

    this指针小总结

    构造函数和析构函数:在构造函数和析构函数中,this指针特别有用,因为它们是在对象完全构造或完全析构之前/之后调用的。使用this指针可以在构造函数中初始化其他对象或在析构函数中执行清理操作。...它用于访问对象的成员变量和成员函数。当你在成员函数内部引用类的成员时,编译器会隐式地使用this指针(尽管你通常不需要显式地写出this->)。...在某些情况下,如链式调用或需要区分成员变量和局部变量时,this指针特别有用。...普通指针:它的类型可以是任何数据类型的指针(如int*, float*, MyClass*等)。你需要确保在使用它之前正确地初始化了它,并且它指向了一个有效的内存地址。...此外,当你处理动态分配的内存时,务必确保在析构函数、拷贝构造函数和赋值运算符中正确地管理内存,以避免内存泄漏或双重释放等问题。

    7010

    C++11 语法特性:auto 与范围 for 循环详解

    三法则规定,如果一个类管理动态资源(如动态内存分配),那么你通常需要显式地定义以下三个函数: 析构函数:在对象销毁时释放资源。 拷贝构造函数:确保对象复制时正确处理资源。...拷贝构造函数:分配新内存,并将原对象的内容复制到新内存中。 赋值运算符重载:释放旧的内存,分配新内存,并将原对象的内容复制到新内存中。 析构函数:在对象销毁时,释放动态分配的内存,避免内存泄漏。...(s2); // 移动赋值,s2 的资源被转移给 s3 return 0; } 4.4 代码分析 在该示例中,我们添加了移动构造函数和移动赋值运算符重载,并且使用 std::move() 将对象的资源转移给新对象...移动构造函数:通过将原对象的指针直接赋值给新对象来转移资源,并将原对象的指针置为 nullptr,防止资源被重复释放。...通过定义析构函数、拷贝构造函数、赋值运算符、移动构造函数和移动赋值运算符,开发者可以确保对象在拷贝、赋值、移动和销毁时,资源的分配与释放都能被妥善处理。

    22110

    【C++】C++入门 — 类和对象初步介绍

    1 类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。...C++中通过引入this指针解决该问题 即:C++ 编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...只能在“成员函数”的内部使用 this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。...然而,在某些特定情况下,this指针确实可能为空,特别是在不正确的使用情况下,比如: 当对象尚未完全构造完成时,即在构造函数初始化列表结束前或进入构造函数主体之前访问this,这时的行为是未定义的,编译器不会阻止这样的行为...,移动构造函数或移动赋值运算符中,当源对象即将被移动(资源转移)后置为无效状态时,也可能出现类似情况,但这不是this本身为空,而是对象即将变成无效状态。

    12210

    C++面试题

    unique_ptr 实现独占式拥有或严格拥有的智能指针,通过禁用拷贝构造和赋值的方式保证同一时间内只有一个智能指针可以指向该对象;shared_ptr增加了引用计数,每次有新的shared_ptr指向同一个资源时计数会增加...,当计数为0时自动释放资源;构造新的weak_ptr指针不会增加shared_ptr的引用计数,是用来解决shared_ptr循环引用的问题。...虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。...但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置VPTR指向它自己的VTABLE。...如何在共享内存上使用STL标准库?

    1.7K42

    【C++】详解深浅拷贝的概念及其区别

    一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数( copy constructor)、拷贝赋值运算符( copy-assignment operator )、移动构造函数( moveconstructor...拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时做什么。...这种拷贝方式在某些情况下可能会带来一些意想不到的问题,特别是当涉及到动态内存分配时,如: class Stack { public: //类函数声明/定义部分 //成员变量 private: int...什么是深拷贝 深拷贝是一种比较安全和稳定的对象拷贝方式,它在拷贝时如果遇到指针类型的数据,不会像浅拷贝那样单纯的只赋值指针的位置,而是会重新动态开辟一块新的空间,然后将原指针指向空间的内容拷贝到自己新开辟的空间中...而对于类中包含指针类型的成员变量时,特别是这个指针指向的是某块动态开辟的内存空间时,拷贝就必须使用深拷贝来实现,否则就会出现之前提到的指针悬空或内存泄漏等问题. ----

    38300

    【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)

    Node 表示链表节点类型 public: // 构造函数,接受一个指向链表节点的指针 ListIterator(Node* node = nullptr)..._node; } private: Node* _node; // 迭代器指向的链表节点 }; } 2.2.2 解释: 构造函数:初始化一个指向链表节点的指针 _node...2.4.1关键点: 当 _val 是基本数据类型(如 int)时,可以直接通过 *it 来获取节点的值,而不需要使用 *(it->)。虽然 *(it->) 语法上是正确的,但显得繁琐且不必要。...语法上是没有问题的,但通常我们直接使用 *it 更简洁。 当 _val 是自定义类型时,可以使用 it->x 直接访问自定义类型的成员变量 x。...指定大小构造函数:使用 push_back 向链表中插入 n 个值为 val 的节点。 迭代器区间构造函数:通过一对迭代器 [first, last) 形成的区间构造链表。 4.

    15710

    【C++终极篇】C++11:编程新纪元的神秘力量揭秘

    左值是⼀个表⽰数据的表达式(如变量名或解引⽤的指针),⼀般是有持久状态,存储在内存中,我 们可以获取它的地址,左值可以出现赋值符号的左边,也可以出现在赋值符号右边。...这里可以简单理解为偷取,也就是我们实现一个指针把原指针的数据偷走了(swap),这样原指针就指向空了,而我们的新指针指向的就是那块区域。(当然是右值引用才会有的)。...,只有拷⻉构造,没有移动构造的场景 : 而对应vs22这里就一步到位,直接让main函数中的ret所指向的区域让str也指向,有点抽象了。...八·类的一些新功能: 下面是c++11之后新更新的一些新的操作功能: 8.1默认的移动构造和移动赋值: C++11新增了两个默认成员函数,移动构造函数和移动赋值运算符重载。...② STL中容器的新接⼝函数类型也增加了,最重要的就是右值引⽤和移动语义相关的push/insert/emplace系列 接⼝和移动构造和移动赋值,还有initializer_list版本的构造,以及范围

    2900

    C++的智能指针unique_ptr、shared_ptr和weak_ptr

    支持移动语义:unique_ptr支持移动构造和移动赋值操作,可以将所有权转移给新的unique_ptr,而无需进行内存拷贝。...通过移动构造函数将所有权转移给另一个unique_ptr std::unique_ptr ptr2 = std::move(ptr); // 注意,此时ptr已经为空指针,...operator->:箭头操作符,用于通过 unique_ptr 访问对象的成员函数或成员变量。 get:返回指向所管理对象的裸指针。...operator->:箭头操作符,用于通过 shared_ptr 访问对象的成员函数或成员变量。 get:返回指向所管理对象的裸指针。...通过弱引用指针,我们可以在需要时使用lock()函数获取一个有效的shared_ptr来操作对象,一旦对象的引用计数变为0,弱引用指针将自动失效。

    1.1K20

    【重学C++】04 | 说透C++右值引用(上)

    左值 vs 右值简单来说,左值是指可以使用&符号获取到内存地址的表达式,一般出现在赋值语句的左边,比如变量、数组元素和指针等。...复制 vs 移动假设有一个自定义类X,该类包含一个指针成员变量,该指针指向另一个自定义类对象。假设O占用了很大内存,创建/复制O对象需要较大成本。...由于x2在后续代码中可能还会被使用,所以为了避免影响x2,在赋值时调用O的拷贝构造函数复制一个新的O对象给x1在这种场景下是没问题的。...不用调用耗时的O拷贝构造函数,提高效率;2. 交换后,临时X对象拥有之前x1.o_p指向的资源,在析构时能自动回收,避免内存泄漏。...当vector由于push_back、insert、reserve、resize 等函数导致内存重分配时,如果元素提供了一个noexcept的移动构造函数,vector会调用该移动构造函数将元素移动到新的内存区域

    20700

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。...智能指针将一个计数器与类指向的对象相关联,引用计数器跟踪共有多少个类对象共享同一指针 每次创建类的新对象时,初始化指针并将引用计数置为1 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数...这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷; 2) 拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。...unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权...每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至

    2.4K40

    【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘

    动态内存分配 插入或删除节点时,只需调整指针,无需像数组那样移动大量元素。 高效的插入和删除 插入和删除操作的时间复杂度为 O(1)(只需调整指针)。...指定大小构造函数:使用 push_back 向链表中插入 n 个值为 val 的节点。 迭代器区间构造函数:通过一对迭代器 [first, last) 形成的区间构造链表。  ...对于 list 容器来说: 迭代器内部保存一个指向链表节点的指针,通过该指针对链表进行遍历和访问。 重载操作符,如 *、++、--,使迭代器的使用更像指针操作。  ..._node; } private: Node* _node; // 迭代器指向的链表节点 }; } 5.2.1  解释: 构造函数:初始化一个指向链表节点的指针 _node...注意: _val 是自定义类型时,可以使用 it->x 直接访问自定义类型的成员变量 x。编译器会将 it->x 优化为 it.operator->()->x,让访问更加方便。

    17010
    领券