C++:运算符新的默认构造函数
C++ : operator new and default constructor
我很难理解如何对构造函数使用动态分配。
我在代码中使用了一个名为graph的类(它只是一个表示节点之间边的布尔二维矩阵),带有以下构造函数/析构函数(还有其他方法,但我认为它与此无关):
class graph{
private:
bool** edges;
int size;
public:
graph(int size = 0):size(size){
edges = new bool*[size];
for (int i = 0; i < size; i++){
edges[i] = new bool[size];
}
}
~graph(){
for(int i = 0; i < size; ++i) {
delete [] edges[i];
}
delete [] edges;
}
//others methods
};
在我的主要,我想使用动态分配:
int main()
{
int size;
cout << "Enter graph size :" << endl;
cin >> size;
graph g1 = new graph(size);
//some processing code
return 0;
}
然而,我在实例化时遇到了一个错误(即新图形(大小)):
从"graph*"到"int"的转换无效[-fpermission]
我真的不明白哪里出了问题,我很确定这是我在其他地方看到的语法。
事实上,我真的不明白在创建对象时内存分配是如何工作的。
在这里,我在构造函数中使用new来创建bool2d矩阵,所以它将被放入堆中,不是吗?但是,如果我使用以下静态指令来实例化对象:图g1(constrongize);
那么它不应该去堆栈?
提前感谢您的回答。
编辑
最后一个问题:
图*g1=新图(大小);
正在堆栈上存储g1(指针),但对象是在堆上创建的。
图g1(大小);
正在堆栈上创建对象,g1是对它的引用
但在任何情况下,矩阵边都会在堆上?或者在第二种情况下,它会以某种方式在堆栈上结束?
错误在这里:
graph g1 = new graph(size);
这应该是:
graph *g1 = new graph(size);
原因如下:
new graph(size)
正在创建新的graph
对象,并返回指向该对象的指针(使用graph*
类型),并且:
graph g1 = ...
正在尝试将其转换为int
的对象(以便调用graph(int)
构造函数),因此错误为invalid conversion from 'graph*' to 'int'
。
现在,我想这是一种练习,因为在本例中不应该在堆上使用分配。但如果你无论如何都使用它,永远不要忘记:
delete g1;
实际上,我真的不知道内存分配是如何与对象的创建一起工作的。
graph *g1 = new graph(size);
正在堆栈上存储g1
(指针),但对象是在堆上创建的。
graph g1(size);
正在堆栈上创建对象,而g1
是对它的引用
p.S.避免这种情况:
graph g1 = graph(const_size);
这将首先创建语句的右侧求值,并将临时graph
对象,然后使用复制构造函数初始化g1
。
但是,例如,如果我想要一个能够处理各种图形大小的程序,而不需要每次使用不同大小的图形时都重新编译它,我会需要这样的东西,不是吗?
不,您可以为此使用堆栈分配(我刚刚注意到,在您的示例中,您对堆栈上分配的对象的构造函数使用constrongize-参数,而不需要是常量):
int size;
std::cout << "Enter size: ";
std::cin >> size;
graph g1(size);
是的,这里不需要动态分配,我只是自己练习了一下代码。但如果我想在不重新编译的情况下处理各种大小的图,这将是必要的,不是吗?
不,看看上面的例子-堆栈分配的对象大小可变-而不重新编译。
我以为我们不应该自己调用析构函数,而且当我们超出范围时,它无论如何都会被调用?(我甚至读到,在某些情况下称之为实际上很糟糕,因为它可能是第二次这样称呼它)
在堆栈分配对象的情况下也是如此-析构函数将在作用域的末尾调用。但是,如果在堆上分配对象,则在调用delete
之前不会调用析构函数。
但在任何情况下,矩阵边都会在堆上?
edges = new bool*[size];
for (int i = 0; i < size; i++){
edges[i] = new bool[size];
}
是的,整个矩阵都是在堆上分配的。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数