1. 先放一段实验代码及编译结果。
#include <iostream>
class Stock1
{
public:
Stock1(std::string str)
{
name = str;
}
private:
std::string name;
};
class Stock2
{
public:
explicit Stock2(std::string str)
{
name = str;
}
private:
std::string name;
};
class Price
{
public:
Price(int n)
{
value = n;
}
private:
int value;
};
int main()
{
Stock1 nvidia = Stock1("nvidia");
Stock1 intel("intel");
std::string str1 = "amd";
Stock1 amd = str1;
Stock2 samsung = Stock2("samsung");
Stock2 ibm("ibm");
std::string str2 = "micro";
Stock2 micro = str2; // compile error
micro = "micro"; // compile error, operator=() need implementation
Stock2 tsmc = "tsmc"; // compile error
Stock1 arm = nvidia; // default copy constructor, shallow copy
Price price = 1;
return 0;
}
编译结果如下:
practice.cpp: In function ‘int main()’:
practice.cpp:49:20: error: conversion from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to non-scalar type ‘Stock2’ requested
Stock2 micro = str2; // compile error
^~~~
practice.cpp:50:13: error: no match for ‘operator=’ (operand types are ‘Stock2’ and ‘const char [6]’)
micro = "micro"; // compile error
^~~~~~~
practice.cpp:15:7: note: candidate: Stock2& Stock2::operator=(const Stock2&)
class Stock2
^~~~~~
practice.cpp:15:7: note: no known conversion for argument 1 from ‘const char [6]’ to ‘const Stock2&’
practice.cpp:15:7: note: candidate: Stock2& Stock2::operator=(Stock2&&)
practice.cpp:15:7: note: no known conversion for argument 1 from ‘const char [6]’ to ‘Stock2&&’
practice.cpp:51:19: error: conversion from ‘const char [5]’ to non-scalar type ‘Stock2’ requested
Stock2 tsmc = "tsmc"; // compile error
2. 对结果进行讨论
代码中一共设置了3处错误:
(1) line49
class Stock2的构造函数前面加上了限定符(specifier) explicit,要求进行显示构造。
(2) line50
编译错误中提示需要实现函数operator=,我们的类中没有这样的成员函数。
(3) line51
很多人容易混淆std::string和字符串常量。也就是说“tsmc”并不是std::string,而是const char[]。所以在类型上不匹配,但是我们通过间接的方式,std::string str1 = "amd"; Stock1 amd = str1; 就能够匹配到Stock1的构造函数。
相关资料:
https://en.cppreference.com/w/cpp/language/explicit
---------- 未完待续 ----------
---------- 欢迎讨论和指正 ----------