C++构造函数初始化列表中Connection拷贝构造的调用来源疑问
问题描述
现有如下类定义:Request类定义:
#include <cstddef> #include "connection.h" class Request{ private: size_t sz; char *data; Connection *connection; public: Request(const char* d, size_t s, const Connection &c); Request& operator=(const Request &other); Request(const Request &rhs); ~Request(); void print(); void setElement(size_t, char); };
Connection类头文件定义:
#include <cstddef> #ifndef CONNECTION_HPP #define CONNECTION_HPP class Connection { private: size_t *priority; size_t *count; public: Connection(size_t p): priority(new size_t(p)), count(new size_t(1)) {}; Connection(const Connection&); Connection& operator=(const Connection&); ~Connection(); size_t getPriority(); void setPriority(size_t); }; #endif
给出的Request类构造函数实现如下:
Request::Request(const char* d, size_t s, const Connection& c): sz(s), data(new char[s]),connection(new Connection(c)) { for (size_t i = 0; i<s; ++i) data[i] = d[i]; }
初始化列表中的代码connection(new Connection(c))会调用Connection类的拷贝构造函数,请问该拷贝构造函数是由new Connection(c)触发调用的,还是由成员指针connection的初始化操作触发的?
答案
拷贝构造是new Connection(c)触发的,和成员指针connection的初始化操作没有任何关系。
把执行顺序拆解开看就很明白:
- 给成员
connection做初始化时,C++会先计算括号里的初始化表达式,也就是先执行new Connection(c)。这个new表达式会先申请一块能存放Connection对象的堆内存,接着调用Connection的构造函数,传入参数c,此时匹配到的就是拷贝构造函数Connection(const Connection&),到这一步拷贝构造就已经执行完成了,new最终返回的是新创建的Connection对象的堆内存地址。 - 后续给指针成员
connection初始化的操作,本质只是把new返回的地址值拷贝给指针变量本身。指针本质就是个存内存地址的标量,它的初始化只是修改自己存的地址数值,根本不会触发它指向的Connection类型的任何构造、析构逻辑。
换个等价写法就更清楚了:这行初始化完全等同于先写Connection* temp = new Connection(c);(这一步就已经调用完拷贝构造了),再执行connection = temp;,总不能说把temp赋值给connection这步触发了拷贝构造吧?connection只是接了个new返回的地址而已。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

