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

C++中默认构造函数无参,为何可传入对象引用创建实例?

问题说明

我定义了一个Counter类,该类仅包含无参的默认构造函数。但在其中一个成员函数中,创建临时Counter对象时传入了对象自身的*this作为参数,我对此有疑问。以下是我的带注释代码:

#include<iostream>
using namespace std;
    
class Counter {
public:
    Counter();// 注意:这里只有默认构造函数
    ~Counter() {}
    int GetItsVal() const { return itsVal; } 
    void SetItsVal(int x) { itsVal = x; }
    void Increment() { ++itsVal; }
    const Counter& operator++ ();
    const Counter operator++ (int); // 正在学习重载前置和后置++,不确定这和我的问题有没有关系
private:
    int itsVal;
};
Counter::Counter():
    itsVal(0) 
{};

// 前置++的重载我都懂
const Counter& Counter::operator++() {
    ++itsVal;
    return *this;
}


const Counter Counter::operator++(int theFlag) {
    /*
     这里创建Counter对象时传入了参数?
     难道默认构造函数只能接受对象的引用作为参数吗?
    */
    Counter temp(*this); 
    ++itsVal;
    return temp;
}
int main() {
    // 学习前置和后置++,这部分和问题无关
    system("pause");
    return 0;
}
解答

你这里调用的不是你定义的无参默认构造函数,而是C++编译器自动为你生成的拷贝构造函数。

当你没有在类中显式声明拷贝构造函数时,编译器会自动生成一个默认的拷贝构造函数,它的签名通常是:

Counter(const Counter& other);

这个构造函数的作用是从一个已存在的Counter对象拷贝所有成员变量的值,来创建一个新的Counter对象。

代码里的Counter temp(*this);就是在调用这个自动生成的拷贝构造函数,把当前对象(*this)的成员值拷贝给新创建的临时对象temp,和你自己定义的无参默认构造函数没有关系。

如果你显式声明了拷贝构造函数,编译器就不会再自动生成默认版本了;反之,只要你没声明,编译器就会自动提供这个构造函数,用于对象的拷贝操作。

内容的提问来源于stack exchange,提问作者Issac Howard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:13:13