据我了解,我们可以通过声明启动类样本的对象,
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();
}
以上程序是否有效?
答案 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};
答案 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");
}