是否始终调用C ++默认构造函数,如C ++ Primer中所示?

时间:2010-08-24 02:04:33

标签: c++

我是C ++的新手。不要介意这个愚蠢的问题:

在第52页的C ++入门第4版(Stanley Lipmann)中,有句话说:

  

无论在何处定义变量,都使用默认构造函数。

任何人都可以解释一下吗?这些陈述似乎缺少了一些东西。

4 个答案:

答案 0 :(得分:5)

从书本身:

  

如果定义了类型的变量但未提供初始值设定项,则每个类还可以定义会发生什么。类通过定义一个特殊的构造函数(称为默认构造函数)来实现。此构造函数称为默认构造函数,因为它“默认运行”;如果没有初始值设定项,则使用此构造函数。 无论在何处定义变量,都使用默认构造函数。

(我的斜体)。

所以你在本书的一个部分,他们已经在谈论默认构造函数(在其他一些答案中应该很明显,默认构造函数绝对是总是使用)。

本书所说的是,在使用默认构造函数 的情况下,在定义变量的任何地方(内部或外部函数,内部或外部类,内部大括号,例如循环,选择语句甚至是裸括号,等等。)

答案 1 :(得分:3)

如果您有课程Object

class Object
{
public:
    int x;

    Object() { x = 5; }
};

并在这样的函数中实例化一个:

void foo()
{
    Object obj;
    // obj.x == 5
}

将使用默认构造函数。当您在另一个类中声明它们并实例化其他类时,对象也使用默认构造函数构造:

class AnotherObject
{
public:
    Object obj;
};

void bar()
{
    AnotherObject another;
    // another.obj.x == 5
}

答案 2 :(得分:1)

大概你的意思是 Stanley Lippman?

无论如何,虽然我没有方便检查的副本,我猜他的意思是你有类似的东西:

myclass X;

... X对象将使用默认ctor进行初始化,无论对象是全局(在任何函数之外),函数本地还是本地函数中的某个其他作用域(例如,在for循环中。

将此与内置类型行int进行对比,后者具有相当复杂的规则:全局int(在任何函数外部定义)或在函数内定义的类型,但static 1}}存储类,将被初始化为零,但是使用自动存储定义的int(在函数内定义,而不指定static)是“默认初始化”,(在这种情况下)意味着它没有初始化为可预测的值。

答案 3 :(得分:0)

$ 12.1

默认构造函数(12.1),复制构造函数和复制赋值运算符(12.8)以及析构函数(12.4)是特殊成员函数。 当程序没有明确声明它们时,实现将隐式声明类类型的这些成员函数,除非在12.1中提到。如果使用它们,实现将隐式 定义它们 ,如12.1,12.4和12.8中所述。程序不应定义隐式声明的特殊成员函数。程序可以明确地引用隐式声明的特殊成员函数。 [示例:程序可以显式调用,获取成员的地址或形成指向隐式声明的特殊成员函数的成员。

相关问题