一、内置类型转换
在C++中,当涉及到内置类型的数据类型转换时,如果两种数据类型是兼容的,C++会自动进行类型转换。然而,需要注意从更大的数转换为更小的数时,可能会发生截断或精度损失。
long count = 8; // int 转换为 long
double time = 11; // int 转换为 double
int side = 3.33; // double 转换为 int,小数部分会被截断
C++不会自动转换不兼容的数据类型。例如,下面的语句是非法的:
int* ptr = 8;
二、 类相关类型的转换(隐式类型转换)
当涉及到类类型时,从某种类型转换为类类型是有意义的。例如,将一个字符串转换为一个自定义的类类型:
string str = "我是一只傻傻鸟。";
在C++中,我们可以使用一个参数的构造函数作为自动类型转换函数,这使得类型转换可以自动进行,无需显式指定。
class MyClass{
public:
int a_;
MyClass(){
cout << "默认构造函数" << endl;
}
MyClass(int a){
a_=a;
cout<<"有参构造函数"<<endl;
}
};
- 常规写法
int main(){ MyClass myclass(10); } 输出: 有参构造函数
- 显式转换
int main(){ MyClass myclass= MyClass(10); } 输出: 有参构造函数
- 隐式转换1
int main(){ MyClass myclass=8; } 输出: 有参构造函数
- 隐式转换2
int main(){ MyClass myclass;//创建对象 myclass=8;//隐式转换,使用 MyClass(8) 创建临时对象,再赋值给 myclass } 输出: 默认构造函数 有参构造函数
自动类型转换注意事项
-
一个类可以有多个转换函数。
class MyClass{ public: int a_; double b_; MyClass(){ cout << "默认构造函数" << endl; } MyClass(int a){ a_=a; cout<<"有参构造函数MyClass(int a)"<<endl; } MyClass(double b){ b_=b; cout<<"有参构造函数MyClass(double b)"<<endl; } }; int main(){ MyClass myclass1=8; MyClass myclass2=3.4; } //有参构造函数MyClass(int a) //有参构造函数MyClass(double b)
-
多个参数的构造函数,如果除第一个参数外其他参数都有默认值,也可以作为转换函数。
class MyClass{ public: int a_; double b_; MyClass(){ cout << "默认构造函数" << endl; } MyClass(int a,double b=3.14){ a_=a; cout<<"有参构造函数"<<endl; } }; int main(){ MyClass myclass1=8; }
-
隐式转换的场景包括:
class MyClass{ public: int a_; MyClass(){ cout << "默认构造函数" << endl; } MyClass(int a){ a_=a; cout<<"有参构造函数"<<endl; } };
-
将 MyClass 对象初始化为 int 值时:
int main(){ MyClass myclass1=8; }
-
将 int 值赋给 MyClass对象时:
int main(){ MyClass myclass1; myclass1=8; }
-
将 int 值传递给接受 MyClass参数的函数时 :
void func(MyClass myclass){ } int main(){ func(0); }
-
返回值被声明为 CGirl 的函数试图返回 int 值时
MyClass func() { int a=9; return a; } int main() { MyClass myclass = func(); }
-
在上述任何一种情况下,使用可转换为 int 类型的内置类型时
MyClass func() { char a=9;//char类型可以转换为int类型 return a; } int main() { MyClass myclass = func(); }
-
如果自动类型转换存在二义性,编译将报错。
-
尽管将构造函数用作自动类型转换函数在某些情况下很方便,但有时候会导致意外的类型转换。为了控制自动特性,可以使用 explicit 关键字来关闭这种自动转换特性,但仍然允许显式转换。
class MyClass {
public:
int a_;
MyClass() {
cout << "默认构造函数" << endl;
}
explicit MyClass(int a) {
a_ = a;
cout << "有参构造函数" << endl;
}
};
int main() {
MyClass myclass = 8;//error: no viable conversion from 'int' to 'MyClass'
}
以上就是关于C++自动类型转换的简要介绍和示例代码。在实际编程中,要谨慎使用自动类型转换,以避免不必要的错误和混淆。
三、 转换函数(类型转换)
转换函数(conversion function)是一种特殊类型的类成员函数。它定义了一个由用户定义的转换,以便把一个类对象转换成某种其他的类型。
在类的声明中,通过指定关键字operator,并在其后加上转换的目标类型后,我们就可以声明转换函数。
转换函数采用如下的一般形式:
operator type()
这里的type可用内置类型、类类型或typedef名取代。但是不允许type表示数组或函数。
转换函数必须是成员函数,它的声明不能指定返回类型和参数列表。
如果转换函数没有类成员进行修改,可以在函数声明中增加const关键字,增加代码的健壮性。
例如:
class MyClass {
public:
int a_;
MyClass(){
a_=30;
}
operator int () {
return a_;
}
};
int main() {
MyClass myclass;
int a = myclass;
cout<<a<<endl;
}