C++中的操作符属性

C++中的操作符属性列表如下:

 

优先级

名称

符号

左值/右值

结合性

说明

1

全局作用域

::

C++

类作用域

::

C++

命名空间

::

C++

2

括号

()

同表达式

C/C++

函数调用

()

C/C++

下标

[]

C/C++

成员访问

.

C语言中代表结构体,c++中是类

指针成员访问

->

C语言中代表结构体,c++中是类

3

后自增

++

 

返回的是右值

后自减

--

 

返回的是右值

类型ID

typeid

 

运行时类型ID

typeid

 

显示强制类型转换

Dynamic_cast

static_cast

Reinterpret_cast

Const_cast

运行时识别指针或引用

普通类型转换

强制不能转换的类型进行转换

转换掉const属性

4

求类型大小

sizeof

以一个字节为单位,判断表达式时不需要对表达式求值,例如:sizeof(a=b+1),sizeof不能用于函数类型,不完全类型或者位字段或者void类型

前自增

++

不定

C中是右值,c++中是左值

前自减

--

不定

C中是右值,c++中是左值

位取反

         ~

 

逻辑非

 

一元正/负

+/-

 

解引用

*

 

取地址

&

 

类型转换

()

类型等级排名(无符号>有符号)

创建对象

new

如果new操作符申请空间不足,会抛出bad_alloc的异常

释放对象

delete

必须释放是由new申请的内存空间,但是释放值为0的指针是安全的,一旦delete一个指针,该指针便为悬垂指针,应立即设置为0

5

指向成员操作的指针

->*

 

 

.*

 

 

6

乘/除/求余

*/ / /%

计算时注意越界,要用类型转换

7

加/减

+/-

 

8

左/右移位

<</>>

对于无符号数的算术右移是不可移植的,右操作数不能是负数,而且必须严格小于左操作数的位数

9

关系操作符

>/>=/</<=

C语言产生整型,c++产生bool型,不能串接

10

相等/不等

=/!=

C语言产生整型,c++产生bool型

11

位与

&

 

12

位异或

^

 

13

位或

|

 

14

逻辑与

&&

短路求值

15

逻辑或

||

短路求值

16

条件表达式

?:

短路求值,两个表达式只求一个,可以直接在输出表达式中使用

17

各种赋值

……

复合赋值操作符先将右侧的完整求值再与左边运算,赋值操作符的左操作数必须是非const的左值

18

抛出异常

throw

 

19

逗号

逗号表达式不能为空,优先级最低的,如果赋值的话,必须用括号括起来,逗号操作符的结果是其最右边的表达式,其属性也与最右边的属性一致

<分析>:

(1)左值意味着一个位置,右值意味着一个值

(2)优先级、结合性只决定相邻两个操作符的执行顺序,同一个操作符的左右操作数的执行顺序无法确定

(3)对于同一个双目操作符,我们没办法知道是先计算左边的表达式,还是先 计算右边的 表达式,不可移植。尤其是自增、自减这类操作符出现就会存在副作用。但是&&,||,条件表达式,逗号表达式都规定了求值顺序

(4)各个不同的类型的值不能进行相互计算,必须先转换成相同类型的值。

(5)对于自增和自减操作符,最后使用前置操作符,因为前置操作符需要做的工作更少,加1后自动返回,而后置操作符先需要保存原来的值,以便返回未加1之前的值。

(6)因为同一个操作符的左右操作数计算先后顺序未定,所以尽量不要在同一个语句中多次使用同一个操作数,可以分成几条独立的语句使用,尤其是自增自减操作符,不要在一个表达式中多次对同一个对象作自增自减操作。


C++实现属性 本文译自http://www.codeguru.com/cpp_mfc/Property.html的Implementing a Property in C++ 以下是译文 本文由Emad Barsoum投稿。 开发测试环境:Visual C++ 7.0, Windows XP sp1, Windows 2000 sp3 摘要 本文试着在C++不使用任何扩展技术模拟C#(或其他语言属性特征。大多数在C++实现属性的库和编译器使用扩展技术,如Managed C++C++ Builder,或者他们使用如通常函数的set和get方法,但那不是属性。 详述 我们首先看一下什么是属性。一个属性表现为一个字段或者成员变量,但它通过read和write方法或者get和set方法暗操作变量。 例如,若存在类A和它的属性Count,我可以写如下的代码: A foo; Cout << foo.Count; 实际上Count调用它的get函数返回当前的变量。你可以将属性定为只读(你可以读取它但不能修改它)、只写或者可读写,这就是使用属性而不直接使用变量的的一个最大好处了。好了,让我们开始来实现它: 我们需要能做如下的事: int i = foo.Count; //--调用get函数得到 foo.Count = i; //-- 调用set函数设定 因此,很明显的我们需要重载 = 操作符使其能设定变量的,同时也要重载该属性的返回(在下面我们将会看到的)。 我们将实现一个称为property的类,它做的就像一个属性,声明如下: template class property {} 这个模板类表示的是我们的属性。Container是我们要在其包含属性的类变量,set和get方法以及属性的类的类型。ValueType是内部变量即要定义的属性的类型,nPropType定义属性的读写标志:只读、只写或可读写。 现在我们需要一个指向从包含属性的类Container到属性类property的set和get方法的指针,同时重载 = 操作符以使得属性能象变量起那样作用。现在我们来看property类的全部定义 #define READ_ONLY 1 #define WRITE_ONLY 2 #define READ_WRITE 3 template class property { public: property() { m_cObject = NULL; Set = NULL; Get = NULL; } //-- 将m_cObject指向包含属性的container类 -- void setContainer(Container* cObject) { m_cObject = cObject; } //-- 设定可改变属性的set成员函数 -- void setter(void (Container::*pSet)(ValueType value)) { if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE)) Set = pSet; else Set = NULL; } //-- 设定可检索属性的get成员函数 -- void getter(ValueType (Container::*pGet)()) { if((nPropType == READ_ONLY) || (nPropType == READ_WRITE)) Get = pGet; else Get = NULL; } //-- 重载 = 号操作符使其能用set成员设定属性-- ValueType operator =(const ValueType& value) { assert(m_cObject != NULL); assert(Set != NULL); (m_cObject->*Set)(value); return value; } //-- 使属性类能转换为内部类型成为可能-- operator ValueType() { assert(m_cObject != NULL); assert(Get != NULL);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>