Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解构造函数概念 我不理解构造函数在C++中是什么意思。我在阅读3.8条款(对象生存期,N3797)时遇到了以下问题: Player nabin;_C++_Constructor_Language Lawyer - Fatal编程技术网

理解构造函数概念 我不理解构造函数在C++中是什么意思。我在阅读3.8条款(对象生存期,N3797)时遇到了以下问题: Player nabin;

理解构造函数概念 我不理解构造函数在C++中是什么意思。我在阅读3.8条款(对象生存期,N3797)时遇到了以下问题: Player nabin;,c++,constructor,language-lawyer,C++,Constructor,Language Lawyer,如果一个对象是一个 类或聚合类型,它或其成员之一由 除普通默认构造函数之外的构造函数 我想大致了解初始化。我已经阅读了N3797第8.5节。如果某个对象被初始化,是否会调用构造函数(可能是微不足道的默认值)?我的意思是,每个初始化过程(甚至零初始化)都意味着构造函数调用。如果您提供相应的标准参考,那就太好了。构造函数是一种特殊的函数。它看起来像一个正常的函数。它没有像void、int、char、double等返回类型(尽管有人说返回类型是类的对象)。它和类的名称具有相同的名称。它在创建对象时自动

如果一个对象是一个 类或聚合类型,它或其成员之一由 除普通默认构造函数之外的构造函数


我想大致了解初始化。我已经阅读了N3797第8.5节。如果某个对象被初始化,是否会调用构造函数(可能是微不足道的默认值)?我的意思是,每个初始化过程(甚至零初始化)都意味着构造函数调用。如果您提供相应的标准参考,那就太好了。

构造函数是一种特殊的函数。它看起来像一个正常的函数。它没有像void、int、char、double等返回类型(尽管有人说返回类型是类的对象)。它和类的名称具有相同的名称。它在创建对象时自动运行。 在C++中,不需要新的操作符来初始化对象。只需声明它并设置它的属性。i、 e.
ClassA对象1、对象2

例如

Class Player{
int jerseyNo;

//constructor
Player(){
cout<<"HELLO";
}
};
您还可以声明析构函数。析构函数是类似于构造函数的特殊函数,但在对象被销毁时运行,即当对象移出范围时

示例:

Class Player{
..
~Player(){
cout<<"Destructor ran";
}
..
};
Player p1,p2,p3;
执行顺序

1. p1's constructor runs
2. p2's constructor runs
3. p3's constructor runs
4. p3's destructor runs
5. p2's destructor runs
6. p1's destructor runs
类别包括以下类型:

类是一种类型

§9[类别]

但是,并非所有类型都是类。本标准所指的类型不是§3.9中的类别类型(例如标量类型)

但是,只有类类型可以具有成员函数:

在类定义中声明的函数(不包括使用
友元
说明符声明的函数)称为该类的成员函数

§9.3[mfct类]

构造函数是成员函数。因此,可以存在没有构造函数的类型(即不是类类型的类型)。因此,初始化不一定涉及调用构造函数,因为可以初始化非类类型(
int

请注意,某些东西不一定必须是类类型才能成为“对象”:

对象是一个存储区域

§1.8[介绍对象]

因此,
int
,虽然不是类类型,但将是一个“对象”

我不理解C++中的构造是什么意思。< /P> 据我所知,该标准没有明确包含“构造函数”一词的定义。但是,§12.1/1规定:

构造函数没有名称。特殊的声明器语法用于声明或定义构造函数。 语法使用:

  • 一种可选的decl说明符seq,其中每个decl说明符要么是函数说明符要么是
    constexpr
  • 构造函数的类名,以及
  • 参数表
按这个顺序。在这样的声明中,构造函数类名周围的可选括号将被忽略

因此,如果根据此语法声明成员函数,则声明的函数是构造函数。另外,

默认构造函数(12.1)、复制构造函数和复制赋值运算符(12.8)、移动构造函数 移动赋值运算符(12.8)和析构函数(12.4)是特殊的成员函数。[注:附件] 当程序执行时,实现将隐式地为某些类类型声明这些成员函数 未显式声明。如果使用odr,则实现将隐式定义它们(3.2)。 参见12.1、12.4和12.8.-结束注释]程序不得定义隐式声明的特殊成员函数

(§12/1)

好了——每个类至少声明了三个构造函数,无论是隐式还是显式的;您还可以使用§12.1/1中的语法声明其他构造函数。这样声明的整个函数集构成了构造函数集

如果某个对象被初始化,是否会调用构造函数(可能是微不足道的默认值)?我的意思是,每个初始化过程(甚至零初始化)都意味着构造函数调用

不,这是假的。例如,
int
没有构造函数。尽管您可以使用与类类型的对象初始化类似的语法初始化
int

struct Foo {};
Foo f {}; // calls default constructor
int i {}; // sets the value of i to 0
此外,零初始化从不调用构造函数,但零初始化也从来不是对象初始化的唯一步骤

如果“object”是指“类类型的对象”,那么尽管如上所述,始终声明三个构造函数,但始终调用构造函数仍然不是真的。见§8.5/7关于值初始化:

T
类型的对象进行值初始化意味着:

  • 如果
    T
    是一种(可能是cv限定的)类类型(第9条),且具有用户提供的构造函数(12.1),则 调用
    T
    的默认构造函数(如果
    T
    没有可访问的默认值,则初始化是错误的) 建造商)
  • 如果
    T
    是没有用户提供构造函数的(可能是cv限定的)非联合类类型,则对象 初始化为零,如果
    T
    隐式声明的默认构造函数是非平凡的,则该构造函数为 打电话来
  • 如果
    T
    是数组类型,则每个元素都初始化了值
  • 否则,对象初始化为零
因此,当非联合类类型的默认构造函数不重要,并且您正在初始化该类型的对象时,实际上不会调用该构造函数。

您询问:

如果某个对象被初始化,是否会调用构造函数(可能是微不足道的默认值)

短a