C++ 补课 (三)
阅读原文时间:2023年09月22日阅读:1

1,枚举类型 —— 下标自0开始

enum 枚举类型名 { 常数表 }

2,C++ 的异常处理机制实际上是一种运行时通知机制

3,delete p;只是删除指针p指向内存区,并不是删除指针p,所以p还是可以用的。删除空指针所指向内存是可以的。

4,为了避免内存泄露,在删除一个指针后应该将其其值赋为0。

5,常量指针是指针指向的内存区域地址不能改变,但是该内存地址里保存的值是可以改变的,比如int a; int * const p = &a;

指向常量的指针表示指针指向的对象是不能被修改的,但是该指针可以被修改,即该指针可以指向另一块目标内存地址。比如const int a = 0; const int *p = &a; 如果A是一个类,也可以为const A* p = new A; —— 可以理解成只读指针

而指向常量的常指针表示指针本身不能被修改,其指向的内存地址内容也不能被修改。比如const int a = 0; const int * const p = &a;

6,既然引用实现了指针的功能,而且使用起来更加方便,为什么还要指针呢?

这是因为指针可以为空,但是引用不能为空,指针可以被赋值,但是引用只可以被初始化,不可以被赋为另一个对象的别名。如果你想使用一个变量来记录不同对象的地址,那么就必须使用指针,另外指针也可以是多重的。指针可以指向堆中空间,引用不能指向堆中空间。但指针和引用可以一同使用,另外要注意引用的生命周期。

对于引用而言,如果引用是一个临时变量,那么这个临时变量的生存周期不会小于这个引用的生存期。指针不具备这个特性。

为了避免内存泄露,我们不能按值的方式返回一个堆中对象,而必须按地址或者别名的方式返回一个别名或者内存地址,这样就不会调用复制构造函数来创建一个该对象的副本了,而是直接将该对象的别名或者地址返回。

为了避免指针混淆,我们必须对堆中的内存在哪个函数中创建,就在哪个函数中释放。

7,在一条语句中自加运算符的执行顺序为从右向左,且不同的编译器入栈的顺序不同。

比如说VC6.0中其入栈是要求该语句的表达式执行完后。因此a=1;cout<<a++<<++a;则分别输出的是2,2;

++的结合性为右结合,所以++++i合法,而i++++不合法,可以改为(i++)++;

8,如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,那么在派生类中访问共同基类中的成员函数时会产生二义性,解决方法是需要指定类的作用域,或者将共同的基类设置为虚基类,因为虚基类不会产生二义性。

一个虚函数被说明为虚函数,在派生类中覆盖了该函数,那么该函数也是个虚函数,不过你也可以在它前面添加关键字virtual,这样更容易理解。

继承所体现出的不同子类相同函数有不同的表现,但是这个并不能体现类的多态性,因为类的多态性要求可以用基类指针来操作子类。

9,如果a表示的是数组指针,delete[] a,表示删除堆中的指针数组a,而delete a,表示删除堆中的指针数组第一个指针。

10,由于malloc和free函数产生于C语言时代,因此不可用在c++的对象中,因为对象的产生要调用构造函数。

11,函数名是指向函数的第一条指令的常量指针,这与数组名是指向数组中第一个元素的常量指针一样。

函数指针应该将函数名和前面的指针给括起来。

使用函数指针可以减小一些重复的代码,因为函数指针名可以看作是函数名的代号,我们可以通过它来直接调用,函数指针经常会在条件或者判断语句里出现,以便于用户选择调用不同名字但又返回值类型和参数类型完全相同的函数。函数指针可以作为函数的参数传入。

12,char字符串的比较只能用循环的方式进行(或者使用库函数strcmp函数),而string的比较可以直接用等号。

不可以直接对char型字符串数组进行赋值操作,而只能使用strcpy函数,或者对数组每个元素一个个的赋值。而string类的字符串可以直接用等号进行赋值。另外,string类中还有一个专门的赋值函数assign,这个函数可指定赋值字符串起点和长度。

查看char型字符串的长度可以用strlen函数。string中用size成员函数实现该功能。在char中,strncat可以实现部分字符串的合并。在string中是append函数。同理,char中用strncpy来实现字符串的替换,在string中使用replace来实现该功能,且replace的重载函数中可以兼容char型字符串数组。

char型字符串的拷贝用memmove, string中使用copy成员函数。

string中用insert来插入,其string类是从下标为1开始数的。erase完成字符串的删除。

char型字符串的查找使用函数strchr。而string类中使用find函数实现。该函数有很多变形的函数,比如find_first_not_of函数,表示找到第一个不相同的字符。同理还有find_first_of,find_last_of等函数。反向查找使用rfind()函数,但是它的返回值位置还是从头开始的,并不是从末尾开始的。

string中用compare实现比较,它的c_str()返回一个指向char型的const指针。

13,包含对象是将另一个类的对象作为该类的成员,而嵌套类是在该类中定义了一种新类型,这个类型只能在该类中使用。由于嵌套类作为一种自定义的数据类型被封装在另一个类中,因此可避免与其它类的名称冲突。


参考:http://www.cnblogs.com/tornadomeet