我可以通过声明发起一个班级的对象吗?

时间:2015-05-15 05:15:25

标签: c++ initialization

据我了解,我们可以通过声明启动类样本的对象,

sample s=10;  

编译器会将该语句视为sample s(10)。如果在类示例中有一个参数构造函数,则该语句可以工作,但如果没有一个参数构造函数,则编译器将闪烁错误。

我想知道。我们可以通过声明来启动类样本的对象吗,

sample s=10,20;  

这在以下示例中显示:

class sample {
 private:
        int a,b;  
public:  
    sample(int i) {
        a=i;  
        b=i;  
    }

    sample(int i, int j) {
        a=i;  
        b=j;  
    }

    void display(){
        cout<<a<<endl<<b;  
    }  
};  

void main(){
        sample s = 10;  
        sample c = 10,20;  
        c.display();  
}  

以上程序是否有效?

3 个答案:

答案 0 :(得分:3)

sample c = 10,20;

这不会编译。请注意,此处的,不是运算符,而是声明分隔符,需要sample c = 10, d = 20

之类的内容
sample c = (10,20);

,运算符将被执行,10和20将分别进行评估,稍后将作为结果进行评估。该声明等同于样本s(20);

  

上述计划是否有效?

它不会编译。

sample c = (10,20)将编译并运行,但不会像你期望的那样用2个参数调用构造函数。

  

我可以通过声明发起一个类的对象吗?

是的,请使用sample c(10, 20)

在C ++ 11及更高版本中,使用std::initializer_list作为构造函数参数可以使用sample c = {10, 20}之类的语法。

sample(std::initializer_list<int> l) : a(0), b(0) {
    if(l.size() > 2U) { /* throw */ }
    int i = 0;
    for(int x : l) {
        if(i == 0) { a = x; b = x; }
        else if(i == 1) b = x;
        ++i;
    }
}
...
sample c = {10,20};

Live demo here

答案 1 :(得分:1)

假设您已经在使用C ++ 11,可以通过以下方式实现:

auto c = sample(10,20)

答案 2 :(得分:-1)

不,这个程序不会被编译。 实际上你已经给出了接受两个参数的构造函数,但是为了编译这个代码,你需要重载赋值运算符。 它只有在您可以替换此代码

时才有效
sample s=10;
sample s2=10,20;

用这个

sample s(10);
sample s2(10,20);

由于第一种情况,您需要重载的赋值运算符,而您尚未提供。但在第二种情况下,您需要已经提供的参数化构造函数。所以它会编译。 这是我测试过的完整代码,它可以运行

class sample{
private:
        int a,b;
public:
    sample(int i){    
        a=i;
        b=i;
    }
    sample(int i, int j){    
        a=i;
        b=j;
    }
    void display(){
         cout<<a<<endl<<b<<endl;
    }
}; 
main(){
    sample s(10);
    sample c(10,20);
    c.display();
    system("pause");
}