1、关于变量的初始化:如果一个变量在全局内定义的,那么系统会保证给他提供初始值0.如果变量在局部内定义的,或是通过new表达式动态分配的,则系统不会向他提供初始值0.这些对象被称为未初始化的。未初始化的对象不是没有值,而是他得值是未定义的。(与它相关联的内存区中含有一个随机的位串,可能是以前使用的结果。)
因为未初始化对象是个常见的错误,而且很难发现,所以,一般建议为每个被定义的对象提供一个初始值。
2、vector有两种使用风格:
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
___数组风格(定义时确定大小):
vector<int> vec(10);
这与用int ia 相似,都可以用下表方式访问,vec ia
___STL风格(定义时是空的,不确定大小的):
vector<string> text;
string word;
while(cin 》 word){
text.push_back(word);
}
for(vector<string>::iterator it = text.begin(); it!=text.end(); ++it){
cout 《 *it 《 ' ';
}
___不要混用两种风格:
------------------------------------------------
vector<int> vec;
定义一个空vector,再写出这样的语句:
vec[0] = 1024;
就是错误的,因为vec还么有第一个元素
------------------------------------------------
类似的,当我们定义一个给定大小的vector时,例如:
vector<int> vec(10);
任何一个插入操作都将增加vec的大小,而不是覆盖某个现在的元素。
如果执行vec.push_back(1024),那么vec的长度会增加到11,也就是说刚刚插入的元素1024是vec的第11个元素。
------------------------------------------------
3、sizeof是操作符,类似于"+="、"&"、"++"等,而不是一个函数
[cpp]
在CODE上查看代码片派生到我的代码片
int ia[] = {1.2.3};
//返回整个数组的大小,而不是数组中元素的个数
size_t array_size = sizeof ia;
//sizeof int 返回int类型的大小,下面这句返回的是数组中元素的个数
size_t element_size = array_size/sizeof(int);
但下面这种情况则是返回指针的大小,而不是数组的长度,更不是数组中元素的个数
int *pi = new int ;
size_t pointer_size = sizeof(pi);
4、关于new、delete、vector
[cpp]
在CODE上查看代码片派生到我的代码片
vector<string> svec(10);//合法
vector<string> *pvec1 = new vector<string>(10);//合法
vector<string> **pvec2 = new vector<string> ;//非法,new返回的是指针类型(*),而不是指向指针的指针类型(**)
vector<string> *pvec3 = new vector<string> ;//合法
vector<string> *pv1 = &svec;
vector<string> *pv2 = pvec1;
delete svec;//非法,不能delete非new的
delete pvec1;//合法
delete [] pvec2;//合法
delete [] pvec3;//合法
delete pv1;//合法
delete pv2;//合法
5、数组的长度必须是const的,不同的编译器对int ia[0]的解释不同,有正确也有错误。
vector、list等容器的长度可以使常量const,也可以是非常量。
6、string的查找返回i值:
[cpp]
在CODE上查看代码片派生到我的代码片
string st("abcdabc");
string::size_type pos = find(st);
7、如果函数已经声明为inline(内联),则函数体可能已经在编译期间它的调用点就被展开。如果没有被声明为inline,则函数在运行时才被调用。
8、在C++函数传递参数时,数组永远不会按值传递。他是传递第一个元素(准确的说是第0个)的指针,下面三个声明是等价的:
[cpp]
在CODE上查看代码片派生到我的代码片
void putValues(int*);
void putValues(int []);
void putValues(int );
9、缺省情况下,函数的返回值是按值传递的(passed by value),这意味着得到控制权的函数将接受返回语句中指定的表达式的拷贝。
该缺省行为可以被改变。一个函数可以被声明为返回一个指针或者一个引用。
如果返回的是一个大型对象,用引用或指针返回类型比按值类型返回类对象效率要高得多。在某些情况下,编译器自动将按值返回转换到按引用返回。该优化被称为"命名返回值优化".
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
//当声明一个返回引用的函数时,当返回一个指向局部对象的引用。
//局部对象的声明周期随函数的结束而结束。
//在函数结束后,该引用变成未定义的内存的别名。
//问题:返回一个指向局部对象的引用
Matrix & add(Matrix &m1, Matrix &m2)
{
Matrix res;
……//对m1和m2进行加操作
//返回之后,结果指向了一个有问题的位置
return res;
}
//在这种情况下,返回类型应该被声明为非引用类型。
//然后在局部对象的声明周期结束之前,拷贝局部变量。
10、extern "C" 含义:实现C++与C及其它语言的混合编程,混合调用。例如:
在声明的时候将函数用extern "C" {xxType xxFunc();}所包围,调用的时候用extern xxType xxFunc();声明该函数后使用。
11、函数指针:
[cpp]
在CODE上查看代码片派生到我的代码片
int func(int);//普通函数
int func1(int);//普通函数
int (*pf)(int);//函数指针
pf = func;//为函数指针赋值
int (*pfs )(int);//定义函数指针数组,长度为2
typedef int (*PFV)();//定义函数类型指针typedef
PFV test ;//定义函数指针数组
test[0] = func;
test = func1;
12、头文件为所向extern对象声明、函数声明、inline函数定义提供了一个集中的位置:被称作声明的局部化。如果一个文件要使用或定义一个对象或函数时,它必须包含相应的头文件。
头文件提供的声明逻辑上应该属于一个组。
头文件不应该含有非inline函数或对象的定义。符号常量(const int PI = 3.14)和inline函数不受此限制。