构造函数理解问题

时间:2015-10-01 13:49:09

标签: c++ constructor

我想了解什么是构造函数,你能告诉我为什么我仍能运行该程序而没有错误吗?

正如你所看到的,我没有正确地做到这一点,但它仍然有效!为什么?? 当我尝试在我的课程DELL之后输入LL =(对象名称)时它不起作用?但是当我检索到LL时,它有效吗?如果我不清楚,请不要犹豫告诉我 我很抱歉这个烂摊子

#include <iostream>
#include <string>
using namespace std;


class DELL{
public:
    DELL(){
        cout <<" bla bl bla\n";
    }
    void setname(string x){
        name = x;
}

        string getname()
        {
            return name;}
private:
string name;


};

int main(){

    DELL (); // Variant 1
    DELL LL(); // Variant 2
    return 0;

}

3 个答案:

答案 0 :(得分:1)

首先,让我们增强你的DELL类来为它添加析构函数。这将有助于我们更好地了解对象的生命周期。这是代码:

DELL();

以下是您可以使用的三种方式:

DELL(); std::cout << "Checkpoint.\n"; - 这确实构造了一个DELL()类型的临时对象。在此之后立即删除它,并且由于未使用它,优化的编译器可能只是完全删除此行。但是,如果禁用优化并编译/链接/运行代码,则应该看到构造函数调用,紧接着是析构函数调用。下面的示例代码将按此顺序生成构造函数,析构函数,检查点打印输出。

DELL LL;

{ DELL LL; std::cout << "Checkpoint.\n"; } 这会创建一个DELL类型的对象。此对象将一直存在,直到声明它的作用域结束。如果你把它放到你的主要,然后输出一些东西,如下面的

DELL LL();

您将看到构造函数调用,“检查点”和析构函数调用作为输出(再次,如果没有进行优化)。

$block - 这不会创建任何对象。相反,它声明了一个名为LL的函数,它不接受任何参数并返回DELL类型的对象。当您运行此代码时,您将看不到构造函数或析构函数的输出,因为没有创建对象。

答案 1 :(得分:0)

你已经发现了一个被称为Vexing Parse的C ++语法怪癖。简而言之:

DELL LL();

声明一个名为LL的函数,该函数没有参数并返回DELL个对象。比较DELL LL();int main();的语法。

此代码:

DELL();

创建一个DELL类型的临时对象,并使用默认构造函数对其进行初始化。

此代码:

DELL LL;

创建名为LL的对象,类型为DELL,并对其进行默认初始化。对于类,这意味着调用默认构造函数。

从C ++ 11开始,您可以使用花括号而不是括号进行初始化,这可以避免烦恼的解析:

DELL LL{};

这将创建一个类型为LL的对象DELL,并对其进行值初始化。对于一个类,这又意味着调用默认构造函数。

答案 2 :(得分:0)

你没有这样做&#39;错误&#39;。你根本就没有做到这一点&#39;正确&#39;。

您声明了一个名为CLISP的类,它只有一个不需要额外参数的构造函数。

DELL

现在,在您的public: DELL(){ cout <<" bla bl bla\n"; } 中,您调用了该构造函数,但是您没有创建main()类的对象;

创建DELL对象的正确方法是:

DELL

当您运行此程序时,输出将是:

DELL LL;
 //and then you could maybe do
LL.setname("name of object");
cout<<LL.getname();

此外,您可以通过执行&gt;

创建指向DELL对象的指针
 bla bla bla
name of object

输出与上面的输出相同。

相关问题