2015-12-24 161 views
0

在C类中的类的数据成员++,我们可以提供默认的构造以及任何无参数constructors.If的,我们使用一个构造函数初始列表中的每个参数的构造函数,则心不是它像我们是初始化成员不止一次?这个概念是否有效?(我认为我们只能初始化一次)。 另外,通过这样的逻辑,如果我们有一个恒定的数据成员或参考,如果我想初始化与由用户所提供的值,我怎样才能做到这一点的恒定?我发现在C代码片段++引物,它看起来像初始化在C++

class constref 
    { 
    public: 
     constref(int ii):i(ii),ci(ii),ri(i) 
     { 
     } 
    private: 
     int i; 
     const int ci; 
     int &ri; 
} 

心不是上面的代码wrong.because因为我们已经提供了一种构造带参数,我们需要定义默认constructor.So恒定和被初始化两次这是我的error.How可以将其作为参考工作? 感谢

但是你能告诉什么是这个代码发生了什么?

#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; 
    } 

回答

3

多个构造函数提供了多种初始化对象及其成员的方法。当一个对象被创建时使用了一个的构造函数,所以只有一个初始化。根据创建对象时给出的参数来选择构造函数。

从示例中,constref c(3);使用构造函数创建对象c,将值3传递给构造函数。如果类也定义了一个默认的构造函数,会发生同样的情况。默认构造函数的存在不会影响c的创建,因为默认构造函数不带任何参数,所以不能用3作为参数来调用。

1

首先,这是没有必要提供默认构造函数,但如果你不提供,你不能创造这样constref c1;对象,或者你甚至不能创建对象的数组像constref c1[10]。唯一的方式,你可以创建的对象class constref通过提供整数参数给构造函数即constref c1(10);。第二,常量和引用在你的代码中没有初始化两次,它们只被初始化一次,即interget“i:用”ii“初始化,常量int”ci“再次用”ii“初始化,类似于”里”。

请注意常量数据成员和引用必须初始化列表否则会被编译器标记。

此外,在数据成员初始化的顺序是完全依赖于它们声明的方式在类(不在它们出现在初始化列表中的方式)。 考虑以下两种不同的情况: Scenario1:

class constref 
{ 
    public: 
     constref(int ii):i(ii),ci(ii),ri(i) 
     { 
     } 
    private: 
     int i; 
     const int ci; 
     int &ri; 
} 

在这里,我将首先初始化,然后CI和RI。

scenario2:

class constref 
{ 
    public: 
     constref(int ii):i(ii),ci(ii),ri(i) 
     { 
     } 
    private: 
     const int ci; 
     int i; 
     int &ri; 
} 

这里CI将首先初始化,其次是我,RI。

1

没有冲突:初始化器列表可以与空的{ }主体一起使用,或者与带有语句的构造器主体一起使用。

初始化程序列表将刚刚初始化构造函数的开始处的特定值的成员。

即使一个构造函数有一个初始化列表,你仍然可以用来完成构造函数体中的其他工作。

此:

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