构造函数返回什么?

问题描述 投票:0回答:7

我的问题是构造函数返回什么?这个问题与“构造函数的返回类型是什么?”没有太大不同。 我在某处读到构造函数隐式返回一个完整的对象(即隐式返回类型是类的名称),但不应显式指定它。

struct empty{};

int main(){
   empty(); //creates a temporary and implicitly a constructor is called
}

因此,根据我的解释,隐式返回类型应该是类的名称,在本例中为

empty
。我的wild解释正确吗?

c++ constructor return-type
7个回答
35
投票

构造函数不返回任何内容。调用构造函数来初始化对象。构造函数只能用于初始化对象;您实际上无法显式调用构造函数(一方面,构造函数没有名称)。

在您给出的示例中,

empty()
不是函数调用表达式,而是值初始化。它创建一个类型为
empty
的值初始化临时对象。


11
投票

construct 确实会返回一些东西。它返回对

this
指向的对象的引用。所以构造函数的隐式返回语句看起来像

*this;

这个怎么用?

如果您使用“泛型”类型作为成员创建

something
的类模板,则可以在类
generic()
的构造函数中显式调用泛型类型的默认零参数构造函数(即
something
)并初始化您的通用成员通过赋值运算符和
something
构造函数的初始化语句。构造函数必须返回一些东西,否则我刚刚写的那些废话都不起作用。这是我正在读的书里的……哈哈。


3
投票

构造函数不返回任何内容。
在创建对象时隐式调用构造函数来初始化正在创建的对象。


2
投票

构造函数不返回任何内容。

混乱来源:

Book *b = new Book();

许多人对上面的代码感到困惑,这产生了一种构造函数返回指向新创建对象的指针的错觉

当您使用

new
关键字时,编译器会分配所需的内存,然后调用构造函数在分配的内存上创建一个新对象。然后
new
返回指向该内存块的指针。构造函数只创建对象,从不返回任何内容。


0
投票

在 C++ 中,如果我没记错的话,您的代码将为堆栈上的“空”分配足够的空间,然后调用空的默认构造函数(由 () 指定)隐式向其传递 this 引用。没有回报。在你的情况下没有构造函数。


0
投票

阅读汇编代码始终是了解程序中发生的情况的好方法。

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()
返回。


-1
投票

这个怎么样:

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;

© www.soinside.com 2019 - 2024. All rights reserved.