嗨,请看看这个。
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&lt;&lt; &#34;创建&#34;与运营商*。
我只是想知道为什么operator *不会调用构造函数,因为我在那里显然创建了一个临时对象?模板是否与此有关?我不这么认为。任何帮助理解我做错了什么都会很棒!
答案 0 :(得分:3)
调用复制构造函数时忘记输出。由于obj
中的值按operator *
返回,因此可能会出现副本(编译器可以删除它们,但我们假设它们不是)。
obj(const obj& rhs) : _name(rhs._name), _val(rhs._val)
{
std::cout << "copy constructor called" << std::endl;
}
这可以让您更好地了解按价值返回obj
时的情况。
答案 1 :(得分:1)
此模板的代码
template <typename T> T square(T x)
{
return x*x;
}
按值传递参数。按值传递意味着复制它。 operator *通过引用传递其参数,不会创建任何新对象。 reference是变量地址的语法糖(如指针)。在代码中没有声明复制构造函数,因此编译器创建了一个隐式构造函数。