C++数组初始化中give_me_a_name含义及语法的技术问询
嘿,我来帮你拆解这个问题,其实你不小心踩了C++语法的一个小坑~
先说说原始代码的问题
你写的数组初始化代码里用了分号分隔元素:
Student student[] = { Student("Larry", 95.5, "This is Larry", 1); Student("Paul", 78.0, "This is Paul", 2); Student("Tom", 80.0, "This is Tom", 3); };
但C++的数组初始化列表里,元素之间必须用逗号分隔,分号是用来分隔独立语句的。所以编译器其实把你的代码拆成了三个完全独立的语句:
- 第一个语句:
Student student[] = { Student("Larry", 95.5, "This is Larry", 1) };—— 你只初始化了数组student的第一个元素,剩下的元素会被默认初始化(如果Student类有默认构造函数的话)。 - 第二个语句:
Student("Paul", 78.0, "This is Paul", 2);—— 这行创建了一个临时Student对象,但你没把它赋值给任何变量,也没用来做任何操作,所以这个对象刚创建就被销毁了,这就是clang-tidy提示你的核心原因:"object destroyed immediately after the creation"。 - 第三个语句:
Student("Tom", 80.0, "This is Tom", 3);—— 和第二个语句一样,又是一个创建后立刻被销毁的无用临时对象。
再看你修改后的give_me_a_name是什么
你改成了:
Student student[] = { Student("Larry", 95.5, "This is Larry", 1); Student give_me_a_name("Paul", 78.0, "This is Paul", 2); Student("Tom", 80.0, "This is Tom", 3); };
这里的give_me_a_name根本和数组没关系!因为分号的存在,编译器把这行当成了一个独立的变量声明语句:Student give_me_a_name("Paul", 78.0, "This is Paul", 2); —— 意思是你在当前作用域里创建了一个名叫give_me_a_name的Student类型变量,用给定的参数初始化它。这个变量和旁边的数组student是完全独立的两个东西。
至于为什么会有这样的语法?因为C++允许在同一个代码块里连续声明多个变量/对象,只要用分号分隔开就行——只不过你误把它写在了数组初始化的大括号里,编译器依然会按照语句分隔的规则来解析。
正确的修复方式
你应该把初始化列表里的分号全部改成逗号,让这三个Student对象都成为数组student的元素:
Student student[] = { Student("Larry", 95.5, "This is Larry", 1), Student("Paul", 78.0, "This is Paul", 2), Student("Tom", 80.0, "This is Tom", 3) };
甚至可以简化写法(C++11及以后支持),省略构造函数的显式调用:
Student student[] = { {"Larry", 95.5, "This is Larry", 1}, {"Paul", 78.0, "This is Paul", 2}, {"Tom", 80.0, "This is Tom", 3} };
这样修改后,clang-tidy的提示就会消失,三个对象都会被正确初始化到数组里,不会出现临时对象被立刻销毁的问题。
内容的提问来源于stack exchange,提问作者Paul Zhang
相关产品推荐
相关产品推荐

