第3章 C++数据类型
1,变量初始化
C++支持两种变量初始化形式。
形式1:使用显式的赋值符号
int ival = 1024;
string str = "string";
形式2:隐式赋值,初值置于括号内
int ival(1024);
string str("string");
每个内建数据类型都支持一种特殊的构造函数语法将对象初始化为0
如:
// ival, dval分别被设置成0和0.0
int ival = int();
double dval = double();
2.为了清晰起见,定义指针时候,一般将*靠近变量名,而不是类型。
如: float fp, *fp2;
3.一个指针变量不能存放一个非地址值,也不能被赋予其它不同类型对象的地址
值。
void* 类型的指针可以被赋予除函数指针外的任何数据类型的指针值。
4.const限定符
(a)假设有如下定义:
const double cdval = 3.50;
double *ptr = (double*)&cdval;
我们不能直接修改cdavl的值,但是可以通过ptr来间接修改。如:
*ptr += 0.5;
(b)假设定义了常量pi
const double pi = 3.14159;
以下赋值哪个是合法的?
1. double *pb = π
2. double *const cpb = π
3. const double *pcb = π
4. const double *const pcdc = π
5. const double *&prcd = π
6. double *const &prdc = π
7. const double *const &prcdc = π
(1)不合法,&pi为指向const double的指针,而左边是double *, 不能从
const double* ----->double*. 反过来则可以,即限定符少的可以向限定符多的
转(当然这里限定符应当兼容)。
(2)不合法。不能完成转化const double*----->double *const 。
(3)、(4)均为合法。因为赋值号左边分别为const double* 和
const double*const 包含右边的类型,所以类型兼容。
(5)不合法。不能完成转化const double* ---->const double*&. 因为=右边&pi
此时是个指针常量,所以=左边的应用应该是一个指向一个常量指针的引用,指向
的常量指针又是指向一个const double对象。所以=号左边的引用应该为
const double *const& prcdc = &pi即式(7).
(6)不合法。不能完成转化const double* ---->double *const&.
(7)合法。 已经在(5)中解释。
5.引用(reference)
引用允许象指针一样间接操作对象,但不需要使用指针的特定语法。
关于引用应该注意:
(a)引用必须被初始化。
(b)一旦定义了引用,该引用不能再被指向另一个对象。
(c)所有作用与引用的操作都实际地作用于它所指的对象上,而不是引用本身。
(d)不允许定义引用数组。
(e)一个指向引用的指针是不合法的。
6.typedef
typedef char *cstring;
extern const cstring cstr;
这里cstr的类型是什么?const char *cstr吗?
答案是否。
cstr的类型应该是char *const.
const修饰cstr的类型,cstr是一个指针,所以上述声明表示的意思是:声明一个
const 指针cstr,它指向一个char对象.
7.volatile
使用volatile限定符的一个重要目的是通知编译器,对象可以以编译器检测不到
的方式改变。因此,编译器不会强制优化与此对象(volatile修饰的对象)相关的
代码。
8.this指针
this指针在类内部被自动设置成能寻址左边类对象的指针,这个成员函数通过左
边对象被调用。如:
obj.fun(); // 假设obj是某个类的对象,fun()是该类的一个公有函数。
这里this指针就被自动设置成指向obj对象的指针。
通过*this我们可以访问到由this指向的实际对象(这里是obj)。