为什么运算符*不调用构造函数?
Why isn't operator* calling constructor ?
嗨,请看一下。
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;
}
按值传递参数。通过价值传递意味着复制它。操作员*通过参考传递其参数,没有创建新对象。参考是用于可变地址的语法糖(例如指针)。代码中没有声明复制构造函数,因此编译器创建了一个隐式。
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用