c++ - 为什么 operator* 不调用构造函数?

标签 c++ c++11 memory memory-management struct

您好,请看看这个。

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 - 

我想知道为什么创建和销毁的数量不平衡?我怀疑调用 operator* 时正在创建临时对象,但临时对象不应该也调用构造函数吗?如果我将 std::cout << "created"与 in operator* 放在一起,我可以平衡它。

我只是想知道为什么 operator* 不调用构造函数,因为我显然在那里创建了一个临时对象?模板与此有什么关系吗?我不这么认为。任何有助于理解我做错了什么的帮助都会很棒!

最佳答案

调用复制构造函数时忘记输出。由于 obj 是按 operator * 中的值返回的,因此可能会出现拷贝(它们可能会被编译器省略,但我们假设它们不是)。

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

这应该让您更好地了解按值返回 obj 时发生的情况。

关于c++ - 为什么 operator* 不调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40798452/

相关文章:

c++ - C++中WinMain、main和DllMain的区别

r - 带有 doSMP 和 foreach 的并行随机森林大大增加了内存使用量(在 Windows 上)

c++ - 关于 MySQL++、GPL 和 LGPL

具有非模板化类的 C++ 类模板?

C++ 将简单值转换为字符串

c++ - 期望 const std::string & 的函数的链接器错误

c++ - 对 C++ 基类的模糊函数调用

java - 如何监控我的 JVM 或 Eclipse 中有多少线程和内存使用情况?

c - 传递的参数更改值

c++ - std::set_intersection 用于排序的范围,因为 [ _] 用于未排序的范围/容器