C++中创建类实例却不赋值给变量的行为疑问
C++中创建类实例却不赋值给变量的行为疑问
嗨,我来给你把这个事儿讲明白~
你写的Person("Felix",28);这行代码,其实是创建了一个无名的临时类实例,咱们拆解来看它的特点和用途:
1. 这个临时对象的生命周期有多短?
说白了,它的“寿命”只到当前这行语句执行结束为止。一旦这行代码跑完,C++就会自动调用它的析构函数把它销毁。
你可以给你的Person类加个析构函数试试,就能直观看到这个过程:
class Person { // 原有的成员变量和构造函数不变 ~Person() { cout << "销毁对象:" << name << endl; } };
再运行Person("Felix",28);这行代码,控制台会先构造对象,紧接着就输出销毁的信息——刚“出生”就“去世”了。
2. 这种写法有实际用处吗?
如果只是像你那样单纯写Person("Felix",28);啥也不做,那确实是无意义的操作,除了触发构造和析构的副作用(比如构造函数里有写日志、连接数据库这类操作),啥效果也没有。但结合场景用对了,它能让代码更简洁:
- 直接调用带副作用的成员函数:比如你的
Person类有个saveToDB()方法用来把数据存到数据库,那完全可以这么写:
不用特意给对象起变量名,用完就自动销毁,省得多写一行变量声明。Person("Felix",28).saveToDB(); - 作为函数参数传递:假设有个处理Person对象的函数
void process(const Person& p),你直接传临时对象就行:
不用先定义process(Person("Felix",28));Person demo = Person("Felix",28);再传参,代码更紧凑。 - 绑定到const引用延长生命周期:如果你想让这个临时对象活久一点,可以把它绑定到const引用上:
不过要注意,非const引用是不能绑定临时对象的,比如const Person& demoRef = Person("Felix",28); // 这里demoRef可以正常使用,直到当前作用域结束才会销毁对象 demoRef.print();Person& demoRef = Person("Felix",28);会直接编译报错,C++这么设计是怕你修改一个马上要销毁的对象,纯属做无用功还容易出问题。
3. 回到你的代码
你写的int main() { Person("Felix",28); return 0; }完全合法,但因为没对这个临时对象做任何操作,所以它唯一的作用就是跑一遍构造和析构函数,没有实际业务意义,相当于白创建了一次对象。
备注:内容来源于stack exchange,提问作者Jujimufoo
相关产品推荐
相关产品推荐

