c++转换构造函数和类型转换函数

看stl源码时,有一段代码感觉很奇怪

iterator begin() { return (link_type)((*node).next); }

iterator和link_type是两种不同类型,怎么能这么返回呢?翻了一下以前的笔记,发现是由转换构造函数生成临时对象再return。

转换构造函数的作用是将某种类型的数据转换为类的对象,当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。试验了一下

class A
{
public:
    int a;
    A(int a) :a(a) {}
    A reta()
    {
        return a;
    }
};
int main()
{
    A a(2);
    A b = a.reta();
    A c = 3;
    cout<<b.a<<"\n"<<c.a<<endl;
    return 0;
}

结果是输出2和3

实际上这是由隐式转换机制造成的,如果不想要这种效果,可以在构造函数前加上explicit声明。加上之后上面的代码就会编译出错,提示

无法从“int”转换为“A”。

既然能将数据转换为类型,类型也能转换为数据。c++的类型转换函数可以将一个类的对象转换为一个指定类型的数据。

类型转换函数的一般形式为 :

operator 类型名()

{实现转换的语句}

测试代码:

class A
{
public:
    int a;
    A(int a) :a(a) {}
    operator int()
    {
        return a;
    }
};
int main()
{
    A a(2);
    int b = a + 3;
    A c = a + 4;
    cout<<b<<"\n"<<c.a<<endl;
    return 0;
}

结果输出5和6

时间: 2024-10-29 19:07:19

c++转换构造函数和类型转换函数的相关文章

C++语言基础(22)-转换构造函数和类型转换函数

一.转换构造函数 将其它类型转换为当前类类型需要借助转换构造函数(Conversion constructor).转换构造函数也是一种构造函数,它遵循构造函数的一般规则.转换构造函数只有一个参数. #include <iostream> using namespace std; //复数类 class Complex{ public: Complex(): m_real(0.0), m_imag(0.0){ } Complex(double real, double imag): m_real

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳、operator new 和 operator delete 实现一个简单内存泄漏跟踪器

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳.operator new 和 operator delete 实现一个简单内存泄漏跟踪器 一.转换构造函数 可以用单个实参来调用的构造函数定义从形参类型到该类型的一个隐式转换.如下: class Integral { public: Integral (int = 0); //转换构造函数 private: int real; }; Integral A = 1; //调用转换构造函数将1转换为In

面向对象进阶--转换构造函数,重载,类型转换函数

转换构造函数 1.将其他类型转换为当前类类型需要借助转换构造函数. 具体看例子:点击 类型转换函数 1.将当前类类型转换为其他类型,只能出现在类中. 2.语法格式: operator type(){ //TODO: return data; } operator 是 C++ 关键字,type 是要转换的目标类型,data 是要返回的 type 类型的数据. 具体点击 再谈转换构造函数和类型转换函数(例子) 具体点击 类型转换的本质 具体点击 四种类型转换运算符 static_cast     d

effective c++条款13-17 “以对象管理资源”之C++隐式转换和转换构造函数

其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转换为整形1.然而对于用户自定义的类类型,编译系统并不知道如何进行转换,所以需要定义专门的函数来告诉编译系统改如何转换,这就是转换构造函数和类型转换函数! 注意:转换构造函数.隐式转换和函数对象不要搞混淆!!!函数对象是重载运算符(),和隐式转换函数易混淆. 一.转换构造函数 转换构造函数(conve

C++中的类型转换函数

1,转换构造函数可以将普通的基础类型转换为当前的类类型,也有能力将其它类类 型的对象转换为当前的类类型: 2,问题: 1,类类型是否能够类型转换到普通类型? 1,可以的: 3,类型转换函数: 1,C++ 类中可以定义类型转换函数: 2,类型转换函数用于将类对象转换为其他类型: 1,不管什么类型都可以: 3,语法规则: 1,代码示例: 1 operator Type () // operator 表示定义类型转换函数,Type 表示返回值,没有参数: 2 { // 函数体表示普通的函数体内容: 3

C++类转换构造函数和转换函数复习

//C++类转换构造函数和转换函数复习 #include<iostream> #include<string> using namespace std; class Student { private: string name; int age; double grade; public: Student(string name_, int age_, double grade_):name(name_), age(age_), grade(grade_){} Student(){

More Effective C++----(4)避免无用的缺省构造函数 &amp; (5)谨慎定义类型转换函数

Item M4:避免无用的缺省构造函数 缺省构造函数(指没有参数的构造函数)在C++语言中是一种让你无中生有的方法.构造函数能初始化对象,而缺省构造函数则可以不利用任何在建立对象时的外部数据就能初始化对象.有时这样的方法是不错的.例如一些行为特性与数字相仿的对象被初始化为空值或不确定的值也是合理的,还有比如链表.哈希表.图等等数据结构也可以被初始化为空容器. 但不是所有的对象都属于上述类型,对于很多对象来说,不利用外部数据进行完全的初始化是不合理的.比如一个没有输入姓名的地址簿对象,就没有任何意

21.C++- ++操作符重载、隐式转换之explicit关键字、类的类型转换函数

++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 前置++操作符的返回值为*this 后置++操作符的返回值为临时对象 例如: 转换规则如下所示: 比如: 隐式转换的隐患 隐式转换有时会因为类型不同,得到的结果大有不同,也是常见bug之一. 参考以下示例: 运行打印: 答案并非是-1000. 同样,我们使用构造函数时,也经常使用隐式转换 参考以下示

第42课 类型转换函数

1. 类型转换函数 (1)C++类中可以定义类型转换函数 (2)类型转换函数用于将类对象转换为其它类型 (3)语法规则: operator Type() //重载类型运算符 { Type ret; //…… return ret; } [编程实验]类型转换函数初探 #include <iostream> using namespace std; class Test { int mValue; public: Test(){mValue = 0;} //转换构造函数 Test(int i =