我的问题是构造函数返回什么?这个问题与“构造函数的返回类型是什么?”没有太大不同。 我在某处读到构造函数隐式返回一个完整的对象(即隐式返回类型是类的名称),但不应显式指定它。
struct empty{};
int main(){
empty(); //creates a temporary and implicitly a constructor is called
}
因此,根据我的解释,隐式返回类型应该是类的名称,在本例中为
empty
。我的wild解释正确吗?
构造函数不返回任何内容。调用构造函数来初始化对象。构造函数只能用于初始化对象;您实际上无法显式调用构造函数(一方面,构造函数没有名称)。
在您给出的示例中,
empty()
不是函数调用表达式,而是值初始化。它创建一个类型为 empty
的值初始化临时对象。
construct 确实会返回一些东西。它返回对
this
指向的对象的引用。所以构造函数的隐式返回语句看起来像
*this;
这个怎么用?
如果您使用“泛型”类型作为成员创建
something
的类模板,则可以在类 generic()
的构造函数中显式调用泛型类型的默认零参数构造函数(即 something
)并初始化您的通用成员通过赋值运算符和 something
构造函数的初始化语句。构造函数必须返回一些东西,否则我刚刚写的那些废话都不起作用。这是我正在读的书里的……哈哈。
构造函数不返回任何内容。
在创建对象时隐式调用构造函数来初始化正在创建的对象。
构造函数不返回任何内容。
混乱来源:
Book *b = new Book();
许多人对上面的代码感到困惑,这产生了一种构造函数返回指向新创建对象的指针的错觉。
当您使用
new
关键字时,编译器会分配所需的内存,然后调用构造函数在分配的内存上创建一个新对象。然后 new
返回指向该内存块的指针。构造函数只创建对象,从不返回任何内容。
在 C++ 中,如果我没记错的话,您的代码将为堆栈上的“空”分配足够的空间,然后调用空的默认构造函数(由 () 指定)隐式向其传递 this 引用。没有回报。在你的情况下没有构造函数。
阅读汇编代码始终是了解程序中发生的情况的好方法。
class A {
public:
A(int x): a(x) {};
int a;
};
int main() {
A obj = A(25);
int b = obj.a;
}
用-O0
编译它
here,我得到:
A::A(int) [base object constructor]:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov DWORD PTR [rbp-12], esi
mov rax, QWORD PTR [rbp-8]
mov edx, DWORD PTR [rbp-12]
mov DWORD PTR [rax], edx ; this->a = x
nop
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
lea rax, [rbp-4]
mov esi, 25
mov rdi, rax
call A::A(int) [complete object constructor]
mov eax, DWORD PTR [rbp-8]
mov DWORD PTR [rbp-4], eax
mov eax, 0
leave
ret
在调用构造函数时,程序首先会为构造的对象分配一个空间(涉及
sub rsp, 16
),本例中位于rbp-4
。之后,使用两个参数来调用 A::A()
,[rbp-4]
(又名 this
指针)和 25。
根据汇编代码,A::A()
不会返回任何内容,但它只是将25分配给this
指向的位置。后面使用时,obj
会被替换为之前分配并由[rbp-4]
初始化的A::A()
,而不是由A::A()
返回。
这个怎么样:
int main() {
const empty &er = empty();
empty *ep = const_cast<empty*>(er); //casting away conentness to make changes in the members
cout<<"\n main ends \n";
//dtor get called here
}
ctor 返回对内存位置(*this)的 const 引用,您可以丢弃 const 并将其用作非常量普通对象,如
empty *e = new e;