在 c++ 中初始化类的数据成员
Initialization of data members of a class in c++
对于 c++ 中的类,我们可以提供一个默认构造函数以及任何参数化构造函数的数量。如果我们在每个参数化构造函数中使用构造函数初始值设定项列表,那么这不是我们多次初始化一个成员吗?这个概念有效吗?(我以为我们只能初始化一次(。同样通过这个逻辑,如果我们有一个常量数据成员或引用,如果我想用用户提供的值初始化常量,我该怎么做?我在 c++ 入门中找到了一个代码片段,看起来像
class constref
{
public:
constref(int ii):i(ii),ci(ii),ri(i)
{
}
private:
int i;
const int ci;
int &ri;
}
上面的代码没有错,因为既然我们已经为构造函数提供了参数,我们需要定义一个默认构造函数。因此,常量和引用被初始化两次,这是一个错误。我怎样才能让它工作?谢谢
但是你能说出这段代码中发生了什么吗?
#include<iostream>
#include<stdlib.h>
using namespace std;
class dummy
{
int a;
public:
dummy():a(0)
{
}
dummy(int i):a(i)
{
}
void output()
{
cout<<a<<endl;
}
};
int main()
{
dummy d;
d=dummy(4);
d=dummy(3);
d.output();
return 0;
}
多个构造函数提供了多种初始化对象及其成员的方法。创建对象时,将使用其中一个构造函数,因此只有一个初始化。根据创建对象时给出的参数选择构造函数。
从示例中,constref c(3);
使用构造函数创建对象c
,将值 3 传递给构造函数。如果类还定义了默认构造函数,也会发生同样的事情。默认构造函数的存在不会影响c
的创建,因为默认构造函数不带参数,因此不能使用 3 作为参数进行调用。
首先,没有必要提供默认构造函数 但是如果你不提供它,你就不能创建像constref c1;
这样的对象,或者你甚至不能创建像constref c1[10]
这样的对象数组。创建类 constref 对象的唯一方法是向构造函数提供整数参数,即 constref c1(10);
.
其次,常量和引用在你的代码中没有初始化两次。它们只初始化一次,即interget "i: 用 "ii" 初始化,常量 int "ci" 再次由 "ii" 初始化,与 "ri" 类似。
请注意,常量数据成员和引用必须是初始化列表,否则它将被编译器标记。
此外,数据成员初始化的顺序完全取决于它们在类中的声明方式(而不是它们在初始化列表中的出现方式(。请考虑以下两种不同的方案:场景 1:
class constref
{
public:
constref(int ii):i(ii),ci(ii),ri(i)
{
}
private:
int i;
const int ci;
int &ri;
}
在这里,我将首先初始化,然后是 CI 和 RI。
场景 2:
class constref
{
public:
constref(int ii):i(ii),ci(ii),ri(i)
{
}
private:
const int ci;
int i;
int &ri;
}
这里ci将首先初始化,然后是i,ri。
没有冲突:初始值设定项列表既可以与空的{ }
体一起使用,也可以与带有语句的构造函数主体一起使用。
初始值设定项列表只会将成员初始化为构造函数开头的特定值。
即使构造函数具有初始值设定项列表,您仍然可以在构造函数的主体中自由执行其他工作。
这:
Point(int i = 0, int j = 0):x(i), y(j) {}
相当于这个:
Point(int i = 0, int j = 0) {
x = i;
y = j;
}
只有当将不同数量的变量传递到构造函数中以初始化类时,才会有不同的构造函数方法。 任何带有参数的构造函数都可以采用初始值设定项列表。
默认构造函数是不带任何参数的构造函数。
您只需要在以下情况下定义默认构造函数:类的对象需要在没有任何参数的情况下实例化。
引用:
http://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/
https://en.wikipedia.org/wiki/Default_constructor
- 类定义中的静态数据成员初始化
- 为什么在静态数据成员初始化器中未完全定义类
- 重载放置新运算符,具有数据成员初始化以及与普通新运算符的差异
- 模板非静态数据成员初始化程序何时实例化
- C++静态数据成员初始化
- 使用初始化列表时的 C++ 数据成员初始化顺序
- Cocos2d-x AppDelegate数据成员初始化丢失
- 基类构造函数和数据成员初始化的奇怪行为
- Visual Studio 2013 因非静态数据成员初始化而崩溃
- std::vector的非静态数据成员初始化器/调用构造函数
- GCC 默认 int 数据成员初始化
- 何时在C++中使用哪个数据成员初始化
- Clang++ 非静态数据成员初始化错误?C++11.
- C++11;非静态数据成员初始化是否可以访问其他数据成员
- 类C++的静态函数成员中的静态数据成员初始化顺序
- C++警告非静态数据成员初始化程序
- 抱歉,未实现:c++ 11中的非静态数据成员初始化器
- c++ RPG错误:不允许使用数据成员初始化式
- 静态数据成员初始化顺序
- 在c++ 0x中,非静态数据成员初始化式是否覆盖隐式复制构造函数?