解析C++转换构造函数(调用规则)

什么叫转换构造函数?

当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。

参考一下示例:

// TypeSwitch.cpp : Defines the entry point for the console application.
//

#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){};
    //1> 转换构造函数
	Complex(double r):real(r),imag(0)
	{
		cout<<"转换构造函数被调用。 \n";
	}; 

	void Print()
	{
		cout<< "real = " << real << " image = " << imag<< endl;
	}

	Complex& operator+(const Complex &cl)
	{
		this->real += cl.real;
		this->imag += cl.imag;
		return *this;
	}

    //2> = 赋值运算重载
// 	Complex& operator = (double i)
// 	{
// 		this->real = 0;
// 		this->imag = i;
// 	    cout<<"赋值运算重载被调用"<<endl;
// 		return *this;
// 	}

private:
	double real;
	double imag;
};

int main(int argc, char* argv[])
{
	Complex cl;//构造函数Complex()被调用;
	cl.Print();//real = 0 imag = 0;
	cl = 1.5;  //1>转换构造函数被调用;如果1>,2>都存在,2> = 赋值运算重载会被调用;
	cl.Print();//1>的时候,real = 1.5 imag = 0; 1>,2>的时候,real = 0 imag = 1.5;
	cl = Complex(2,3);//构造函数Complex(double r, double i)被调用后,调用默认=赋值运算;
	cl.Print();//real = 2 imag = 3;
	cl = Complex(1, 1) + 2.5;//1>转换构造函数被调用;如果1>,2>都存在,1>转换构造函数被调用
	cl.Print();//real = 3.5 imag = 1;
	return 0;
}

P.S注释已经很详细,如果不清楚,可以自己debug一下。

时间: 2024-10-10 02:41:36

解析C++转换构造函数(调用规则)的相关文章

C++笔记018:构造函数的调用规则

  原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 一.默认构造函数 两个特殊的构造函数 1.默认无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空: 2.默认拷贝构造函数 当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值复制. 二.构造函数调用规则 1.当类中没有定义任何一个构造函数时,C++编译器会提供默认无参构造函数和默认拷贝构造函数: 2.当类中定义了拷贝构造函数时,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

C++ 类的构造函数使用规则

//类的构造函数使用规则 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class PointA{ }; class PointB{ public: PointB(int _a, int _b, const char *pin/*in*/){ x = _a; y = _b; remark = (char *)malloc(sizeof(char)*(strlen(pin) + 1)); strcp

Scala中隐式转换内幕操作规则揭秘

Scala中隐式转换内幕操作规则揭秘.最佳实践及其在Spark中的应用,具体来说就是通过类的伴生对象实现隐式转换,而不用 Import操作,在spark的RDD对象中用得很多 例子:在spark中,RDD就是通过RDD类的伴生对象实现隐式转换 object RDD { implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)]) (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Orderin

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

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

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

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

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

看stl源码时,有一段代码感觉很奇怪 iterator begin() { return (link_type)((*node).next); } iterator和link_type是两种不同类型,怎么能这么返回呢?翻了一下以前的笔记,发现是由转换构造函数生成临时对象再return. 转换构造函数的作用是将某种类型的数据转换为类的对象,当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数.试验了一下 class A { public: int a;

GDB 运行PYTHON 脚本+python 转换GDB调用栈到流程图

http://tromey.com/blog/?cat=17 http://blog.csdn.net/cnsword/article/details/16337031 http://blog.csdn.net/woohello/article/details/7326615 转换GDB调用栈到流程图 http://blog.csdn.net/HorkyChen/article/details/23307921 http://blog.csdn.net/horkychen/article/det