关于C++的一些小知识点
2014-10-19 18:08
246 查看
实际上这种说法应该来源自大名鼎鼎的<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/C++一些面试/笔试题的反思(超基础的知识点)
- 最近看的一些关于数据结构和C++的面试知识点总结
- 关于C/C++一些面试/笔试题的反思(超基础的知识点)
- 关于C++泛型编程的一些杂感
- 关于C/C++编辑器与编译器的一些介绍
- ASP.Net一些知识点(关于.net与JS如何交互)
- 关于C/C++程序的一些规范(2005-5-10)
- 关于C++的一些细节[三:复合类型]
- 关于C++泛型编程的一些杂感
- 关于Borland C++BuilderX的一些问题的回答
- 关于C++泛型编程的一些杂感
- 摘录的一些Bjarne Stroustrup关于C++的谈话内容
- 关于C++的一些特别的站点
- 关于C++和C#的自定义数据类型转换的一些思考
- 一些关于VC的知识点
- [初]snail关于C++指针与内存管理的一些备忘
- 关于C++的一些细节[二:简单变量]
- 关于C++的一些细节[一]
- 关于Matlab,C/C++和Java之间的一些想法
- 关于c++的一些注意事项