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所示
C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题_第1张图片C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题_第2张图片
源代码如下:

#include 
#include 
#include 

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++代码)