int ival, jval; ival = jval = 0; // ok: each assigned 0 与其他二元操作符不同,赋值操作具有右结合特性。 当表达式含有多个赋值操作符时,从右向左结合。 上述表达式,将右边赋值操作的结果(也就是 jval)赋给 ival。
多个赋值操作中,各对象必须具有相同的数据类型,或者具有可转换)为同一类型的数据类型: int ival; int *pval; ival = pval = 0; // error: cannot assign the value of a pointer to an int string s1, s2; s1 = s2 = "OK"; // ok: "OK" converted to string
5.11. new 和 delete 表达式 使用 new 和 delete 表达式动态创建和释放数组,这两种表达式也可用于动态创建和释放单个对象。 定义变量时,必须指定其数据类型和名字。 而动态创建对象时,只需指定其数据类型,而不必为该对象命名。 取而代之的是,new 表达式返回指向新创建对象的指针,我们通过该指针来访问此对象:
int i; // named, uninitialized int variable int *pi = new int; // pi points to dynamically allocated, unnamed, uninitialized int
这个 new 表达式在自由存储区中分配创建了一个整型对象, 并返回此对象的地址,并用该地址初始化指针 pi。
1. 动态创建对象的初始化 动态创建的对象可用初始化变量的方式实现初始化:
int i(1024); // value of i is 1024 int *pi = new int(1024); // object to which pi points is 1024 string s(10, '9'); // value of s is "9999999999" string *ps = new string(10, '9'); // *ps is "9999999999"
C++ 使用直接初始化(direct-initialization)语法规则初始化动态创建的对象。 如果提供了初值,new 表达式分配到所需要的内存后,用给定的初值初始化该内存空间。 在本例中,pi 所指向的新创建对象将被初始化为 1024,而 ps 所指向的对象则初始化为十个9 的字符串。
编译器隐式执行的任何类型转换都可以由 static_cast 显式完成: double d = 97.0; // cast specified to indicate that the conversion is intentional char ch = static_cast(d); const char *pc_str;