问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么c++中内置数组类型不支持数组之间的赋值,支持这种操作需要什么信息?

发布网友 发布时间:2022-08-19 15:11

我来回答

3个回答

热心网友 时间:2023-10-25 04:22

源代码级别和C语言兼容性的考虑。当年的C++完全向下兼容C;虽然现在标准C和标准C++有相当大的差别,但是表面上的公共语言特性都没有很大改变。
C语言中,数组在许多情况下都会隐式转换为对应的指向数组首个元素的指针(对应的类型转换称为退化)。有了数组的退化特性,同时通过p[i]和*(p+i)的等价性就可以以比较方便的语法形式引用数组的元素;且在参数传递时数组退化为指针对一般目的而言是比较高效的,无需按值传递(复制)整个数组。这样做的副作用就是对于operator=而言,为了维护左操作数作为数组名或对应指针名表现的行为的一致性(注意C语言中没有运算符重载,内置运算符的行为对于各种类型而言语义大体一致),数组在这里退化为指针而不表示整个数组。而数组退化得到的指针是常量,因此数组无法作为operator=的左操作数。
理论上要实现数组的内置赋值操作也不复杂,不过应该需要比较严格的类型检查,比如数组类型(元素类型和长度)完全相同或者元素类型相同但左操作数的长度大于等于右操作数的长度,但这样应用很有限,并不是必要的。而且会导致上面的“=”的二义性问题。
实际上用循环对元素进行逐个赋值就可以解决这个问题。C标准库函数memcpy可以实现连续存储器区域按值复制的赋值语义,同样适用于数组(C/C++的数组占据连续的地址空间)。
C++中,可以使用循环或对应的std::memcpy。此外,也可以自行实现成员为数组的结构体/类,然后重载operator[]和operator=实现可用=表示赋值的自定义数组。例如:
template<typename _elementType>
class MyArray
{
private:
_elementType* m_array;
public:
operator=(const _elementType&); //赋值:复制元素的实现可以用std::copy。
operator=(_elementType*); //指针兼容的赋值:考虑内存管理,比较麻烦,不一定需要实现。内置数组是寄存器/自动存储类对象(动态分配得到的是指针不是数组),没有这个问题。
_elementType& operator[](std::size_t); //引用元素。
const _elementType& operator[](std::size_t) const;
operator _elementType*(); //退化。
operator const _elementType*() const;
};
(当然不支持“=”的设计也有一些缺陷。这样的语言特性导致数组不是first level citizen,除了直观性问题外,还有其它的副作用。例如,*数组事实上是数组的数组,如果要用循环实现*数组间部分元素的复制,支持内置“=”的话一个一重循环就够了,编译器可以推断出复制细节;而现在的需要用多重循环“=”,或者使用一重循环嵌套memcpy之类的用于实现复制细节的函数,形式上更麻烦。)
====
[原创回答团]

参考资料:原创

热心网友 时间:2023-10-25 04:23

数组名其实代表着一个指针常量,所以将一下数组名赋值给另一个数组,就像是把常量5赋值给常量3一样,虽然语法正确,但在语意层面上会产生错误。
C++语言并未支持数组的赋值操作,编译器在编译时必须知道数组的长度,才能产生执行代码,支持数组对数组的操作。

热心网友 时间:2023-10-25 04:23

for(i = 0; i < n; i++)
b[i] = a[i];

或者用memcpy

void * memcpy ( void * destination, const void * source, size_t num );
http://www.cplusplus.com/reference/clibrary/cstring/memcpy/
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大学入学应该带哪些必备物品? tim删除聊天记录的方法步骤 pc端彻底删除tim聊天记录 甩脂机调到什么档位 如何用甩脂机 甩脂机的正确使用方法 使用抖脂机要注意什么 怎样申请小号微信号 ...的长和宽分别增加6米,扩建后草坪的面积增加了多少 ...扩建后长和宽分别增加10米,扩建后的操场面积增加了多少平方米?_百 ... 长方形的公园它的面积长和宽分别扩大十米后它的平方增加了面积增加了13... 睡眠面膜使用存在哪些陷阱 教师节给老师的祝福话语 武警2013年入伍兵转士官现在几年 武警在服役上对于服役年数和级数怎么安排? 谁知道新的武警士官制度改革初级 中级 高级分别是多少年 请问武警下士正常的是三年?怎么有干五年的? 武汉物业防疫不力怎么处罚 雪花飞谈红尘寒风扫了无痕是什么歌曲 看过猫武士的说下,黑莓掌和松鼠飞谈恋爱是在第几季的第几本? 哥哥怕弟弟打一成语 任骏飞谈同胞哥哥:赛前赛 从孔雀东南飞谈当代女性的婚恋观 李飞谈选秀男团连续塌房,你认为他公司的男团是否可以成为最佳男团? 关于李飞谈选秀男团连续塌房一事,你有何看法? FIR的阿沁和飞谈恋爱? 庄蝠飞谈经力是一本什么书? beoplaye8连三星21手机怎么说需要下载软件- 问一问 2019向国旗敬礼家长评价 2019少先队员向国旗敬礼 在windows7系统下,为什么一定要安装了打印机才能预览office文档呀? 创维电视屏幕中间出现一条竖线是怎么回事 解决方法是什么 什么时候这个手机才能支持换字体 什么时候才会有国产操作系统,国家能够重视这个问题吗? 开心集品收集图片总提示新人暂不支持此操作,请问新人时间是多长? 梦幻诛仙什么时候才支持win7的64位操作系统啊 工商银行手机银行,想定期存款。然后显示:对不起您没有交易支持卡,不能做此交易。怎样操作才能存呢? 小米怎么拼 奥迪a6后排座椅靠背怎么拆卸 奥迪a6l后排座椅怎么拆下来 奥迪a6后排头枕怎么拆卸 谁是中国报告文学的开创者 中国近代优教的开创者是谁 中国古代浪漫派的开创者是谁,李白算吗 一立方玉米棒子有多重?玉米棒子是指成熟期该收获的玉米,就东北玉米算,不带叶的玉米棒子一立方米有多少_百度问一问 有机硅硬涂层和uv硬涂层的区别 老师您好 请问 什么样的硅油可以和uv树脂相融? uv固化有机硅胶粘剂 粘接性差怎么改善 天猫华为预售和满300减40可以一起用吗? 哪里有先后语大全 参加满300减40还能使红包省钱卡吗? 妈宝早教机app下载 网址找不到了