PPC的C/C++和人工智能学习笔记
每一篇学习笔记,都只是为了更好地掌握和理解

C++语言基础(11)_类型转换和运算符重载

今天学习C++的类型转换和运算符重载:

 

C++的四种类型转换

static_cast

和C的强转差不多,运行时也没有类型检查来保证转换的安全性。比如把int转换为float等等。

如:pd = static_cast<CD *>(&b) ,用c的写法就是 pd = (CD*)(&b);

int i =static_cast<int>(2.0f),用C的写法就是 int i=(int)2.0f;

 

dynamic_cast

在多态状态的时候会去检查类型是否安全,且该类最少要有一个虚函数。假如不允许则返回NULL,而c写法是可以强转的。

如D pd = dynamic_cast<CD *>(&b);//D是B的子类,强转之后pd为空值。

 

const_cast

常量指针转成非常量指针,常量引用转成非常量引用,常量对象转成非常量对象。

用于取出const属性,把const类型的指针变为非const类型的指针。

如:const int *fun(int x,int y){}  int *ptr=const_cast<int *>(fun(2.3))

 

reinterpret_cast

把数据的二进制形式重新解释,但不改变其值。(interpret是解释的意思,reinterpret即为重新解释)。比如把一个指针强转为整形变量,把一个整形变量强转为一个指针,不太常用。

如:int i; char *ptr=”hello freind!”; i=reinterpret_cast<int>(ptr);

 

C++运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。

运算符重载,把运算符当成符号,重新载入加入新的行为。

 

C++运算符重载的特点

运算符重载发生在类(c++中结构体也可以看作类)当中;

. :: sizeof() ?: *(解引用) 不可以重载。

new delete是c++的运算符,也可以重载。(malloc和free是c的函数)

重载运算符后,运算符本身优先级不会变,本身的运算的方式和之前一样。

例子:(看11-1 自己写string类,有更加详细的运算符重载例子)

//运算符重载例子
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
using std::istream;

class CMyPos
{
 int x, y;
public:
 CMyPos(int x = 1, int y = 3) { this->x = x; this->y = y; }
 CMyPos operator+ (CMyPos const& srcPos);
 friend CMyPos operator* (CMyPos const& src1, CMyPos const& src2);
 CMyPos& operator=(CMyPos const & src1)
 {
 x = src1.x;
 y = src1.y;
 return *this;
 }

 //++前置
 CMyPos& operator++() //显式调用: p.operator++()
 {
 x += 1;
 y += 1;
 return *this;
 }
 //++后置,参数里面的int是一种表现,只是为了区别前置的代码
 CMyPos operator++(int) //显式调用: p.operator++(0)
 {
 CMyPos tempPos;
 tempPos.x = x;
 tempPos.y = y;
 x += 1;
 y += 1;
 return tempPos;
 }

 friend ostream& operator << (ostream & ot, const CMyPos & src1);
 friend istream& operator >> (istream& it, CMyPos& dest)
 {
 it >> dest.x;
 it >> dest.y;
 return it;
 }
 //new运算符重载,要注意new的用法,是用来创建动态内存,所以重载一般也会用来创建动态内存
 //平时少见,比较多用在动态库中,同时重载了new ,delete也需要重载
 void * operator new(size_t i)
 {
 }
};

ostream& operator << (ostream & ot, const CMyPos & src1)
{
 ot << src1.x << "-----" << src1.y << endl;
 return ot;
}

CMyPos operator* (CMyPos const& src1, CMyPos const& src2)
{
 CMyPos tempPos;
 tempPos.x = src1.x * src2.x; //意思而已
 tempPos.y = src1.y * src2.y;
 return tempPos;
}

CMyPos CMyPos::operator+ (CMyPos const& srcPos)
{
 CMyPos tempPos(0, 0);
 tempPos.x = this->x + srcPos.x;
 tempPos.y = this->y + srcPos.y;
 return tempPos;
}

int main()
{
 CMyPos p(1, 2), p1(2, 3);
 CMyPos p3 = p1 + p;
 CMyPos p4 = p1.operator+(p);
 CMyPos p5 = p * p1;
 std::cin >> p3;
 cout << p3;
}

(2017-03-30 www.vsppc.com)

学习笔记未经允许不得转载:PPC的C/C++和人工智能学习笔记 » C++语言基础(11)_类型转换和运算符重载

分享到:更多 ()

评论 抢沙发

评论前必须登录!