具有复制构造函数的C ++对象数组

时间:2015-08-18 12:44:32

标签: c++ arrays c++11 constructor copy-constructor

从CodeBlocks编译的下面的代码中我得到了这种类型的错误:

 no matching function for call to 'student::student(student)' candidates are:
 student::student(student&)
     no known conversion for argument 1 from 'student' to 'student&'
 student::student(std::string, int, double, float)
     candidate expects 4 arguments, 1 provided

我猜不知道C ++编译器在数组定义中实现了复制构造函数。但我似乎无法找到解决办法。我在程序中需要两个构造函数,我需要通过构造函数初始化数组元素。请提供适用于C ++ 11的解决方案。

#include <iostream>
#include <string>
using namespace std;

class student{
    string name;
    int rollno;
    double marks;
    float per;
    /// Constructors
    student(string n, int r, double m, float p){
        name = n;
        rollno = r;
        marks = m;
        per = p;
    }
    student(student& s){
        name = s.name;
        rollno = s.rollno;
        marks = s.marks;
        per = s.per;
    }
};

int main(){
    student arrays[] = { student("Anas Ayubi", 80, 980, 980/1100),
                    student("Zainab Ashraf", 78, 990, 990/1100 ),
                    student("Wali Ahmed", 28, 890, 890/1100) };
}

3 个答案:

答案 0 :(得分:4)

student(student& s){

您的复制构造函数通过非const引用获取其参数。非const引用不能绑定到rvalues。然后,您继续尝试创建rvalues的副本:

student arrays[] = { student("Anas Ayubi", 80, 980, 980/1100),
                student("Zainab Ashraf", 78, 990, 990/1100 ),
                student("Wali Ahmed", 28, 890, 890/1100) };

对此的简单修复是声明复制构造函数采用引用到const,可以绑定到rvalues:

student (const student& s){

请注意,在980/1100中,您会获得整数除法而不是浮点除法,因此您只需获得0。要解决此问题,请强制int s为double980.0/1100

顺便说一句,在C ++ 11中,您可以简化数组初始化,如下所示:

student arrays[] = { {"Anas Ayubi", 80, 980, 980.0/1100},
                     {"Zainab Ashraf", 78, 990, 990.0/1100},
                     {"Wali Ahmed", 28, 890, 890.0/1100} };

答案 1 :(得分:2)

它应该是student(const student& s) - 请注意 const - 复制构造函数的正确签名。

这是因为你试图将临时对象绑定到引用,在这种情况下需要const引用。

答案 2 :(得分:1)

您的复制构造函数应该通过const引用获取其参数,以便它可以绑定到您提供的临时值。