字符数组作为结构的项,在new构建结构对象时无法初始化

文章讨论了C++中通过new关键字动态分配结构体数组时,使用初始化列表进行成员初始化的问题。当结构体包含char数组时,初始化可能失败,而换成string类型则能成功。这可能与编译器如何处理默认构造函数和constchar*到char[]的转换有关。在某些情况下,如Linux下的gcc,可能在new单个对象时就会报错。文章推测这涉及到编译器对initializer_list和构造函数的调用方式。
摘要由CSDN通过智能技术生成

下面这段代码的输出不如预期:

#include<iostream>
using namespace std;
struct student {
	char name[20];
	int score;
};

int main(int argc, char argv[]) {
	student st1{ "he", 23.0 };
	student sts[2]{ { "H1",2 }, { "H2", 4 } };
	student* p = new student{ "Jx", 4 };
	student* ps = new student[2]{ { "pH1",2 }, { "pH2", 4 } };

	cout << st1.name << endl;
	cout << sts[0].name << endl;

	// 动态分配结构对象,可以初始化
	cout << p->name << endl;
	cout << p->score << endl;

	// 动态分配结构数组,初始化无效,但是语法不报错
	cout << ps[0].name << endl;
	cout << ps[0].score << endl;
}

输出结果是这样的:

 通过new创建student结构数组时,通过大括号方式给出初始化值,没有成功,但是语法不报错。但是创建单个student对象时,缺成功初始化了。

 如果将struct中的char name[20]替换为string name后,初始化成功了。

struct student {
	string name;
	int score;
};

原因可能跟编译器实现有关。

在linux下通过gcc编译时,new单个student对象时就报错了。

网上搜了下,大概了解了初始化列表的调用过程。

当使用{ }进行初始化,编译器看到{t1,t2…tn}时便做出一个initializer_list,它关联到一个array<T,n>。编译器会分析当前语句的语义,当构造数组对象时,将解析{{}}嵌套,该array内的元素可以被编译器分解,逐一传递给元素对象的构造函数。
例如:本例中new student [ ],{ }会形成一个initializer_list,背后有个array<student,2>,然后调用student的构造函数创建student对象,这个过程中通过ctor-initializer为student对象初始化。由于我们没有为student提供显示的构造函数,默认构造函数里的初始化器(ctor-initializer)可能无法处理const char* 到char []的转换。而当用string作为name数据项的类型时,构造-初始化过程中会调用string类的相关函数。(以上是我的猜测)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值