1.左值和右值
变量和文字常量都有存储区,其区别在于变量是可寻址的.对于每一个变量,有两个值与之相关.
1)它的数据值,存储在某个地址中,也称为对象的右值.可以认为右值是被读取的值.文字常量和变量都可以作为右值.
2)它的地址值,即存储数据值的内存的地址,也称为对象的左值.可以认为左值是位置值,文字常量不能做左值.
2.对象的初始化
c++支持两种形式的初始化.
第一种使用赋值操作符显式初始化,如int ival=1024;
第二种将初始值放在()中隐式初始化,如 int ival(1024);
另外,每种内置数据类型都支持一种特殊的构造函数语法,将对象初始化为0, 如 int ival= int();
3.5const修饰符
const int *pc=0;//pc指向的对象是常量,pc本身可变
int* const pc=&i;//pc是常量,pc指向的对象可变
3.6引用
1)引用在内部存放的是一个对象的地址,它是该对象的别名.
2)对于不可寻址的值,如文字常量或者不同类型的对象,编译器为了实现引用,必须引入一个临时对象,引用指向的实际上是这个临时对象.例如
dval是double类型,与引用类型不同,所以引入临时变量,按如下方式实现引用
如果ri没有const限定,对ri所作的改变都是对temp做的,dval没有变化,为了使这种行为看上去显得合理,需要对ri加上const限定.
3)const限定引用的例子
int ival=0;
int* const &refi= &ival;//&ival是个常量,但ival的值是可变的
const int ival=0;
const int* const &refi= &ival;//&ival是个常量,ival也是个常量
3.9数组
1.数组初始化:初始化值过多会报错,初始化值不够,空余的位置会自动初始化为0.
3.10Vector容器类型
1.数组用法
vector ivec1(10);//定义一个10个成员的整形数组,vector成员被初始化为和其类型相关的缺省值
vector ivec2(10, -1);//也可以显式初始化为指定值
int ia[10]={1,2,3,4,5,6,7,8,9,0};
ia[2] = ivec[2];//用下标方式访问vector成员
vector ivec3(ia, ia+6);//用数组或数组的一部分初始化,ia,ia+1,...ia+5
vector svec;
vector svec1(svec);//用另一个vector初始化
svec = svec1;//赋值
2.STL用法
string word;
vector svec;//定义空vector
svec.push_back(word);//插入元素
word = svec[0];//下标访问
vector::iterator it;//更为典型的访问方式是定义迭代器,可以像指针一样操作it
it=svec.begin();//通过vector的begin().end()操作来控制访问
3.12 typedef
一个常见的错误理解
typedef char* cstring;
extern const cstring cstr;
对于cstr,经常被错误理解为宏展开
extern const char* cstr;//error
const修饰的是cstring,cstring是一个指针,因此正确的理解是
extern char* const cstr;
3.13 volatile
volatile修饰变量类型,说明变量是易变的,编译器不能擅自作出优化,所以每次都要重新从内存取变量的值.
阅读(1314) | 评论(0) | 转发(0) |