列表初始化使用啥构造函数
Posted
技术标签:
【中文标题】列表初始化使用啥构造函数【英文标题】:What constuctor does list initialization use列表初始化使用什么构造函数 【发布时间】:2020-11-03 19:49:20 【问题描述】:我试图通过创建自己的向量来模仿 stl 向量的实现。我还创建了自己的模仿 std::string 的字符串版本。我需要制作什么样的构造函数才能使用大括号括起来的初始化?目前它说 Vec 没有对 Vec::Vec() 的匹配调用。我猜我必须使用 std::initializer_list 但我不知道从哪里开始。
这是我自己的矢量类版本
class Vec
private:
size_t vectorSize;
size_t vectorCap;
String * myString; //my own version of string
public:
Vec()
myString = nullptr;
vectorSize = 0;
vectorCap = 0;
explicit Vec(const String& rightObj) //takes String Object
myString = new String[1];
myString[0] = rightObj; // = is overloaded
vectorSize = 1;
vectorCap = 1;
Vec(const Vec & rightObj) //copy constructor
if(this == &rightObj)
return *this;
delete[] myString;
vectorSize = rightObj.vectorSize;
myString = new String[vectorSize];
for(auto i = 0; i<vecSize; i++)
myString[i] = rightObj.myString[i];
vectorCap = vectorSize;
// Vec(std::initilizer_list<String> myL)
#include<vector>
#include <string>
#include "String.hpp"
#include "Vec.hpp"
int main()
std::vector<std::string> x "test1", "test2", "test3"; //what kind of constructor does this use?
Vec x "test1", "test2", "test3"; // I want to do something like this.
【问题讨论】:
关于复制构造函数的注意事项:它是一个构造函数,所以不可能匹配this
和 myString
不会包含值得 delete[]
ing 的地址。更糟糕的是,myString
还没有被初始化,它可能指向你真的,真的不想delete[]
的东西。在你开始添加功能之前,我强烈建议你测试你已经拥有的东西。
@user4581301 应该是 if(this == &rightObj)
。如果它通过了这个条件,在myString
上调用 delete 是不是安全的@
我的意思是,如果您正在构建对象。您可以自己复制构造的唯一方法是Vec x(x);
或Vec x = x;
。要么是一个非常愚蠢的错误,您应该记录它并中止程序,以使程序员明白错误并强迫他们修复它。
另一方面,在赋值运算符中,这些都是很棒的事情。后面几十个函数调用的模糊a = something _that_refers_to a;
是一个值得警惕的明显可能性。
旁注:Member Initializer List 可以使构造函数更易于编写和维护。如果您有一个没有默认构造函数的类型的基类或成员变量,则非常重要。
【参考方案1】:
std::vector<std::string> x "test1", "test2", "test3"; //what kind of constructor does this use?
它使用接受std::initializer_list
的构造函数。
我需要制作什么样的构造函数才能使用大括号括起来的初始化?
一个接受std::initializer_list
的构造函数。
但这不是唯一的选择。另一个是对数组的引用。但是这样的构造函数必须是模板函数才能允许数组有多种大小。
更一般地说,另一种选择是让类成为一个聚合类,并且根本没有用户定义的构造函数。但这不是您班级的选择。
附:避免裸露的拥有指针。
【讨论】:
以上是关于列表初始化使用啥构造函数的主要内容,如果未能解决你的问题,请参考以下文章
C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)