C与C++中临时对象表现差异及C语言创建临时对象的方法
语法差异原因
C++和C对A()写法的处理差异是二者的语言设计定位决定的:
- C++的构造函数语法支持:C原生支持面向对象特性,为类型提供了构造/析构函数机制。
类型名(参数列表)是C的标准语法,作用是显式调用对应类型的构造函数生成匿名临时对象,C11新增的{}统一初始化语法也是同样的设计逻辑。你示例中的A()会调用结构体A的无参构造生成临时对象,语句执行结束后自动调用析构函数销毁,完全符合C的语法规则。 - C语言无对应语法支持:C是面向过程语言,没有构造/析构函数的设计,语法层面完全不允许「类型名直接后跟括号/大括号创建对象」的写法。你代码里的
A是typedef定义的结构体类型名,C语法中类型名不能直接作为函数调用的标识符,编译器无法匹配到合法的语法规则,因此直接抛出语法错误。
C语言创建临时对象的方式
C虽然没有C++那样的显式临时对象创建语法,但也支持生成匿名临时对象,常见方式如下:
- C99复合字面量:这是C语言最接近C++临时对象的特性,语法格式为
(类型名){初始化列表},生成的临时对象生命周期与当前语句块绑定,示例:
// 你的结构体A的临时对象创建方式 printf("%d\n", ((A){.a = 10}).a); // 直接访问临时对象成员 // 也可以直接作为参数传给函数 void print_A(A obj) { printf("%d\n", obj.a); } print_A((A){.a = 20});
- 函数返回的复合类型值:如果函数返回结构体、联合体类型,调用函数得到的返回值就是临时对象,可以直接使用不需要先赋值给变量:
A create_A(int val) { A tmp; tmp.a = val; return tmp; } // 直接访问返回的临时对象成员 printf("%d\n", create_A(30).a);
- 基础类型字面量:代码中直接写的整数、浮点数、字符串字面量本身就属于匿名临时值,比如
123、3.14、"test"都是临时对象。
补充说明
你提到的三法则原则不需要在所有场景强制遵守,你示例中的C++代码没有持有动态资源(比如堆内存、文件句柄、网络套接字等),编译器默认生成的拷贝构造函数、拷贝赋值运算符完全可以满足需求,不会产生未定义行为,因此不需要额外实现是完全合理的。
内容的提问来源于stack exchange,提问作者Abhishek Mane
相关产品推荐
相关产品推荐

