C++中的类型转换学习笔记

1、在数值计算过程中一些常用的数值转换规则:

(1)如果两个操作数有一个操作数的类型为long double,则另一个操作数无论何种类型,均被转换为long double类型。

(2)如果两个操作数有一个操作数的类型为double,而另一个操作数不是long double类型,则另一个操作数被转换为double类型。

(3)如果两个操作数的类型都不是double(包括long double)类型,而一个操作数的类型是float,则另一个操作数被转换为float类型。

(4)如果两个操作数都是整数,编译器将所有小于int类型的操作数提升为int类型。

2、显式转换的形式:cast-name<type>(expression)。

type是转换的目标类型而expression是要转换的值。如果type是引用类型,则结果是左值。cast-name是static_cast,dynamic_cast,const_cast和reinterpret_cast中的一种。

3、静态转换:static_cast。

任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

4、动态转换也是C++语言提供的一种强制类型转换方式。与静态转换不同的是在转换前它能够进行类型检查。动态转换通常用于一个类对象指针转换为另一个类对象指针。如果源指针类型与目标指针类型不兼容,则转换的结果为NULL。程序中可以通过检测结果是否为NULL来判断强制类型是否成功。

在C++中使用dynamic_cast关键字进行动态转换。动态转换只能对void *(无类型指针)类型或者类对象指针进行转换,并且类中必须包含有虚方法,而不能对普通的数据类型进行转换。

5、常量转换,用于将const对象转换为非const对象。

如下,可以转换为同类型的非常量指针:

#include<iostream>
using namespace std;
int main()
{
    const int max_a = 100;
   // long *plen = (long*)&max_a;
   // cout << *plen << endl;  //在C中可以进行

    //在C++中:
    int * plen = const_cast<int *>(&max_a);
   // long *plen = const_cast(long *)(&max_a);  //对于不同类型的long型则编译不通过
    cout << *plen << endl;
    return 0;
}

但是如下程序,虽然转换成功,但是改过值后依然输出的是常量的值。

#include<iostream>
using namespace std;
int main()
{
    const int max_a = 100;
   // long *plen = (long*)&max_a;
   // cout << *plen << endl;  //在C中可以进行

    //在C++中:
    int * plen = const_cast<int *>(&max_a);
   // long *plen = const_cast(long *)(&max_a);
    cout << *plen << endl;
    return 0;
}

因为max_a是常量,原则上是不能改变常量值的,因此编译器在编译时遇到常量,将其直接翻译为一个常数,而不进行寻址操作。

6、重解释转换。

重解释转换能将任何指针类型转换为其他的指针类型,这种转换方式是一种不安全的转换方式。在程序中应该尽量少用。

#include<iostream>
using namespace std;
int main()
{
    char *psztext = "mrkj";
    unsigned int *paddr = reinterpret_cast<unsigned int *>(psztext);
    char * pszcaption = reinterpret_cast<char*>(paddr);
    return 0;
}

在使用重解释转换时,通常转换后的指针是不能够按照它的数据类型使用的。在程序中使用reinterpret_cast是危险的、不明智的,因此建议开发人员少使用,谨慎使用。

7、数值与字符串转换

函数都在<stdlib.h>头文件里。

(1)字符串转换为整数 : int atoi(const char * string)

string:表示待转换后的字符串。

返回值:如果函数执行成功,返回值为字符串转换后的整数,如果参数string不能转换为整数,返回值为0.如果参数string转换后的数值溢出,返回值未知。

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
    char *pszheight = "100";
    char *width ="200";
    int nheight = atoi(pszheight);
    int nwidth = atoi(width);
    int area = nheight * nwidth ;
    cout << area << endl;
    return 0;
}

(2)字符串转换为实数 double atof(const char * string);

string:待转换后的字符串

返回值:如果函数执行成功,返回值为字符串转换后的实数,如果参数布恩那个转换为实数,返回值为0.0,溢出同样为未知。

(3)整数转换为字符串  char *itoa(int value,char *str,int radix)

value:表示待转换的整数

str:表示一个字符指针,用于存储函数转换后的字符串

radix:表示基数,范围2...35,通常为10,即采用10进制转换。

返回值:函数返回一个指向str参数的字符指针。

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
    int ndays = 365;
    char psztext[128] = {0};
    itoa(ndays,psztext,10);
    cout << psztext << endl;
    return 0;
}

不知道为什么我的codeblocks有G++还是不支持,在VC 6.0中可以正确运行。

(4)实数转换为字符串 char * fcvt(double value,int count ,int *dec,int *sign);

value:表示待转换的实数

count:表示小数点后的位数,即精度。

dec:是一个整形指针,表示数字的符号,0为正数,1为负数。

返回值:如果函数执行成功,返回值是一个字符指针,否则为NULL。

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
   double dbpi = 3141.5926;
   int ndec;
   int nsign;
   char * psztext=fcvt(dbpi,2,&ndec,&nsign);
   cout << "字符串为:" << psztext << endl;
   cout << "小数点后的位数为2" << endl;
   cout << "小数点的位置" << ndec << endl;
   cout << "数字的符号:" << nsign << endl;
   return 0;
}
时间: 2024-11-03 01:17:16

