[C++ Primer] 第四章的若干问题

1 指针和typedef

typedef string *pstring;

string str("abc");

const pstring cstr = &str;

上面将pstring定义为string *,然后在定义cstr时在前面添加const,很容易让人以为cstr的类型是const string *,其实它的类型应该是string *const,也就是说它是个const指针,指针的内容不能改变。一般我们在理解typedef时,都将类型直接带到需要的地方,但是,在此处,我们必须理解它的意义,首先,pstring是个指针,因此,在pstring前面加const,它就是个const指针,不能理解为指向const的指针。因此cstr在定义的时候就要进行初始化。


2 允许动态分配空数组

文中说“C++虽然不允许定义长度为0的数组变量,但明确指出,调用new动态创建长度为0的数组是合法的”,那么,我可以这样定义:

int *pint = new int[0];

但是,不能这样定义:

int a[0];
经过在ubuntu上面测试,上面两个表达式都是可以的,因此,这应该与系统的实现有关。


3 使用数组初始化vector对象

之前编程时,要初始化vector为一组数据,往新建的vector中添加元素都是调用的push_back,但是,如果元素过多,就会影响美观,而且也很麻烦,而且在介绍vector构造函数时也没有介绍这种方法:

const size_t arr_size = 6;
int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};
vector ivec(int_arr, int_arr + arr_size);
这样就可以将一个vector对象初始化为一个数组的内容,也可以是部分内容,要注意的是,第二个指针是最后一个元素的下一个位置的指针,这和vector的end迭代器一样。

个人觉得很方便呢,有木有?


4 创建动态数组

在利用new来创建动态数组时,表达式对于不同的类型操作不太一样,或者针对不同的编译器,得到的结果不太一样。

文中说:

string *psa = new string[10];
int *pia = new int[10];
上面的表达式会调用string的默认构造函数,下面的表达式则没有对int数组进行初始化。

这里引用别人的结果(浅谈new int[10];与 new int[10]();的区别?),说明基本类型,int *pia = new int[10]; 这样调用的话,不会对int数组进行初始化,而int *pia = new int[10](); 这样调用的话,int数组是否初始化跟编译器有关。因此,我们应该尽量使用前面这样的方式,即不对int数组进行初始化。

你可能感兴趣的:(C++,C++,Primer,C++)