首页 > 编程语言 >C++类型转换

C++类型转换

时间:2024-02-15 16:11:54浏览次数:36  
标签:类型转换 const int void Father C++ cast 转换

C++类型转换

静态转换

​ 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换

//指针
void test02() {
	Father* f = NULL;
	Son* s = NULL;
	//向下转换 不安全
	Son* s1 = static_cast<Son*> (f);
	//向上转换 安全
	Father* f1 = static_cast<Father*> (s);
	//没有 继承关系的类之间的指针不能转换
	//other* o = static_cast<other*>(s);
} 

//引用
void test02() {
	Father f;
	Son s;
	Father &ref_f = f;
	Son& ref_s = s;
	
	static_cast<Father&>(ref_s);
	static_cast<Son&>(ref_f);
} 

​ 用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发人员来保证

//基础类型转换
void test02() {
	char a = 'a';
	//char - > double
	double d = static_cast<double> (a);
	// double d = (double)a;
}

动态转换:

l 不支持基础类型的转换

char a = 'a';
//不支持基础类型转换
dynamic_cast<double>(a); //error

l ynamic_cast主要用于类层次间的上行转换和下行转换;

l 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;

l 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全;

void test05() {
	Father* f = NULL;
	Son* s = NULL;
	//向下转换 不安全 会检测
	Son* s1 = dynamic_cast<Son*> (f); //error
	//向上转换 安全
	Father* f1 = dynamic_cast<Father*> (s);
}

l 发生多态时候,动态转换就可以

class Father {
public:
	virtual void func() {}
};
class Son :public Father {
	virtual void func() {} //重写父类虚函数
};
void test05() {
    //发生多态时候,可以向下转换
	Father* f = new Son;
	Son* s = dynamic_cast<Son*> (f);
}

常量转换

l 常量指针被转化成非常量指针,并且仍然指向原来的对象;

void test() {
	const int* p = nullptr;
	//const --> 不带const的
	int* newptr = const_cast<int*> (p);
}

void test01() {
	int* p = nullptr;
	//不带const的--> const
	const int* newptr = const_cast<const int*> (p);
}

l 常量引用被转换成非常量引用,并且仍然指向原来的对象;

void test05() {
	int num = 5;
	const int& refnum1 = num;
	//常量引用 ---> 非常量引用
	int& newrefnum1 = const_cast<int&> (refnum1);
}

void test02() {
	int num = 5;
	int& refnum1 = num;
	//常量引用 ---> 非常量引用
	const int& newrefnum1 = const_cast<cosnt int&> (refnum1);
}

重新解释转换

这是最不安全的一种转换机制,最有可能出问题。

主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针.

class other {};
class Father {
public:
	virtual void func() {}
};
class Son :public Father {
	virtual void func() {}
};

//重新解释转换
void test02() {
    //基础类型
	int num = 5;
	int* p = reinterpret_cast<int*> (num);
    //其他类类型
    Father *f = NULL;
	other* p = reinterpret_cast<other*> (f);
}

标签:类型转换,const,int,void,Father,C++,cast,转换
From: https://www.cnblogs.com/wbcde116/p/18016312

相关文章

  • windows下c++遍历各个磁盘的所有文件,不知道为什么FindFirstFileA文件会报错,进而程序退
    下面的程序还有一些问题,比如360的一些目录就用FindFirstFileA函数打开错误;还有  C:\Windows\System32\WebThreatDefSvc ,属性只有 DIRECTORY,用函数 _access检查也没有问题,但是就是用FindFirstFileA打开的时候错误;至今没有想到解决办法,只能临时跳过这种目录。 #include......
  • C++ Builder使用FMX多平台框架
    C++Builder使用FMX多平台框架C++Builder使用FMX多平台框架C++Builder使用FMX多平台框架......
  • Effective C++ 第一章:让自己习惯C++
    EffectiveC++第一章:让自己习惯C++引言最近在阅读这本《effectiveC++改善程序与设计的55个具体做法》这本书,为了以后忘记的时候回顾,写一些笔记,每次笔记大概记录一个章节的内容。条款1.视C++为一个语言联邦C++最早只是C语言的扩充,在C基础上加上了面向对象特性,但是发展了很多......
  • C++多线程 第五章 C++内存模型和原子类型
    第五章C++内存模型和原子类型无论其他语言如何,C++是一门系统编程语言.委员会希望不再需要一个比C++低级的语言.内存模型基础C++程序中所有的数据均是由对象(object)组成的.C++标准定义对象为"存储区域",经管它会为这些对象分配属于它们的类型和生存期.无论什么类型,对象......
  • C++ map自定义比较函数遵守严格弱序
    C++map自定义比较函数遵守严格弱序问题背景及定位背景:这个问题是在将tablesaw(一个Java的数据处理项目)迁移到C++时出现的。问题位置:SplitOn()函数,在数据流水线中的aggregate阶段。问题描述:使用google/benchmark进行了批量化的性能测试,在测试中出现偶发性段错误,几率大约在万分......
  • C++——编译和链接原理笔记
    我们在学习和开发C++程序中,理解编译和链接的原理至关重要。下面将学习一下C++程序是如何从源代码转换为可执行文件的过程,并结合示例代码进行说明。也是为了解开自己在刚学习C++的时候,编译时间长的疑惑。为了不让自己的学习之路这么枯燥,我按照一个正常的开发流程梳理一下......
  • c++定义类的时候,只提供拷贝构造函数而不提供默认(无参)构造函数和有参构造函数会怎样?
    4.2.4构造函数调用规则默认情况下,c++编译器至少给一个类添加三个函数:默认构造函数(无参,函数体为空)默认析构函数(无参,函数体为空)默认拷贝构造函数(对属性进行值拷贝)构造函数调用规则:如果用户定义有参构造函数,编译器不会提供默认(无参)构造,但是会提供默认拷贝构造函数如果用户......
  • C++——异常处理模块笔记
    异常处理是C++中的重要概念之一,用于处理在程序执行过程中可能发生的错误或异常情况。异常是指在程序执行过程中发生的一些不寻常的事件,例如除零错误、访问无效内存等。C++提供了一套异常处理机制,使得程序可以优雅地处理这些异常,提高程序的可靠性和健壮性。异常是一种程序......
  • 【C++】两两交换链表中的节点
    #include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};ListNode*swapPairs1(ListNode*head){ListNode*dummyHead=newListNode(0);dummyHead......
  • 【C++】给定两个增序的链表,试将其合并成一个增序的链表。
    给定两个增序的链表,试将其合并成一个增序的链表。#include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};voidprintList(ListNode*head){while(head){std:......