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->vec
,如果我理解正确的话)销毁?
@churill 我猜是因为构造函数就像任何其他函数一样。一旦函数的范围结束,在其中创建的变量(在堆栈中)将被销毁。我猜如果我们说向量在堆中分配内存,那么在构造函数的任务完成后它可能不会被销毁,但我不确定。
您也可以使用mgraph::mgraph(int nodes): vec(n, vector<int>(n)) ...
,这样可以避免复制。
【参考方案1】:
你是对的,vec
是一个自动变量,所以它的作用域仅限于构造函数。因此,它的生命周期在退出构造函数时结束并被销毁。
但是,行
this -> vec = vec;
是一个复制分配。 vec
的内容被复制到 this->vec
,std::vector
的实现会处理这个问题。所以本地的vec
发生什么都无所谓了,this->vec
从现在开始有自己的副本了。
您提到了指针...没有涉及指针。只是一些复制。
【讨论】:
以上是关于C++ 构造函数中的变量声明和赋值的主要内容,如果未能解决你的问题,请参考以下文章
C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值
C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)