C++ 理解C+中显式构造函数的问题+;

C++ 理解C+中显式构造函数的问题+;,c++,constructor,explicit,C++,Constructor,Explicit,看完这篇文章 这个节目是我编的 class MyClass { public: explicit MyClass(int a) { cout<<"Int was called"<<endl; val = a; } MyClass(char *a) { cout<<"Char was called"<<endl; val = atoi(a); } MyClass(const MyC

看完这篇文章

这个节目是我编的

class MyClass
{
  public:
  explicit MyClass(int a)
  {
    cout<<"Int was called"<<endl;
    val = a;
  }

  MyClass(char *a)
  {
    cout<<"Char was called"<<endl;
    val = atoi(a);
  }

  MyClass(const MyClass& copy)
  {
    cout<<"Copy Const was called"<<endl;
    this->val = copy.val;
  }

  inline const int getval() const
  { return val; }

  private:
  int val ;
};
现在,根据上面的线程,它应该在构造函数调用对象d后抛出错误,但它没有

g++版本信息

Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) 
我不确定我是否在上面的代码中做错了什么。
请帮助

实际上,构造
d
是用
int
构造函数完成的。您的
char
'4'
)已隐式转换为
int
。这在C/C++中是合法的,因为它们都是整数,
int
的宽度至少与
char
的宽度相同(另一种方法需要显式转换,因为可能会导致精度损失)


对象
d
的输出是字符“4”的ASCII码。实际上,构造
d
是用
int
构造函数完成的。您的
char
'4'
)已隐式转换为
int
。这在C/C++中是合法的,因为它们都是整数,
int
的宽度至少与
char
的宽度相同(另一种方法需要显式转换,因为可能会导致精度损失)


对象
d
的输出是字符“4”的ASCII码。

'4'是字符,可自由转换为int。52是字符“4”的字符码。

'4'是字符,可自由转换为int。52是“4”的字符代码。

explicit关键字定义构造函数不可用于隐式转换,但在代码中,您明确请求从值构造对象

如果将代码更改为:

MyClass d = 'a';
MyClass x = 5;
然后转换是隐式的,您将得到一个错误


请注意,重要的转换不是从
'a'
int
,而是从
int
MyClass
。编译器可以执行从
'a'
int
的转换,因为原始代码中显式请求了
MyClass(int)
构造函数。

explicit关键字定义构造函数不可用于隐式转换,但在代码中,您明确地请求从值构造对象

如果将代码更改为:

MyClass d = 'a';
MyClass x = 5;
然后转换是隐式的,您将得到一个错误


请注意,重要的转换不是从
'a'
int
,而是从
int
MyClass
。编译器可以执行从
'a'
int
的转换,因为原始代码中显式请求了
MyClass(int)
构造函数。

显式构造函数不允许您执行类似“隐式转换”的操作,例如初始化对象时:

MyClass d = 4;
或者在使用参数调用函数时:

void foo( const MyClass& param);

... 

foo( 4);

在您的情况下,在调用显式构造函数之前,会进行从char到int的转换,这是设计的。

显式构造函数将不允许您执行类似“隐式转换”的操作,例如初始化对象时:

MyClass d = 4;
或者在使用参数调用函数时:

void foo( const MyClass& param);

... 

foo( 4);

在您的情况下,调用显式构造函数之前,从char到int有一个转换,它是设计的。

< p> a“char”(如“d”)中有int值C++。事实上,52是“D”的整数ASCII值。

< P> A“char”(如“d”)中有int值C++。实际上,52是“d”的整ASCII值。

没有错误-它只是用整数值“4”调用int构造函数,实际上是U+0034(十六进制)或数字52。C/C++中的所有char常量在内部存储为int,没有错误-它只是使用整数值“4”调用int构造函数,实际上是U+0034(十六进制)或数字52。C/C++中的所有字符常量在内部存储为int

任何
char
文本都是
int
,您可以说
inti='a
;`

任何
char
文字都是
int
,你可以说
inti='a
;`

为什么在构造
d
时会出现错误?为什么在构造
d
时会出现错误?此外,从运算符“int”返回“const int”也没有意义,因为基本类型的cv限定右值没有意义。我说的对吗?返回的是一个按值计算的结果,因此我认为const int没有任何意义。我从来没有这样做过,但我读过一些作者的建议,以避免在
if(foo()=0)
(当
=
是预期的情况下)错误地更改临时值。对于大多数这样的情况,当前的编译器可以设置为产生警告,因此我从未真正使用过它。这就是为什么您可以用一些人讨厌的形式重新表述:if(0==foo())也没有必要从运算符“int”返回“const int”,因为基本类型的cv限定右值没有意义。我说的对吗?返回的是一个按值计算的结果,因此我认为const int没有任何意义。我从来没有这样做过,但我读过一些作者的建议,以避免在
if(foo()=0)
(当
=
是预期的情况下)错误地更改临时值。对于大多数这样的情况,当前的编译器可以设置为产生警告,所以我从未真正使用过它。这就是为什么你可以用一些人讨厌的形式重新表述:if(0==foo())