我想了解什么是构造函数,你能告诉我为什么我仍能运行该程序而没有错误吗?
正如你所看到的,我没有正确地做到这一点,但它仍然有效!为什么?? 当我尝试在我的课程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;
}
答案 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
输出与上面的输出相同。