1. C++初始化变量
赋值初始化: int ival = 1024;
直接初始化: int ival(1024);
2.const 默认为文件的局部变量
3.引用(&)
格式:int ival = 1024;
int &refval = ival; // 引用必须初始化就绑定对象
4. const 引用
const 引用 必须指向 const对象或者 指向 一个 非const不同类型对象,但需相关的(例如: double a = 3.14; const int &ri = a;
编译器会转化: int temp = a; const int &ri = temp) 或者指向一个常数值(cosnt int &ri = 1)
5. 枚举成员的值不一定唯一
enum Name { d1 = 2, d2, d3 = 3, d4} // 其中各个元素的值为: d1 = 2, d2 =2, d3 = 3, d4 = 4;
6. string中访问每个字符的for循环形式:
for(string::size_type ix = 0 ; ix < str.size(); ix++)
count << str[xi] << endl;
7. 用迭代器和vector 访问元素的区别:
for(vector<int>::size_type ix = 0; ix != ivec.size(); ix++)
ivec[ix] = 0;
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0;
这就是以上的区别
还有 const_iterator 就是说它迭代的元素只能读,不能修改.
8.数组的下标不能是非const变量以及要到运行阶段才知道其值的变量都不能用于定义数组的维数
int staff_size = 1;
int chen[staff_size];//错误的,不能用staff_size赋值
9.不允许数组直接复制
int a1[] = {1,2,3};
int s2[](a1); // error;貌似string可以这样复制
10.数组下标类型为 size_t
for(size_t ix = 0; ix != array_size; ++ix)
array[ix] = ix;
11.两个指针相减的类型为ptrdiff_t 为signed类型
12.指针和typedef
string s;
typedef string *pstring;
const patring cstr1 = &s;
pstring cosnt cstr2 = &s;
string *cosnt cstr3 = &s;
以上三个都是一样的
不能吧typedef展开来理解 const pstring cstr = cosnt string * cstr 是错误的。
13 动态数组的定义
动态分配数组时,如果数组元素具有类型,将使用该类型默认的构造函数初始化,如果函数式内置的则无初始化
string *pas = new string[10]; // 自动初始化为空字符串
int *pia = new int[10]; // 没有初始化
要想对元素进行默认初始化,需要在后面跟一个()
int *pia = new int[10](); // 都初始化为0
14.对于const对象的动态数组必须初始化
const int *pci_bad = new const int[10]();
15.混合使用标准库类string 和 C 风格字符串
string st3("Hello World");
char *str2 = str3.c_str();// c_str()为转化函数
16.使用数组初始化vector对象
void traveral(vector<int> ivec);
const size_t arr_size =6;
int int_arr[arr_size] = {1,2,3,4,5,6};
vector<int> ivec1(int_arr, int_arr + arr_size); //范围为从int_arr 到 int_arr + arr_size ,但是不包括arr_size
traveral(ivec1);
vector<int> ivec2(int_arr + 1, int_arr + 4);
traveral(ivec2);
17.只有在必要的时候才使用后置操作符(++、--)
意思就是能用 a++ 或 ++a 都能行的时候,尽可能用++a,因为这样会减少很多额外的工作
18.简洁就是美
C++非常通用的迭代输出
vector<int>::iterator iter = ivec.begin();
while(iter != ivec.end())
cout << *iter++ << endl;
19.new 和 delete
a.只有用new分配的内存空间才可以用delete释放
b.用delete释放过的内存空间的原引用赋值为0 // int *p = new int(); delete p; p = NULL; 不赋值为0的话,p就成了悬垂指针,他指向曾经存放对象的内存,但该对象已经不再存在,再对p进行解引用的话,就会出现严重的错误。
20.const 对象的动态分配和回收
创建动态对象必须在创建时初始化
const int *pci = new const int(1024);
delete pci;
21. 数组型材的定义
void printValue(int * a){}
void printValue(int a[]){}
void printValue(int a[10]){}
以上三个都是一样的,接受一维数组的。
编译器不检查数组维数,只注重类型
22.通过引用传递数组
void printValue(int (&aar)[10]){}; // 引用传递数组,数组的维数必须是个定值,传递的参数必须维数和形参一样,否则出错
23.容器中能用迭代器p 和 一个指针在 容器的计算中是通用的
比如: insert(p, b, e) // 其中b,e都是迭代器变量,但是用指针也行
int a[10]={1,2,3,4,5,6,7,8,9,10};
vector<int> v1(a,a+10);
v2.insert(v2.end(),v1.begin(),v1.end());
v2.insert(v2.end(),a, a+10);
两个插入语句都行的。
24. const 成员函数
a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的
25 C++如何确定常量的类型
对于数字后面有明显后缀按后缀提示来确定类型
对于没有明确后缀的根据大小:
对于10进制数 int long unsigned long
对于8进制和16进制 int unsigned int long unsigned long
26 动态分配的空间,不能用sizeof求大小
27 输出字符串的首地址可以用 (int *) + 字符串名字 进行强制转换。