在这种情况下调用什么构造函数
What constructor is called in this case?
假设我有一个对象
class A {
public:
int bar();
};
A foo() {return A();}
int A::bar() {return 5;}
然后我这样做:
int i = foo().bar();
为foo()
返回时创建的临时值调用什么构造函数?
代码为:
A foo() {return A();}
当foo()
被调用时,效果顺序为:
-
A()
使用A
的默认构造函数临时创建的 - 返回
A
类型的值对象,使用复制/移动构造函数创建,以步骤1的临时函数作为参数(即,如果存在则移动构造函数,否则复制构造函数)。 步骤1的临时文件被销毁。
然而,这是一个复制省略上下文,因此编译器可能将所有3个步骤合并为一个,并使用A
的默认构造函数创建返回值对象。
返回值对象的处理取决于调用代码的操作。可能会有进一步的副本省略。用法:
int i = foo().bar();
没有发生其他事情;在返回值对象上调用bar()
,将值赋给i
,然后销毁返回值对象
如果使用c++ 11编译,在foo
内部,当return A()
运行时,它调用默认构造函数。然后当它从foo返回move constructor
时被调用。但是如果你用旧版本编译,首先调用默认构造函数,然后调用复制构造函数。
调用默认构造函数。也许试着这样做会更清楚:
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A's default ctor" << endl;
}
};
int main() {
A a;
return 0;
}
相关文章:
- 是什么让放置新调用对象的构造函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 构造函数后面的宏.什么意思?
- C++构造函数内部会发生什么?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 我是否为邪恶刽子手的构造函数错过了什么?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 什么时候用指针调用C++类构造函数
- 这个构造函数是做什么的
- 将复制构造函数设置为private和=delete有什么区别
- 我不明白在这个例子中什么时候调用构造函数
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- C++什么时候是使用无默认构造函数与getter和setters与直接调用类中的变量的正确时机
- 在成员初始值设定项列表和构造函数主体中委派构造函数有什么区别
- 在不使用默认构造函数的情况下声明 POD 结构时,会实例化什么?