C++中的类型转换学习笔记的相关文章

XML From Action Script[AS中的XML学习笔记]

XML From Action Script XML 是 eXtensible Markup Language (可扩展标记语言)的缩写. E4X ECMAScript for XML 规范定义了一组用于处理 XML 数据的类和功能.这些类和功能统称为 E4X. ActionScript 3.0 包含 以下 E4X 类:XML. XMLList. QName 和 Namespace. E4X 包含了一些直观运算符(如点 (.) 和属性标识符 (@) 运算符),用于访问 XML 中的属性 (pro

CSS中filter滤镜学习笔记

1.CSS静态滤镜样式 (filter)(只有IE4.0以上支持)  CSS静态滤镜样式的使用方法:{ filter : filtername( parameters1, parameters2, ...) } Filter样式 简要说明 支持参数 alpha 设置图片或文字的不透明度 opacity.finishOpacity.style.startX.startY.finishX.finishY.add.direction.strength blur 在指定的方向和位置上产生动感模糊效果 a

蓝鸥Unity开发基础——类型转换学习笔记

蓝鸥Unity开发基础--类型转换学习笔记 类型转换包括:自动转换+强制转换 一.自动转换 自动转换:由系统自动完成,不会导致数据精度丢失,只能从低精度类型转换高精度类型. 二.强制转换 强制转换:从高精度转向低精度类型需要强制转换,会丢失精度,需要显式地进行转换. 源代码: using System; namespace Lesson07{    class MainClass    {        public static void Main (string[] args)       

jQuery中的Ajax学习笔记

前段时间学习了<锋利的jQuery第六章>jQuery与Ajax应用,现做如下笔记: 我们先来了解一下,什么是Ajax呢?Ajax全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),它并不是指一种单一的技术,而是有机地利用了一系列交互式网页应用相关的技术所形成的结合体.简短地说,在不重载整个页面的情况下,Ajax通过后台加载数据,并在网页上进行显示. 我们来简要回顾一下Ajax.早在1998年,微软就引入了一个ActiveX控件,从而能

sql中的类型转换---学习

CAST 和 CONVERT 将某种数据类型的表达式显式转换为另一种数据类型.CAST 和 CONVERT 提供相似的功能. 语法 使用 CAST: CAST ( expression AS data_type ) 使用 CONVERT: CONVERT (data_type[(length)], expression [, style]) 参数 expression 是任何有效的 Microsoft? SQL Server? 表达式.有关更多信息,请参见表达式. data_type 目标系统所

深度学习在美团点评推荐平台排序中的应用--学习笔记

写在前面:据说下周就要xxxxxxxx, 吓得本宝宝赶紧找些广告的东西看看 gbdt+lr的模型之前是知道怎么搞的,dnn+lr的模型也是知道的,但是都没有试验过 深度学习在美团点评推荐平台排序中的运用 原创 2017-07-28 潘晖 美团点评技术团队 美团点评作为国内最大的生活服务平台,业务种类涉及食.住.行.玩.乐等领域,致力于让大家吃得更好,活得更好,有数亿用户以及丰富的用户行为.随着业务的飞速发展,美团点评的用户和商户数在快速增长.在这样的背景下,通过对推荐算法的优化,可以更好的给用户

Android中的Telephony学习笔记(2)

上一篇文章中学习了android.provider中Telephony类. 这一篇文章学习android.telephony包中的类,这些类是android提供给上层调用的API. 为监測基本电话信息提供的一系列的API.比如网络类型,连接状态.操作电话号码的工具类. 一共25个类.以下逐一介绍: TelephonyManager 处理设备上的电话服务信息,应用能够使用这些方法检測电话的状态,处理用户的信息类型.也能够注冊一个监听器接受电话状态改变的通知.该类不能直接实例化,能够通过 Conte

Kafka中文文档学习笔记

文档位置: /Users/baidu/Documents/Data/Interview/机器学习-数据挖掘/Kafka 据说是目前见到的最好的 Kafka 中文文章 . Kafka 是一个消息系统,原本开发自 LinkedIn,用作 LinkedIn 的活劢流(activity stream) 和运营数据处理管道(pipeline)的基础. 返种由不可变(immutable)的活动数据组成的高吞吐量数据流代表了对计算能力的一种真正的挑战,因其数据量很容易就可能会比网站中位亍第二位的数据源的数据量

android中读取通讯录学习笔记

1.读取通讯录时一次读取时,尽量少读取所有属性,特别是列表展示的时候,会让你的列表加载速度变得难以忍受,建议先加载少量属性,然后在详情的时候加载所有属性. 2.在读取一类属性的时候,建议用一个游标,且放在循环外面,能明显加快速度,用projection(表示需要查询的列,在下面代码中是CONTACTOR_ION). 示例代码如下: private static final String[] CONTACTOR_ION = new String[]{ ContactsContract.Common