You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:18:21