关于C++中的类型转换操作符

合集下载

VC 中类型转换(CString,TCHAR,string)

VC 中类型转换(CString,TCHAR,string)
本主题演示如何将各种 C++ 字符串类型转换为其他字符串。可以转换的字符串类型包括 char *、wchar_t*、_bstr_t、CComBSTR、CString、basic_string 和 System.String。在所有情况下,在将字符串转换为新类型时,都会创建字符串的副本。对新字符串进行的任何更改都不会影响原始字符串,反之亦然。
AfxMessageBox(buf);
delete(buf);
_bstr_t变量
_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用
_bstr_t bstrVar("test");
const char *buf = bstrVar;///不要修改buf中的内容
AfxMessageBox(buf);
buffer = _fcvt( source, 7, &decimal, &sign );
运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal表示小数点的位置,sign表示符号:0为正数,1为负数
CString变量
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
使用时需加上#include <comdef.h>
例如:
long l=222;
特别是_bstr_t,建议大家使用它。

C语言中的运算符总结解读

C语言中的运算符总结解读

C语言中的运算符总结C语言中的操作符:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。

1.算术操作符:+ - * / %1除了% 操作符之外,其他的几个操作符均可以作用于整数和浮点数。

2对于/ 操作符,如果两个操作数都为整数,执行整数除法;而只要有浮点数执行的就是浮点数除法。

3% 操作符的两个操作数必须为整数,返回的是整除之后的余数。

