C++ C++;:运算符新建和默认构造函数

C++ C++;:运算符新建和默认构造函数,c++,constructor,new-operator,dynamic-allocation,C++,Constructor,New Operator,Dynamic Allocation,我很难理解如何使用构造函数的动态分配 我在代码中使用了一个名为graph的类(它只是一个表示节点之间边的bool2-d矩阵)和以下构造函数/析构函数(还有其他方法,但我认为这与此无关): 类图{ 私人: 布尔**边; 整数大小; 公众: 图形(int size=0):大小(size){ 边=新边*[尺寸]; 对于(int i=0;i

我很难理解如何使用构造函数的动态分配

我在代码中使用了一个名为graph的类(它只是一个表示节点之间边的bool2-d矩阵)和以下构造函数/析构函数(还有其他方法,但我认为这与此无关):

类图{
私人:
布尔**边;
整数大小;
公众:
图形(int size=0):大小(size){
边=新边*[尺寸];
对于(int i=0;i
主要来说,我想使用动态分配:

int main()
{

    int size;
    cout << "Enter graph size :" << endl;
    cin >> size;

    graph g1 = new graph(size);

    //some processing code

    return 0;
}
intmain()
{
整数大小;
cout大小;
图g1=新图(尺寸);
//一些处理代码
返回0;
}
但是,我在实例化时遇到了一个错误(即新图形(大小)):

从“graph*”到“int”[-fpPermissive]的转换无效

我真的不明白哪里出了问题,我很确定这是我在其他地方已经看到的语法

实际上,我不太明白内存分配是如何与对象的创建一起工作的

在这里,我在构造器中使用new来创建bool2d矩阵,所以它将进入堆,不是吗? 但是如果我使用以下静态指令实例化对象: 图g1(常数大小)

那么它不应该被放到堆栈中吗

提前感谢您的回答

编辑

最后一个问题:

图形*g1=新图形(大小)

正在堆栈上存储g1(指针),但对象是在堆上创建的

graph g1(size);
图g1(尺寸)

正在堆栈上创建对象,g1是对它的引用

但在任何情况下,矩阵边都会在堆上?或者在第二种情况下,它会以某种方式在堆栈上结束?

错误如下:

graph g1 = new graph(size);
这应该是:

graph *g1 = new graph(size);
原因如下:

new graph(size)
正在创建新的
graph
对象,并返回指向该对象的指针(使用
graph*
类型),并且:

正在尝试将该对象转换为
int
(以便调用
graph(int)
构造函数)-因此错误是
从“graph*”到“int”的转换无效

现在,我想这是一种练习,因为在本例中不应该在堆上使用分配。但如果你使用它,永远不要忘记:

delete g1;
实际上,我不太明白内存分配是如何与对象的创建一起工作的

正在堆栈上存储
g1
(指针),但对象是在堆上创建的

graph g1(size);
正在堆栈上创建对象,
g1
是对它的引用

注意:避免这种情况:

 graph g1 = graph(const_size);
这将首先创建语句右侧的evaluate,它将临时创建
graph
对象,并使用复制构造函数初始化
g1

但是举例来说,如果我想要一个能够处理各种图形大小的程序,而不是每次我想处理不同大小的图形时都重新编译它,我就需要这样的程序,不是吗

不,您可以为此使用堆栈分配(我刚刚注意到,在您的示例中,您使用const_size-参数来构造在堆栈上分配的对象不需要是常量):


是的,整个矩阵都是在堆上分配的。

graph*g1=…
但是说真的,为什么需要在那里进行动态分配呢?说实话,如果需要的话,我更需要理解如何进行分配。我现在真的不需要它。但举例来说,如果我想要一个能够处理各种图形大小的程序,而不需要每次我想处理不同大小的图形时都重新编译它,我需要类似的东西,不是吗?不是主要的。在那里你可以说
图g1(42)为什么不使用标准容器对象?因为我不知道。我会调查的,谢谢。好的,非常感谢。答案很清楚。是的,这里不需要动态分配,我只是做了那个代码来练习自己。但如果我想在不重新编译的情况下处理各种大小的图形,这是必要的,不是吗?我以为我们不应该自己调用析构函数,当我们超出范围时,它也会被调用?(我甚至读到,在某些情况下,称它实际上是不好的,因为它可能是第二次称它)。PS:是的,我刚写完就意识到了这个错误,我是说图g1(大小)谢谢,我也编辑了原始帖子,因为我有最后一个问题,关于变量bool**边在哪里。
graph g1(size);
 graph g1 = graph(const_size);
int size;
std::cout << "Enter size: ";
std::cin >> size;
graph g1(size);
    edges = new bool*[size];
    for (int i = 0; i < size; i++){
        edges[i] = new bool[size];
    }