C++ 结构体赋值

一直记得C语言中,结构体是不可以直接赋值的,需要逐一成员赋值或者用memcpy函数。

但是在C++中可以(无需重载=运算符),需要区分以下3种情况:

#include<iostream>

#include<string>
using  namespace std;


 struct  A
 { 
char   a[10];
 };


  struct  B
 { 
char       *b;
 };


 struct  C
 { 
string       c;
 };

 

A a1;
    strcpy(a1.a, "aaa");
    A a2;
    a2 = a1; //深拷贝without defining the = operator
    LOGE("%s,  %s ,     %p ,   %p\n", a1.a, a2.a, a1.a, a2.a);
    LOGE("\n-----------------------------------------\n");
    B b1;
    b1.b = new char[10];
    strcpy(b1.b, "bbb");
    B b2 = b1;//浅拷贝
    LOGE("%s,  %s ,     %p ,   %p\n", b1.b, b2.b, b1.b, b2.b);
    LOGE("\n-----------------------------------------\n");
    C c1;
    c1.c = string("ccc");
    C c2 = c1;//深拷贝
    LOGE("%s,  %s ,     %p ,   %p\n", c1.c.c_str(), c2.c.c_str(), c1.c.c_str(), c2.c.c_str());

    /*
aaa,  aaa ,     0xbe8be2e8 ,   0xbe8be2dc
-----------------------------------------
bbb,  bbb ,     0x985b98b0 ,   0x985b98b0
-----------------------------------------
ccc,  ccc ,     0x985b98cc ,   0x985b98cc
*/


--------------------- 
作者:AncientCastle 
来源:CSDN 
原文:https://blog.csdn.net/hq354974212/article/details/78632228 
版权声明:本文为博主原创文章,转载请附上博文链接!

C++中,结构体数组的赋值可以通过多种方式进行。最简单的一种是逐个元素地进行赋值。如果结构体中的每个成员都是基本数据类型,可以直接使用赋值操作符。例如,假设有一个结构体定义如下: ```cpp struct Person { std::string name; int age; }; ``` 然后可以创建一个结构体数组并赋值: ```cpp Person people[2]; people[0].name = "张三"; people[0].age = 28; people[1].name = "李四"; people[1].age = 25; ``` 对于结构体数组的赋值,如果结构体成员包含指针或者动态分配的内存,需要注意浅拷贝和深拷贝的问题。浅拷贝可能会导致多个对象指向同一块内存,而深拷贝则会为每个对象分配新的内存。例如,如果结构体中有一个指向动态分配内存的指针,就需要手动进行深拷贝: ```cpp struct Data { int* values; }; // 创建一个结构体数组并进行深拷贝 Data datasets[2]; datasets[0].values = new int[10]; // 假设我们有一个大小为10的数组 datasets[1].values = new int[10]; // 同样大小的数组 // 深拷贝赋值 datasets[1].values = new int[10]; // 为第二个对象分配新的内存空间 for (int i = 0; i < 10; ++i) { datasets[1].values[i] = datasets[0].values[i]; // 拷贝数据 } ``` 此外,C++还提供了复制构造函数来进行结构体数组的赋值,这样可以确保深拷贝的实现: ```cpp struct Data { int* values; Data(const Data& other) { // 复制构造函数 values = new int[10]; for (int i = 0; i < 10; ++i) { values[i] = other.values[i]; } } ~Data() { delete[] values; // 析构函数释放内存 } }; Data datasets[2]; datasets[0].values = new int[10]; // ... 初始化datasets[0].values ... Data temp = datasets[0]; // 使用复制构造函数进行赋值 datasets[1] = temp; // 这会调用赋值操作符重载函数,如果未定义,则默认进行成员逐个赋值 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值