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())