2.移位操作符: << 左移操作符和 >> 右移操作符(针对二进制位、是对整数的操作1左移操作符移位规则:左边丢弃、右边补0。

2右移操作符移位规则:(1算术移位:左边补符号位,右边丢弃。

(2逻辑移位:左边补0,右边丢弃。

注:对于移位运算符,不能移动负数位,这个是标准未定义的。

3.位操作符:& 按位与 | 按位或 ^ 按位异或(操作数都必须是整数,是针对二进制数的操作4.赋值操作符:= 可以重新为变量赋值(赋值操作符是可以连续使用的,从右向左执行,不建议使用。

5.复合赋值符:+= = *= /= %= >>= <<= &= |= ^=6.单目操作符:! 逻辑反操作(真---假- 负值+ 正值& 取地址从内存中取地址,不能从寄存器register 中取址。

sizeof 操作数的类型长度(以字节为单位~ 一个数的二进制按位取反-- 前置、后置-- ++ 前置、后置++ (1前置++和--:先自增后使用,表达式的值是自增之后的值。

先自减后使用,表达式的值是自减之后的值。

(2后置++和--:先使用再自加。

先使用再自减。

* 间接访问操作符(解引用操作符(类型强制类型转换7.关系操作符:> >= < <= != 不相等 == 相等注:== 相等 = 赋值,二者易混淆,需注意。

8.逻辑操作符:&& 逻辑与|| 逻辑或注:逻辑与、逻辑或是判断真假的,按位与、按位或是对二进制数进行操作的。

static_cast、dynamic_cast、const_cast作用

static_cast、dynamic_cast、const_cast作用

static_cast、dynamic_cast、const_cast作用C-style cast举例:int i;double d;i = (int) d;上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d本身的值并没有发生改变)。

这就是典型的c-style 类型转换。

下面是一个简单的程序:#include <iostream>using namespace std;int main(void){int i;double d = 11.29;i = (int)d;cout << i << endl;cout << d << endl;return 0;}输出结果:1111.29我们发现d值本身并没有发生任何变化。

在简单的情况下,上面这种类型转换可以很好地工作,但在C++中往往还是不够的,为此ANSI-C++新标准定义的四个转换符,即static_cast、dynamic_cast、reinterpret_cast和const_cast。

同时在C++环境中,原先的C-Style的类型转换仍旧可以使用。

1) static_cast用法:static_cast <typeid> (expression)说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。

用途:a)用于类层次结构中基类和派生类之间指针或者引用的转换。

up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。

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

c)可以把空指针转换成目标类型的空指针(null pointer)。

【最新精选】c语言34种运算符

【最新精选】c语言34种运算符

C语言运算符算术运算符TAG:运算符,数据类型TEXT:算术运算符对数值进行算术运算,其中:加、减、乘、除、求余运算是双目运算。

其结果可以是整数、单精度实数和双精度实数。

自增、自减运算是单目运算,其操作对象只能使整型变量,不能是常量或表达式等其他形式。

REF: .TXT,+运算符.txt,-运算符.txt,*运算符.txt,/运算符.txt,%运算符,++运算符,-- 运算符加+TAG:算术运算符,运算符,数据类型TEXT:双目运算符,算数加法。

单目运算符,表示正数。

REF: .TXT,算数运算符.txt减-TAG:算术运算符,运算符,数据类型TEXT:双目运算符,算数减法。

单目运算符,表示负数。

REF: .TXT,算数运算符.txt乘*TAG:算术运算符,运算符,数据类型TEXT:*,双目运算符,算数乘法。

REF: .TXT,算数运算符.txt除/TAG:算术运算符,运算符,数据类型TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。

如5.0/2等于2.5,而5/2等于2。

REF: .TXT,算数运算符.txt取余%TAG:算术运算符,运算符,数据类型TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。

如5.0/2等于2.5,而5/2等于2。

REF: .TXT,算数运算符.txt自加++TAG:算术运算符,运算符,数据类型TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数增1。

REF: .TXT,算数运算符.txt自减--TAG:算术运算符,运算符,数据类型TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数减1。

REF: .TXT,算数运算符.txt关系运算符TAG:算数运算符,运算符,数据类型TEXT:关系运算符用于对两个操作数的比较,包括:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、!= (非等于)、==(等于)。

C语言中的类型转换-1L1UL

C语言中的类型转换-1L1UL

C语言中的类型转换-1L1ULC语言中的类型转换C语言中的类型转换有两种,自动与强制。

它们都有几种情况,如不同长度的转换;不同类型的转换;还有无符号与有符号数之间的转换。

关键是两点,即长度不同时如何转换,在有无符号数参与时如何转换。

一般的处理方式是长变短时作一个简单的截短操作,内存的对齐方式影响这个结果。

短的变长时,与符号有关,如果是有符号数,则有两种可能,符号扩展或简单地提升(即高位补0)。

这个C标准没有定义,取决于编译器。

所以,在将短的数据转换为长的数据时,最好是用强制的转换。

无符号数就没关系了,结果是一样的。

1.强制类型转换具体形式如下:(类型)表达式这个出错的机会比较小一点,因为由程序员自己控制。

但要注意的,在对指针转换时,如果将一个指向一个较小内存单元的指针转换为一个指向较大内存单元的指针,就会破坏其它内存单元的数据。

这个在自动转换中也有,故在下面一起描述。

强制转换一般是在将一个空指针赋给一个在类型的指针时的操作,如在malloc()操作时。

2.自动类型转换这是最容易出错的,因为C语言对类型的检查比较少,这样设计的好处是给程序员提供编程上的方便,但任何事情都有两面性,自动类型转换有不少副作用。

我们先来看一下自动转换在什么时候发生:1)表达式求值2)赋值3)函数调用这几种转换的细节都可以参考《C程序设计语言》(The C Programming Language, BrianW.Kernighan, Dennis M.Ritchie)一是有无符号数参与的表达式计算C语言中对这个没有规定,取决于实现。

看下面这个例子:#include <stdio.h>int main(void){long a;unsigned short b;unsigned long c, d;short e;a = -1L;b = 1U;d = a + b;printf("a = %dL, b = %uU, d = %uUL, a>b = %d\n",a, b, d, a > b);a = -1L;c = 1UL;d = c + a;printf("a = %dL, c = %uUL, d =%uUL, a>c = %d\n", a, c, d, a > c);e = -1;c = 1UL;d =e + c;printf("e = %d, c = %uUL, d =%uUL, e>c = %d\n", e, c, d, e> c);}运行结果如下(在我的环境中compaq Tru64, cc)a = -1L,b = 1U, d = 0UL, a>b = 0a = -1L, c = 1UL, d =0UL, a>c = 1e = -1, c = 1UL, d =0UL, e>c = 1我们不难发现,在比较操作中,将无符号的短整数扩展为了有符号的长整型。

c 强制类型转换 const

c 强制类型转换 const

c 强制类型转换 const
在C语言中,强制类型转换是一种将一个数据类型转换为另一
个数据类型的操作。

在进行强制类型转换时,我们可以改变一个变
量的数据类型,以便在表达式中使用该变量。

在进行强制类型转换时,我们可以使用强制类型转换运算符来实现,它的一般形式是(type_name) expression,其中 type_name 是我们希望将expression 转换为的类型。

在进行强制类型转换时,我们需要注意
以下几点:
1. 强制类型转换可能会导致数据丢失,当我们将一个较大的数
据类型转换为一个较小的数据类型时,可能会导致数据丢失。

例如,将一个浮点数转换为整数时,小数部分将被截断。

2. 强制类型转换可能会改变数据的含义,有时候,我们可能会
将一个数据类型转换为另一个数据类型,这可能会改变数据的含义。

例如,将一个指针转换为整数,可能会丢失指针所指向的对象的信息。

当我们进行 const 强制类型转换时,我们可以使用
const_cast 运算符来实现。

const_cast 是 C++ 中的一个运算符,
它可以用来移除对象的 const 属性,从而允许修改被 const 修饰的对象。

但是需要注意的是,对于 const 对象,我们应该谨慎地使用 const_cast 运算符,因为这可能会导致未定义的行为。

总的来说,强制类型转换是一种有用的工具,但是在使用时需要谨慎,以避免可能导致的数据丢失和未定义的行为。

c语言中十六进制和unsigned char转化

在C语言中,我们经常会涉及到关于十六进制和unsigned char类型的转化。

这些概念在编程中是非常基础而重要的,因此我们有必要对它们进行全面的评估和深入探讨。

让我们从简单的概念开始。

1. 十六进制在C语言中,我们可以使用0x前缀来表示一个十六进制数。

十六进制数由0-9和A-F(或a-f)组成,表示十进制数0-15。

举个例子,0x10表示16,0xFF表示255。

在C语言中,我们可以使用十六进制数来表示内存位置区域或者进行位操作。

2. unsigned char类型在C语言中,char类型表示一个字节的数据,而unsigned char类型则表示无符号的一个字节数据。

它们通常用来表示字节数据或者进行字节操作。

在编程中,我们经常会遇到需要转化为unsigned char类型或者从unsigned char类型中获取数据的情况。

接下来,让我们深入探讨这些概念在实际编程中的应用。

3. 十六进制和unsigned char的转化在C语言中,我们经常需要将一个十六进制数转化为unsigned char 类型,或者将一个unsigned char类型的数据按照十六进制的格式进行输出。

这在网络编程、加密解密、数据处理等方面都是非常常见的操作。

当我们需要将一个十六进制数转化为unsigned char类型时,我们可以使用C语言中的位操作符和移位操作来实现。

对于十六进制数0xAB,我们可以通过移位操作将其转化为unsigned char类型。

4. 实际应用在网络编程中,我们经常需要处理二进制数据,而unsigned char类型通常用来表示字节数据。

在这种情况下,我们可能会遇到需要将十六进制数转化为unsigned char类型的情况。

当我们从网络中接收到unsigned char类型的数据时,可能需要将其按照十六进制的格式进行输出,以便进行调试或者日志记录。

5. 个人观点与理解对于我个人而言,对于这些概念的理解和掌握是非常重要的。

c语言类型转换运算符

c语言类型转换运算符
C语言中的类型转换运算符是一种用于将一个数据类型转换为另一个数据类型的运算符。

它的作用是将一个数或变量的数据类型从一种数据类型转换成另一种数据类型,例如将一个整型变量转换成浮点型变量或将一个字符型变量转换成整型变量。

C语言中的类型转换运算符有两种:强制类型转换和隐式类型转换。

强制类型转换是由程序员手动指定的类型转换,而隐式类型转换是自动进行的类型转换。

强制类型转换的语法格式为:(目标类型)表达式。

其中目标类型是要转换的类型,表达式是要转换的表达式。

例如,将一个整型变量a转换成浮点型变量b的语句为:b = (float)a;
隐式类型转换是在程序编译时自动进行的类型转换。

它是由编译器根据表达式的数据类型自动进行的类型转换。

例如,当将一个整型变量和一个浮点型变量相加时,编译器会将整型变量自动转换成浮点型变量,然后再进行相加操作。

需要注意的是,在进行类型转换时,可能会出现精度丢失或溢出等问题。

因此,在进行类型转换时,需要谨慎处理,避免出现错误。

- 1 -。

c语言45个标准运算符

c语言45个标准运算符1.赋值运算符:用于将一个值赋给变量,例如:`=`。

2.算术运算符:用于执行基本的算术运算,例如:`+`(加法)、`-`(减法)、`*`(乘法)、`/`(除法)等。

3.自增和自减运算符:用于对变量进行加一或减一操作,例如:`++`(自增)、`--`(自减)。

4.关系运算符:用于比较两个值之间的关系,例如:`>`(大于)、`<`(小于)、`>=`(大于等于)、`<=`(小于等于)等。

5.相等运算符:用于判断两个值是否相等,例如:`==`(等于)、`!=`(不等于)。

6.逻辑运算符:用于连接多个条件的逻辑运算,例如:`&&`(逻辑与)、`||`(逻辑或)、`!`(逻辑非)。

7.位运算符:用于对二进制位进行操作的运算符,例如:`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位取反)等。

8.移位运算符:用于将二进制位进行左移或右移操作,例如:`<<`(左移)、`>>`(右移)。

9.条件运算符(三元运算符):用于根据条件选择执行不同的操作,例如:`? :`。

10. sizeof运算符:用于返回一个变量或数据类型的字节大小,例如:`sizeof(int)`。

11.类型转换运算符:用于将一个变量强制转换为另一个数据类型,例如:`(int)`。

12.选择运算符:用于根据条件选择执行不同的操作,例如:`switch`、`case`。

13.逗号运算符:用于连接多个表达式,并且整个表达式的值为最后一个表达式的值,例如:`a, b, c`。

14.取地址运算符:用于获取变量的内存地址,例如:`&`。

15.解引用运算符:用于获取指针所指向的存储单元的值,例如:`*`。

16.条件表达式运算符:用于根据条件选择执行不同的操作,例如:`expression1 ? expression2 : expression3`。

编程语言中的数据类型转换方式

编程语言中的数据类型转换方式在编程领域中,数据类型转换是一个非常重要的概念。

它涉及到将一个数据类型的值转换为另一个数据类型的值,以满足特定的需求或操作。

不同的编程语言提供了各种不同的数据类型转换方式,本文将探讨其中一些常见的方式。

1. 隐式类型转换隐式类型转换是指在某些情况下,编程语言会自动将一种数据类型转换为另一种数据类型,而无需显式地指定转换操作。

这种转换通常是根据编程语言的规则和类型系统来执行的。

例如,在大多数编程语言中,将一个整数和一个浮点数相加时,整数会被隐式地转换为浮点数,以便进行计算。

2. 显式类型转换与隐式类型转换相反,显式类型转换需要明确地指定要进行的转换操作。

这通常通过使用一些特定的语法或函数来实现。

例如,在C语言中,可以使用强制类型转换操作符来将一个数据类型转换为另一个数据类型。

这种转换需要开发人员明确地指定要进行的转换操作,并且需要注意潜在的类型不匹配问题。

3. 数值类型转换数值类型转换是指将一个数值类型转换为另一个数值类型的过程。

在编程中,常见的数值类型包括整数、浮点数和双精度浮点数等。

数值类型转换通常涉及到精度损失的问题,因为不同的数值类型具有不同的表示范围和精度。

在进行数值类型转换时,开发人员需要考虑到这些潜在的问题,并根据具体的需求选择合适的转换方式。

4. 字符串类型转换字符串类型转换是指将一个字符串类型转换为另一个字符串类型的过程。

在编程中,字符串是一种常见的数据类型,用于表示文本和字符序列。

字符串类型转换通常涉及到将字符串转换为整数或浮点数等数值类型,或者将数值类型转换为字符串类型。

这种转换可以通过使用一些特定的函数或方法来实现。

5. 自定义类型转换除了基本的数据类型转换之外,一些编程语言还允许开发人员定义自己的类型转换规则。

这通常涉及到创建自定义的转换函数或方法,并且需要开发人员明确地指定要进行的转换操作。

自定义类型转换可以帮助开发人员实现特定的业务逻辑和需求,提高代码的可读性和可维护性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于C++中的类型转换操作符内容简介:本文对四种标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast 进行了介绍,通过本文应当能够理解这四个类型转换操作符的含义。

四种标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。

dynamic_cast:动态类型转换,一般用在父类和子类指针或应用的互相转化;static_cast:静态类型转换,一般是普通数据类型转换(如int m=static_cast<int>(3.14)); reinterpret_cast:重新解释类型转换,很像c的一般类型转换操作;const_cast:常量类型转换,是把cosnt或volatile属性去掉。

下面将依次对它们进行相对详细地介绍。

主要内容:一、static_cast二、dynamic_cast三、reinterpret_cast四、const_cast五、其它一、static_cast=====================支持子类指针到父类指针的转换,并根据实际情况调整指针的值,反过来也支持,但会给出编译警告,它作用最类似C风格的“强制转换”,一般来说可认为它是安全的。

用法:static_cast < type-id > ( expression )[功能]该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。

[描述]主要如下几种用法:(a)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

进行上行转换(把派生类的指针或引用转换成基类表示是安全的;进行下行转换(把基类指针或引用转换成派生类表示时,由于没动态类型检查,所以是不安全的。

(b)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。

这种转换的安全性也要开发人员来保证。

(c)把空指针转换成目标类型的空指针。

(d)把任何类型的表达式转换成void类型。

注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

[举例]这里,关于static_cast的使用举例,通过与reinterpret_cast的例子进行对比,容易理解,所以参见后面reinterpret_cast的使用举例部分中对static_cast的使用方法。

二、dynamic_cast=====================用法:dynamic_cast < type-id > ( expression )[功能]该运算符把expression转换成type-id类型的对象,Type-id必须是类的指针、类的引用或者void *。

[描述]支持子类指针到父类指针的转换,并根据实际情况调整指针的值,和static_cast不同,反过来它就不支持了,会导致编译错误,这种转换是最安全的转换。

如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

[举例]1)在类层次间进行转换代码如下:class B{public:int m_iNum;virtual void foo();};class D:public B{public:char *m_szName[100];};void func(B *pb){D *pd1 = static_cast<D *>(pb);D *pd2 = dynamic_cast<D *>(pb);}这里可见,使用dynamic_cast进行转换,如果出现了把指向父类对象的指针,转换成了子类的指针的时候,就会返回空值。

在上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针。

另外要注意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。

这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。

2)类之间的交叉转换代码如下:class A{public:int m_iNum;virtual void f(){}};class B:public A{};class D:public A{};void foo(){B *pb = new B;pb->m_iNum = 100;D *pd1 = static_cast<D *>(pb); //compile error???实践好象没有编译错误D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULLdelete pb;}这里,可见,如果出现了交叉转换的情况那么dynamic_cast将会返回空值。

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用dynamic_cast 的转换则是允许的,结果是空指针。

三、reinterpret_cast=====================用法:reinterpret_cast<type-id> (expression)[功能]它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。

[描述]reinterpret_cast是C++里的强制类型转换符,支持任何转换,但仅仅是如它的名字所描述的“重解释”而已。

也就是说:操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。

例如:int *n= new int;double *d=reinterpret_cast<double*> (n);在进行计算以后, d包含无用值.这是因为reinterpret_cast仅仅是复制n的比特位到d, 没有进行必要的分析。

reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。

我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的(C++编程思想中的原话)。

将static_cast和reinterpret_cast对比一下进行解释,比较容易理解:static_cast 和reinterpret_cast 操作符修改了操作数类型,但是reinterpret_cast 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。

例如:int n=9;double d=static_cast<double>(n);上面的例子中, 我们将一个变量从int转换到double。

这些类型的二进制表达式是不同的,所以将整数9转换到双精度整数9,static_cast需要正确地为双精度整数d补足比特位。

其结果为9.0。

而reinterpret_cast 的行为却不同:int n=9;double d=reinterpret_cast<double & >(n);这里, 和static_cast不同,在进行计算以后, d包含无用值。

这是因为reinterpret_cast仅仅是复制n的比特位到d, 没有进行必要的分析.因此, 需要谨慎使用reinterpret_cast。

[举例]这个例子,将static_cast和reinterpret_cast对比进行测试,具体的输出参见其中的注释。

1 #include <iostream>2 using std::cout;3 using std::endl;4 class CBaseX5 {6 public:7 int x;8 CBaseX() { x = 10; }9 void foo() { printf("CBaseX::foo() x=%d/n", x); }10 };11 class CBaseY12 {13 public:14 int y;15 int* py;16 CBaseY() { y = 20; py = &y; }17 void bar() { printf("CBaseY::bar() y=%d, *py=%d/n", y, *py);}18 };19 class CDerived : public CBaseX, public CBaseY20 {21 public:22 int z;23 };2425 int main(int argc, char *argv[])26 {27 float f = 12.3;28 float* pf = &f;2930 //基本类型的转换31 cout<<"=================Basic Cast================="<<endl;32 //======static cast<>的使用:33 int n = static_cast<int>(f); //成功编译34 cout<<"n is :"<<n<<endl;//n = 1235 //int* pn = static_cast<int*>(pf);//编译错误,指向的类型是无关的,不能将指针指向无关的类型36 void* pv = static_cast<void*>(pf);//编译成功37 int* pn2 = static_cast<int*>(pv);//成功编译, 但是*pn2是无意义的内存(rubbish)38 cout<<"pf is:"<<pf<<",pv is:"<<pv<<",pn2 is:"<<pn2<<endl;//三者值一样39 cout<<"*pf is:"<<*pf<<",*pn2 is:"<<*pn2<<endl;//pf=12.3,pn2是无用值,注意无法使用"*pv"因为编译错。

相关文档
最新文档