标签:effective c++ c++ 以对象管理资源 隐式转换函数 转换构造函数
其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转换为整形1。然而对于用户自定义的类类型,编译系统并不知道如何进行转换,所以需要定义专门的函数来告诉编译系统改如何转换,这就是转换构造函数和类型转换函数!
注意:转换构造函数、隐式转换和函数对象不要搞混淆!!!函数对象是重载运算符(),和隐式转换函数易混淆。
Complex(double r) { real=r; imag=0; }其作用是将double型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0?用户可以根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换?
// TypeSwitch.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; class Complex { public: Complex():real(0),imag(0){}; Complex(double r, double i):real(r),imag(i){}; Complex(double r):real(r),imag(0){}; // 定义转换构造函数 void Print(){ cout<<"real = " << real <<" image = "<<imag<<endl; } Complex& operator+(Complex c){ return Complex(this->real + c.real, this->imag + c.imag); } private: double real; double imag; }; int main(int argc, _TCHAR* argv[]) { Complex c; c = 1.2; // 调用转换构造函数将1.2转换为Complex类型 c.Print(); Complex c1(2.9, 4.2); Complex c2 = c1 + 3.1; // 调用转换构造函数将3.1转换为Complex类型 c2.Print(); return 0; }
Teacher(Student& s) { num=s.num; strcpy(name,s.name); sex=s.sex; }使用方法同上!
// TypeSwitch.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; class Complex { public: Complex():real(0),imag(0){}; Complex(double r, double i):real(r),imag(i){}; explicit Complex(double r):real(r),imag(0){}; // explicit禁止构造函数的转换功能 void Print(){ cout<<"real = " << real <<" image = "<<imag<<endl; } private: double real; double imag; }; int main(int argc, _TCHAR* argv[]) { Complex c1(1.2, 2.3), c2; double d; d = c1 + 1.1; // 调用类型转换函数将c1转换为double,编译出错! cout<<d<<endl; return 0; }二、类型转换函数(类的隐式转换函数)
operator double( ) { return real; }类型转换函数的一般形式为:
// TypeSwitch.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; class Complex { public: Complex():real(0),imag(0){}; Complex(double r, double i):real(r),imag(i){}; Complex(double r):real(r),imag(0){}; // 定义转换构造函数 void Print(){ cout<<"real = " << real <<" image = "<<imag<<endl; } operator double(){ // 定义类型转换函数 return real; } private: double real; double imag; }; int main(int argc, _TCHAR* argv[]) { Complex c1(1.2, 2.3); double d; d = c1 + 1.1; // 调用类型转换函数将c1转换为double cout<<d<<endl; return 0; }本例中,对于d = c1 + 1.1;先调用类型转换函数将c1转为double类型,然后在与1.1相加!
effective c++条款13-17 “以对象管理资源”之C++隐式转换和转换构造函数
标签:effective c++ c++ 以对象管理资源 隐式转换函数 转换构造函数
原文地址:http://blog.csdn.net/hustyangju/article/details/41675581