您的位置:首页 > 编程语言 > C语言/C++

关于C++的一些小知识点

2014-10-19 18:08 246 查看


1.C++中,临时对象都是const类型的。
实际上这种说法应该来源自大名鼎鼎的<more effect C++>.但是根据我的理解这种说法实际上是错的.
真正的说法应该是这样的
仅当通过传值(by value)方式传递对象或传递常量引用(reference-to-const)参数时,才会发生这些类型转换(产生临时对象)。当传递一个非常量引用(reference-to-non-const)参数对象就不会发生。

2不能建立数组的引用。

因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合.但是这样的写法是对的

int
a[3];

int(&ref)[3] = a;
通过加括号的方式将引用限定在数组上(仅仅引用的是数组名,可以理解为引用一个指针);

3.使用虚析构函数的目的在于使用多态时,保证析构函数被调用
      对应的在使用多态时,不适用虚析构函数时,析构函数无法保证正确的被调用.

4.派生类的析构函数会自动调用基类的析构函数

      对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

5.在继承类的虚函数表中

   详细情况请参阅

1)虚函数按照其声明顺序放于表中。
2)父类的虚函数在子类的虚函数前面。
3)覆盖父类的虚函数(只是复写虚函数,而非重载)被放到了虚表中原来父类虚函数的位置,由此实现了多态.
6.引用与指针的区别
指针和引用主要有以下区别: 

(1)引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 

(2)引用初始化以后不能被改变,指针可以改变所指的对象。 

(3)不存在指向空值的引用,但是存在指向空值的指针。
 但是由于C++标准并没有对于引用的实现要求,在多数情况下,引用都是使用常量指针实现的.但是编译器会特意去屏蔽这一点,是大家无法读取常量指针.

指针和引用主要有以下区别:
 

1
)引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配
存储空间。
 

2
)引用初始化以后不能被改变,指针可以改变所指的对象。
 

3
)不存在指向空值的引用,但是存在指向空值的指针。

7.类成员函数的重载、覆盖和隐藏区别

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

 8.理论上来说,子进程应该完整地复制父进程的堆,栈以及数据空间,但是2者共享正文段。

9.如果一个类只有方法而可以考虑使用静态类,即类成员都是静态的,方法都是public的,

静态类只用于包含静态成员的类型,它既不能实例化,静态类的特性是防止继承,防止外部来NEW。

static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了。由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。为什么呢?因为static成员函数不是任何对象的组成部分。static成员函数可以直接访问所属类的static成员,但是不能直接使用非static成员函数!

10.注意内存的释放

相对于拥有垃圾回收机制的JAVA,C++不得不自己控制内存的释放,诸如malloc,new,都需要自己去释放,同时如果是使用win32编程或者是mfc编程,更要注意释放DC,pen等object

11.关于死循环

一般for(;;)性能更优

for(;;)  

{}  

这两个;; 空语句,编译器一般会优掉的,直接进入死循环

while(1)  

{}  

每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事

开启多线程时,while(1)和for(;;)区别会体现出来,前者存在判断环节,导致线程之间出现运行差别。for(;;)则不会影响,理论上线程会保持同时运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++