C++ 构造函数中的变量声明和赋值

Posted

技术标签:

【中文标题】C++ 构造函数中的变量声明和赋值【英文标题】:Variable declaration and assignment inside a constructor in C++ 【发布时间】:2020-02-19 16:43:52 【问题描述】:

对于以下代码:

    class mgraph
    
        private:
            int n;
            vector <vector <int>> vec;

        public:
            mgraph(int);
            void connect(int, int, int);
            void disconnect(int, int);
            void isconnected(int, int);
            void AddNode();
            void show();
    ;

    mgraph::mgraph(int nodes)
    
        n = ++nodes;
        vector <vector<int>> vec(n, vector<int>(n, 0));
        this -> vec = vec;
    

为什么分配给 vec(使用 this 指针)的 vec 不会在构造函数的任务结束后立即销毁。这样做后我得到了所需的值(不是垃圾值),但是在构造函数中创建的向量 vec 不应该在构造函数的任务结束后被销毁吗?

【问题讨论】:

你为什么认为应该将它(this-&gt;vec,如果我理解正确的话)销毁? @churill 我猜是因为构造函数就像任何其他函数一样。一旦函数的范围结束,在其中创建的变量(在堆栈中)将被销毁。我猜如果我们说向量在堆中分配内存,那么在构造函数的任务完成后它可能不会被销毁,但我不确定。 您也可以使用mgraph::mgraph(int nodes): vec(n, vector&lt;int&gt;(n)) ... ,这样可以避免复制。 【参考方案1】:

你是对的,vec 是一个自动变量,所以它的作用域仅限于构造函数。因此,它的生命周期在退出构造函数时结束并被销毁。

但是,行

this -> vec = vec;

是一个复制分配vec 的内容被复制this-&gt;vecstd::vector 的实现会处理这个问题。所以本地的vec发生什么都无所谓了,this-&gt;vec从现在开始有自己的副本了。

您提到了指针...没有涉及指针。只是一些复制。

【讨论】:

以上是关于C++ 构造函数中的变量声明和赋值的主要内容,如果未能解决你的问题,请参考以下文章

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

C++类和对象下

c++中静态成员变量和静态成员函数(笔试经历)

C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)

构造/析构/赋值运算

C++ 类 - 派生类中的构造函数声明