csk*_*wrd 0 c++ arrays copy-constructor
我正在尝试初始化一个对象数组:
SinglyLinkedList offeredClasses[22] = {SinglyLinkedList("CSCE101"),SinglyLinkedList("CSCE101L"),SinglyLinkedList("CSCE150E"),SinglyLinkedList("CSCE150EL"),SinglyLinkedList("CSCE150EM"),SinglyLinkedList("CSCE150EML"),SinglyLinkedList("CSCE155"),SinglyLinkedList("CSCE155H"),SinglyLinkedList("CSCE156"),SinglyLinkedList("CSCE230"),SinglyLinkedList("CSCE230L"),SinglyLinkedList("CSCE235"),SinglyLinkedList("CSCE251"),SinglyLinkedList("CSCE310"),SinglyLinkedList("CSCE322"),SinglyLinkedList("CSCE361"),SinglyLinkedList("CSCE351"),SinglyLinkedList("CSCE451"),SinglyLinkedList("CSCE423"),SinglyLinkedList("CSCE428"),SinglyLinkedList("CSCE486"),SinglyLinkedList("CSCE487")};
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这样做时,它一直试图调用我的复制构造函数而不是重载的构造函数.有什么想法解决这个问题?
有问题的2个构造函数是:
SinglyLinkedList(string course); //Constructor
SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor
Run Code Online (Sandbox Code Playgroud)
我需要复制构造函数用于其他事情,所以我不能删除它.
谢谢你的帮助!
看来你的编译器严重破坏了.您的copy-constructor使用非const引用参数声明.无法使用临时对象作为参数调用此类复制构造函数,因为非const引用不能绑定到临时对象.
你的初始化器是临时对象,这意味着绝对没有办法在这里调用复制构造函数.如果您的编译器执行此操作,则意味着它已损坏,或者您正在使用某些设置使其以非常不合规的方式运行.你使用的是哪个编译器?
这是答案的第一部分.
第二部分是括号括起的初始化列表在C++中被解释为复制初始化.换句话说,在这种情况下必须调用copy-constructor .它没有办法解决它(稍后可以优化调用,但构造函数必须在任何情况下都可用).在这方面,您的编译器表现"正确",即它尝试调用复制构造函数.除此之外,正如我上面所说,在你的情况下它应该发出一个错误(因为复制构造函数不可调用)而不是快速调用它.
最后,答案的第三部分.
您是说调用了复制构造函数而不是转换构造函数.实际上,两者都被称为.如果仔细观察,你会看到它.首先,调用转换构造函数,以便从您提供的字符串创建一个'SinglyLinkedList'类型的中间临时对象(包括构造一个临时的'std :: string'对象),然后调用复制构造函数为了从临时初始化数组元素(这发生在数组中的每个元素).假设你的copy-constrcutor被正确声明,即使用const引用参数,这就是它在C++中的应用方式.但是使用非const引用参数时,复制构造函数不可调用且代码格式错误.