C++学习笔记33 转换运算符

有时候我们想将一个类类型转换为另一个类类型,同时,这两个类并不存在继承关系,这时候我们就需要一种叫做转换运算符的运算符.

一个简单的例子.要将类A转换为int类型

#include <iostream>

#include <string>

using namespace std;

class A{

private:

int n;

string str;

public:

A(int m,string s):n(m),str(s){

}

};

int main(){

A a(10,"hello");

int m=a;

cout<<"m="<<m<<endl;

//string s=a;

//cout<<"s="<<s<<endl;

}

编译结果

可能你想将其强制转换.例如

int m=(int)a;

结果还是不行,因为编译器依然不知道应该怎么转换.

这时候,就需要转换运算符了.

这个转换运算符的类型如下:

operator int ()const{

return n;

}

函数名为operator int ,这个函数是没有返回类型的,因为返回类型是通过运算符的名称确定的:int

同时应声明为const,因为不会修改被调用的对象.

整个程序如下:

#include <iostream>

#include <string>

using namespace std;

class A{

private:

int n;

string str;

public:

A(int m,string s):n(m),str(s){

}

operator int ()const{

return n;

}

operator string()const{

return str;

}

};

int main(){

A a(10,"hello");

int m=a;

cout<<"m="<<m<<endl;

string s=a;

cout<<"s="<<s<<endl;

}

运行结果:

类类型转换为基本类型是这样,同样,转换为其他类类型也是同样的道理.

#include <iostream>

#include <string>

using namespace std;

class A{

private:

int n;

string str;

public:

A(int m,string s):n(m),str(s){

}

A(string s){

str=s+" is called!";

}

operator int ()const{

return n;

}

operator string()const{

return str;

}

void show()const{

cout<<"str="<<str<<endl;

}

};

class B{

private:

string s;

public:

B(string str):s(str){

}

operator A()const{

return s;

}

};

int main(){

B b("this is b ");

A a=b;

a.show();

}

结果:

这样,我们就可以对不是同一条继承链上的类进行转换了!

C++学习笔记33 转换运算符

时间: 2024-08-29 06:06:39

C++学习笔记33 转换运算符的相关文章

【Swift】学习笔记(二)——基本运算符

运算符是编程中用得最多的,其包括一元,二元和三元 三种运算符.swift也和其它编程语言一样基本就那些,下面总结一下,也有它特有的运算符,比如区间运算符 1.一元运算符 =   赋值运算符,用得最多的啦,其不带任何返回值 +  加法(数字相加,也可用于字符拼接var ss = "a"+"b") -   减法 *   乘法 /   除法 % 求余(负号忽略,浮点数也可以求余) >  大于 <  小于 2.二元运算符 ++  自增(就是i = i + i的缩

C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】

重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的非explicit构造函数定义一个隐式转换.当提供了实參类型的对象须要一个类类型的对象时.编译器将使用该转换. 于是:这样的构造函数定义了到类类型的转换. 除了定义到类类型的转换之外,还能够定义从类类型到其它类型的转换.即:我们能够定义转换操作符,给定类类型的对象.该操作符将产生其它类型的对象.和其它转换一样,编译器将自己主动应用这个转换. 一.转换为什么实用? 定义一个SmallInt的类,该类实现安全小整

《JavaScript高级程序设计》学习笔记(2)--JS运算符详解

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 思维导图 前面对JS的运算符的操作很多细节的东西没有提及,今天给大家分享一张网上找的思维导图,对这一部分做一个详细的补充,小编觉得总结得还算很到位的:

javascript学习笔记整理(运算符 )

1.运算符和操作数的组合就称为表达式. 2.算术运算符(+ - * / % a++ a-- --a ++a) a.+ 1.用于数值计算:var a=1;var b=2;alert(a+b)===3 2.用于字符串连接:var a='h';var b="w";alert(a+b)==hw ***任何的数据类型和字符串相加都是字符串*** var a='h';var b=1;alert(a+b)=='h1' b.% 1.用于取一段范围的值(*取偶数.**取奇数) 2.一般不用于小数,因为结

C#学习笔记之三元运算符

今天看C#(我用的书籍是<C#入门经典>),看到三元运算符时,一时理解不了,因为书上关于三元运算符篇幅很少,仅仅简单的说『string resultString=(myinteger<10)? "lessthan10" : "Great than or equal 10";』就这些 除此之外并没有完整的例题,我从网上搜索时也没找到有具体的例题.自己捣鼓了一会把完整的代码给拼了出来,如此一来就容易理解的多了: 代码如下: static void Ma

Java学习笔记33

关于Set这个接口,我们在前面的笔记中提到过,Set是代表无序.不可重复的集合,其实Set就是一个不包含重复元 素的collection.关于Set不包含重复元素的标准是:不包含满足e1.equals(e2)的元素对,元素e1和e2.并且最多包含 一个null元素. 接下来我们来看看这个接口给出的方法说明: 1. int size(); 如果 set 中尚未存在指定的元素,则添加此元素(可选操作). 2. boolean addAll(Collection<? extends E> c); 如

C#学习笔记(转换)

1 as运算符 as运算符使用下面的语法,把一种类型转换为指定的引用类型 <operand> as <type> 只使用与下面的情况: <operand>的类型是<type>类型 <operand>可以隐式转换为<type>类型 <operand>可以封装到<type>类型中

scala学习笔记-数组转换(8)

使用yield和函数式编程转换数组 1 // 对Array进行转换,获取的还是Array 2 val a = Array(1, 2, 3, 4, 5) 3 val a2 = for (ele <- a) yield ele * ele 4 // 对ArrayBuffer进行转换,获取的还是ArrayBuffer 5 val b = ArrayBuffer[Int]() 6 b += (1, 2, 3, 4, 5) 7 val b2 = for (ele <- b) yield ele * el

Swift学习笔记- 2.基本运算符

赋值运算符 如果赋值的右边是一个多元组,它的元素可以马上分解多个变量或变量 let (x, y) = (1, 2)// x = 1, y = 2 Swift 赋值操作并不返回任何值,所以下面代码是错误的: if x = y {     //此句错误,因为x = y 并不反悔任何值} “+” 也可用于字符串的拼接: "hello" + “world" 两个字符类型 或 一个字符类型和一个字符串类型,相加会生成一个新的字符串类型: let dog: Character = &qu