提问人:Jibel 提问时间:5/27/2023 最后编辑:Jibel 更新时间:5/29/2023 访问量:166
构造函数是否与“=”运算符执行相同的操作?
Do constructors do the same thing as the '=' operator?
问:
- 当我们没有定义任何运算符时,编译器如何知道
使用构造函数?
=
- 构造函数不是只在定义变量时才调用的吗?
#include <string>
class Person
{
public:
std::string name;
Person(const char* full_name) : name(full_name) {}
};
int main()
{
Person p1("Jibel Sadeghi"); // This is ok because we declared the constructor with a const char*, but...
/* When we didn't overload the '=' operator for 'const char*',
how the next lines don't have any errors? */
p1 = "Ben Sadeghi";
}
答:
构造函数不是只在定义变量时才调用的吗?
不。在创建对象(类的实例)时使用构造函数。
该对象可以保存在变量中,也可以保存在数组的元素中,也可以动态分配,或者(在这种情况下)是一个临时对象。
当我们没有定义任何 = 运算符时,编译器如何知道使用构造函数?
您的类具有默认的复制赋值运算符,带有签名
Person& Person::operator=(const Person& assign_from);
和默认的移动赋值运算符,带签名
Person& Person::operator=(Person&& move_assign_from);
当编译器尝试编译时
p1 = "Ben Sadeghi";
它看到它需要 ,查看所有候选参数(默认有两个,因为您没有提供任何候选参数),并且对于每个候选参数,它尝试将实际参数转换为形式参数的类型。Person::operator=()
对于复制赋值,形式参数具有 type,实际参数具有 type ,并且有一个隐式构造函数能够执行转换。所以可以调用,后跟 .const Person&
const char[12]
Person::Person(const char*)
Person& Person::operator=(const Person&)
对于移动赋值,形式参数具有 type,实际参数具有 type ,并且有一个能够执行转换的隐式构造函数。所以可以调用,后跟 .Person&&
const char[12]
Person::Person(const char*)
Person& Person::operator=(Person&&)
这个参数比 更适合临时人,所以最后选择了后面的序列。Person&&
const Person&
Person::Person(const char*)
Person& Person::operator=(Person&&)
评论
const char[12]
const char *
Person::Person(const char *)
上一个:模板化矩阵类的赋值运算符重载
下一个:C 语言中的赋值运算符
评论
Person
explicit
explicit