为什么运算符*不调用构造函数?

Why isn't operator* calling constructor ?

本文关键字:构造函数 调用 运算符 为什么      更新时间:2023-10-16

嗨,请看一下。

struct obj
{
    std::string _name;
    int _val;
    obj(const std::string& name_ , int val_) : _name(name_) , _val(val_)
    {
        std::cout << "Created - " << std::endl;
    }
    ~obj()
    {
        std::cout << "Deleted - " << std::endl;
    }
    obj operator *(const obj& obj_) const
    {
        return obj(_name , obj_._val * _val);
    }

    friend std::ostream& operator<< (std::ostream& out_, const obj& obj_)
    {
        out_ << " Name =  " << obj_._name << " | val = " << obj_._val << std::endl;
        return out_;
    }
};
template <typename T>
T square(T x)
{
    return x*x;
}

int main()
{
    obj a("a" , 5);
    std::cout << square(a);
}

我运行时的输出是:

Created - 
Created - 
 Name =  a | val = 25
Deleted - 
Deleted - 
Deleted - 

我想知道为什么创造和破坏数量不平衡?我怀疑在调用操作员*时会创建一个临时对象,但是临时对象也不应该调用构造函数吗?如果我放了一个std :: cout&lt;&lt;使用操作员*创建的"创建"。

我只是想知道为什么操作员*不称为contructor,因为我显然在那里创建了一个临时对象?模板与此有关吗?我不这么认为。了解我做错了什么的任何帮助将是很棒的!

调用复制构造函数时忘记输出。由于obj是通过operator *中的值返回的,因此可以发生副本(可以由编译器省略它们,但假设它们不是)。

obj(const obj& rhs) : _name(rhs._name), _val(rhs._val)
{
   std::cout << "copy constructor called" << std::endl;
}

这应该使您可以更好地了解当您返回obj时发生的事情。

此模板的代码

template <typename T> T square(T x)
{
         return x*x; 
}

按值传递参数。通过价值传递意味着复制它。操作员*通过参考传递其参数,没有创建新对象。参考是用于可变地址的语法糖(例如指针)。代码中没有声明复制构造函数,因此编译器创建了一个隐式。