变量

  内置类型

  1、在C++中,类型的定义基本和C语言的相同,只是有一些不同。在C++中,根据C++ Primer中所讲,main()函数的返回类型必须是int型。这个没有亲自验证过,或者说曾经遇到但是没有注意。估计使用不同的编译器结果是不一样的吧,有些编译器会对C++的标准进行扩展。而且空格符不允许出现在预处理指示中。

  2、在内置类型中遇到的第一个问题是bool类型到底占了多大的存储空间。这个是C++标准未定义的,编译器可以根据自己的想法规定bool类型所占据的存储空间。

  3、C++中有一种类型叫wchar_t,叫宽字符。是对char类型的扩展,占有两个字节的存储空间。宽字符字符串表示为L”hello world”。其中,连接字符串字面值和宽字符串字面值,其结果是未定义的,这样的程序可能会执行,崩溃或者产生没有用的值,在不同的编译器下程序的结果可能会不同。

  4、C++中初始化有两种方法:一种是直接初始化,如int val(1024);另一种是复制初始化,如int val=1024。

  5、extern关键字表示声明变量而不是定义变量。只有当extern声明位于函数外部时,才可以含有初始化式。

  6、局部变量可以屏蔽全局变量,而不是平常认为的重复定义,只有在同一个作用域中的同名定义变量才会被编译器认为是重复定义。

  7、非const变量定义在全局作用域中,如果做了合适的声明,可以在另外的文件中使用。即,在全局作用域定义非const变量时,它可以在整个程序中访问,方法是在一个文件中定义,在另一个文件中用extern声明即可。而全局的const变量是定义该对象的文件的局部变量,中存在于那个文件中。不能被其他文件访问,若指定其为extern可以全部访问了。这个在C++ primer中我感觉是一句废话。其根源是非const变量默认是extern的。const类型在定义时必须初始化。

  8、引用必须用与该引用同类型的对象初始化。const引用时指向const对象的引用。非const引用只能绑定到与该引用同类型的对象;const引用则可以绑定到不同但相关的类型的对象或绑定到右值。如:

double dval=3.14;
const int &ri=dval;

  编译器会默认将其转换为:

int temp=dval;
const int &ri=temp;

  9、若ri为非const,则修改ri只是改变了temp,而为改变dval。所以仅允许const引用绑定到需要临时使用的值是完全必要的。头文件中可以定义类,值在编译时可以知道的const对象和inline函数。当const对象是由常量表达式初始化时,要放在头文件中;相反,要放在源文件中,并在其它文件中添加extern。

  标准库类型

  1、迭代器iterator中,vector对象ivec.end(); 返回的是末端元素的下一个地址。

  2、使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来修改其指向的元素的值,可以对迭代器进行自增一级使用解引用来读取值,但不能对该元素进行赋值。

  3、const iterator只能用它来改写指向的元素,不能使它指向其他元素,且必须进行初始化。

  4、任何改变vector长度的操作都会使已存在的迭代器失效。

  数组和指针

  1、在函数体外定义的数组,其元素均初始化为0;在函数体内定义的内置类型的数组,其元素无初始化。不管数组定义在哪里,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化。数组是不允许直接复制和赋值的。

  2、指针和引用的区别:①引用总是指向某个对象,定义引用时没有初始化是错误的。②给引用赋值时改变的是引用所关联的对象的值,而不是使引用与另一个对象关联。

  3、不允许一个非const对象指针指向一个const对象。允许吧非const对象地址赋值给一个指向const对象的指针。