我是靠谱客的博主 开放毛巾,最近开发中收集的这篇文章主要介绍C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近自己遇到了这类问题,在csdn上找到了很多大神给的解答,非常到位
特别感谢这位:
https://blog.csdn.net/JQ_AK47/article/details/53169799

问题描述:
在C++中的结构体或者类中定义了一个字符数组,那么在类(或者结构体)外去赋值的时候,会出现一些问题:如下图所示:
Person p = {“张三”,18};//正确

p.m_Name = “张三”;//错误
p.m_Age = 18;//正确

我先来解释一下上面的两种情况:
以我如下的代码所示,类中定义的char m_Name[30] ,是一个字符数组,在定义完成之后,系统会分配一段内存,这段内存的地址赋值给m_Name,它是一个常量。
Person p = {“张三”,18};之所以正确是因为这是C语言定义的类的初始化的过程。也就是“张三”初始化了字符数组。
p.m_Name = “张三”;//错误的原因是,
双引号做了3件事:
1.申请了空间(在常量区),存放了字符串
2. 在字符串尾加上了’/0’
3.返回地址
“张三”是一个字符串常量,他一经定义系统就会分配一段地址给他(常量区)。式中“张三”传进来的就是他的这个常量地址,式子左边p.m_Name也是一个常量地址,所以不能用 = 将一个常量地址赋值给一个常量地址。这也就能回答问题:表达式必须是可修改的左值的答案,因为p.m_Name也是一个常量地址。

该问题还有一种解决办法就是将类中定义的char m_Name[30]定义成常量指针的形式,也就是const char *m_Name;如图2所示
在这里插入图片描述在这里插入图片描述
源代码如下:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class Person
{
public:
	const char *m_Name;
	int m_Age;
};

int main()
{
	ofstream ofs;
	ofs.open("Person.txt", ios::out | ios::binary);
	Person p = {"张三",18};//正确
	Person p;
	p.m_Name = "张三";//正确
	p.m_Age = 18;//正确
	ofs.write((const char*)&p, sizeof(p));

	return 0;
}

最后

以上就是开放毛巾为你收集整理的C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题的全部内容,希望文章能够帮你解决C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部