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

C++学习杂记

2012-03-15 20:18 232 查看
一.函数重载:函数名相同,返回值相同,只有参数不同(注意:float,double类型参数).
二.模板函数:可以将参数和返回值设置为模板类型,编译时候确定具体类型.
三.当模板函数和同名的非模板函数重载时,首先寻找与参数类型完全匹配的非模板函数,找到了,则调用它,如果没找到,则寻找函数模板,找到后具体化函数模板,而后调用该模板函数.
四.用new分配的数组,必须delete []清除,确保数组中的对象能够正常的调用析构函数,清理资源.
五.用new创建的类指针,如果被赋值指针并非类指针类型,则调用delete销毁时,一定要先转换回所分配的类指针类型,然后销毁该指针,否则不能正常完成析构.
例: void *pClass = (void*)new A();
//delete pClass; 错误写法
A *pA = (A*)pClass; //正确做法
delete pA;
六.私有继承关系中,编译器不会自动将一个派生类对象转换为一个基类对象.
七.数组作为函数参数传递方式:
方法 1:
void func(int arr[], const int size) ;
因为对数组的处理其实是指针,无法从数组本身获得其长度,所以在参数列表中加入一个size来表示该数组长度

方法 2:

void func(int arr* const int size) ;

同方法一,只不过干脆变成了指针的形式。 这些都是传统的c模式下的函数定义方式

方法3 :

void func (int (&arr)[10] ) ;

使用数组引用作为参数。 这样的好处是数组长度是固定的,实参数组的长度必须与虚参数组的长度一致,否则编译会报错。这样作的坏处是,实参长度被限制,缺少了灵活性。 所以有了方法4

方法4, 使用函数模版:

template <int size>

void func(int (&)arr[size]) ;

这样在调用模版的时候再以常量指定size值,充分有了灵活性

方法5, 使用无引用的函数模版

template <int size>

void func(int arr[size]) ; //其实在函数参数中的size是不起作用的
八.观念上每个类都会拥有构造函数,析构函数,拷贝构造函数和赋值操作运算符的重载,即使 你自己没有在类中实现,但是从《深度探索C++对象模型》一书中,我知道并不是每个类都产生以上函数,通过位拷贝的方式进行。
九.如果一个类作为基类,则析构函数设置为虚函数。
十. 一个数圆成另一个数的倍数例如10要变成大于或等于8的倍数:(10 + (8 - 1)) &~(8 - 1)
求索引:例如以8为基准小于等于8的为0,9到2*8的为1,依次类推, (10 + (8 - 1))/8 - 1

十一.new的三种用法:

1、new operator 即:new表达式,例:string s = new string("test"); 分配空间,然后初始化对象,调用构造函数。与之对应的是delete operator,调用析构函数,释放对象申请的空 间.
2、operator new 即:new操作符,例:void *buf = operator new(sizeof(string)); 只是申请一块sizeof(string)大小的内存空间,并不会初始化对象和调用构造函数。与之对应的是 operator delete释放空间,并不会调用析构函数。
3、placement new 即:在指定的内存空间中初始化对象,并调用构造函数。例:void* buf = operator new(sizeof(string));
buf = new(buf) string("test");首先申请一块空间,然后在该空间上,初始化string对象。与之对应的就是自己需要调用析构函数,并利用operator delete释放内存空间。
另:operator new 会多申请sizeof(int)大小的内存用来保存这段空间的大小。placement new 如果在申请一个数据的时候也要多申请sizeof(int)大小的空间用来保存数组的大小。eg,void *ptr = operatro new(sizeof(int)*100);int *iPtr = new(ptr)int[100];//如果这样,那么这里将会出错的,因为你实际上系统是申请了100+sizeof(int)的空间!然而ptr上面只有100*szieof(int)的大小,所以申请空间失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: