主函数中,argc是参数个数,argv是参数内容,arge是环境变量。
2.指针p被free之后会成为野指针,在没有将指针p置为NULL的情况下,如果再次free就危险了。所以,在free之后,最好是马上将指针置为NULL,这样就安全了。对于一个NULL的指针,free多少次都没有问题。定义指针的时候最好初始化,初始化指针的时候是用:char* p = NULL;
3.
char a[] = "hello";
a[0] = 'X';//正确可以正常赋值
cout << a << endl;
char *p = "world"; // 注意p指向常量字符串,是一个字符常量,不能被修改。
p[0] = 'X'; // 编译器不能发现该错误
cout << p << endl;//但是运行时出现错误。
4.悬空指针:指向一个已经不存在的指针, 比如说函数的返回引用
char* func()
{
char a = 'a';//在函数调用完毕之后,a会被释放。
return &a;//不要返回普通局部变量的地址。
}
5.共用体 同时只能存储其中的一种类型。如
union one4all
{
int int_val;
long long_val;
double double_val;
};条件是在不同的时间运行。
6.clock()返回程序开始执行后所用的系统时间,它的返回值为clock_t(类型别名:即转换为适合系统的的其他类型)包含在ctime头文件系统中。符号常量CLOCKS_PER_SEC(每秒钟包含的系统时间单位数)。
7.关于函数指针:
// double pan(int)和double (*pf)(int);两个都是函数,并且pf就是函数指针。
pf = pam;//那么pf现在指向pan()函数。(pam()的特征标和返回类型必须与pf相同
double pam(int);
double (*pf)(int);
pf = pam;
double x = pam(4);
double y = (*pf)(5);//两者都在调用同一个函数。
double y = pf(5);//使用指针来调用函数。
8.对于修改调用函数中数据的函数。函数调用传参数:
如果对象是内置数据类型,则使用指针。
如果对象是数组,则只能使用指针。
如果对象是结构,则使用引用或指针。
如果对象是类对象,则使用引用。
9.常规new操作符的地址在动态管理的堆中 布局new操作符在从数组中申请内存。
如果有数组 int buffer[500]
常规new:int *ps = new int [20]; 可以使用 delete [] ps;删除
布局new: int *ps = new (buffer) int [20]; 不能用delete删除 会出错由于分配的不在delete范围内;
10.通过定义一个了类重载函数调用操作符(),可以使该类的对象像函数的行为,那么它的对象就是函数对象。函数的对象通常用作算法的实参。
11.通过定义复制构造函数为私有的,可以禁止复制,通过声明而不定义,那么友元也不能访问复制构造函数。
12.++i 比 i++ 执行效率高,因为不需要返回临时对象,当i为迭代器的时候差距会更明显。
13.#ifndef STRING_H #define STRING_H #endif 可以避免多次包含同一头文件。
14.补充:在类中成员变量前声明mutable关键字表示,那么该成员变量在const成员函数里可以在被改变。
15.为了保证成员函数在执行过程中不会修改const成员,那么需要在类成员函数的后面添加const。
17.在类中定义常量可以使用 static const int size = 100; 和 enum { size = 1000 }。static成员不能在类中初始化,只能在定义的时候初始化。
18.inline 函数:省去了参数压栈、生成汇编语言的CALL调用、返回参数、return等过程,从而提高速度,但是浪费了空间。
19.使用复制构造函数和operator=的时候区别是:当用来创建对对象的时候使用前者,否则使用后者。例如:Obj o = a;(等价于Obj o(a))(拷贝构造函数) o = a;(赋值操作符)
20. extern int a; 表示变量是在文件以外定义的,或在文件后面部分定义的。(不需要给a分配空间。)
21.带.h和不带.h的头问家的区别是:一个模板化版本,一个没有。后者一般都在文件名前加一个字母“c”;
22.C++中不允许,利用返回值来重载函数。