1. shared_ptr
解析:shared_ptr是一种计数指针,当引用计数变为0时,shared_ptr所指向的对象将会被删除。如下所示:
void test() { shared_ptr p1(new int); // 计数为1 { shared_ptr p2(p1); // 计数为2 { shared_ptr p2(p1); // 计数为3 } // 计数为2 } // 计数为1 } // 计数为0,同时int对象被删除
2. unique_ptr
解析:unique_ptr是定义在<memory>中的智能指针(smart pointer)。它持有对对象的独有权,即两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作。
3. const类成员函数
解析:const类成员函数不能修改任何成员变量,但是mutable修饰的变量除外。
说明:const int *p与int const *p没有区别;const int *p; [p可以修改,但是p指向对象的内容不可修改];int * const p; [p不可修改,但是p指向对象的内容可以修改]。
4. 拷贝构造函数
解析:拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。在C++中,三种对象需要调用拷贝构造函数的情况,如下所示:
(1)对象以值传递的方式传入函数参数。
(2)对象以值传递的方式从函数返回。
(3)对象需要通过另外一个对象进行初始化。
浅拷贝指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的是浅拷贝。大多情况下“浅拷贝”都能很好地工作,但是一旦对象存在了动态成员,那么浅拷贝就会出现问题。
5. 《C++标准程序库》
解析:
(1)第1章至第4章总体介绍了本书及C++标准程序库;
(2)第5章至第9章分别从各个方面描述STL;
(3)第10章至第12章描述了一些“简单的”标准类别;
(4)第13章至第14章的主题是I/O和国际化;
(5)第15章描述C++标准程序库中内存模型的概念。
(6)附录主要是参考资料。
6. 模板类ostream_iterator
解析:template <class T, class charT=char, class traits=char_traits<charT> > class ostream_iterator;
举个例子,如下所示:
// ostream_iterator example #include <iostream> // std::cout #include <iterator> // std::ostream_iterator #include <vector> // std::vector #include <algorithm> // std::copy int main () { std::vector<int> myvector; for (int i=1; i<10; ++i) myvector.push_back(i*10); std::ostream_iterator<int> out_it (std::cout,", "); std::copy ( myvector.begin(), myvector.end(), out_it ); return 0; }
7. int* p和int *p区别
解析:没有区别,只不过int* p强调类型是int指针,而int *p强调对象是int指针。
8. extern语法
解析:
(1)extern修饰变量的声明 比如,extern int i。 (2)extern修饰函数的声明 比如,extern int fun(int i)。 (3)extern修饰C/C++函数的调用规范 比如,在C++中调用C库函数,需要在C++中用extern "C"声明要引用的函数。
9. #pragma once
解析:#pragma once是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。需要注意的是这种方式是微软编译器独有的,并且不支持跨平台。如果需要支持跨平台,那么需要使用#ifndef/#define/#endif。
10. C++中的Virtual关键字
解析:
(1)virtual ReturnType Function_1(); //虚函数声明 (2)virtual ReturnType Function_2() = 0; //纯虚函数声明
说明:包含纯虚函数的类被称为抽象基类。
11. C++关键字
解析:
12. wchar_t(宽字符类型,双字节类型)
解析:wchar_t的本质是typedef unsigned short wchar_t;(重点理解char,wchar_t,string,wstring类型之间的相互转换)。
说明:wstring是宽char,Unicode编码,一个字符占两个字节大小;而string是窄char,ASCII编码,一个字符占一个字节大小。
说明:short int(2个字节);long int(4个字节);long double(8个字节)。要学会使用sizeof(wchar_t)查看数据类型的字节大小。
13. C++中的左值和右值
解析:
(1)左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。 (2)右值(rvalue):指的是存储在内存中某些地址的数值。右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
14. C++全局变量初始值
解析:
(1)int:0 (2)char:'\0' (3)float:0 (4)double:0 (5)pointer:NULL
说明:当定义局部变量时,系统不会对其进行初始化,你必须自行对其进行初始化。
15. C++内存区域划分
解析:
(1)栈:由编译器自动分配和释放,通过存储的变量是局部变量、函数参数等。
(2)堆:由new分配的内存块,通常一个new对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
(3)自由存储区:由malloc等分配的内存块,用free释放掉内存块。
(4)全局/静态存储区:全局变量和静态变量共同占用同一块内存区。
(5)常量存储区:存储常量,不能修改。
16. C++类型限定符
(1)const:const类型的对象在程序执行期间不能被修改改变。
(2)volatile:修饰符volatile告诉编译器不对代码进行任何优化。
(3)restrict:restrict修饰的指针是能够访问所指区域的唯一入口。(C99新增)
17. C++存储类
解析:
(1)auto存储类:所有局部变量默认的存储类。
(2)register存储类:定义存储在寄存器中而不是RAM中的局部变量。
(3)static存储类:局部变量;全局变量;类数据成员变量。
(4)extern存储类:提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。
(5)mutable存储类:如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。如果需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。
18. C++字符串
解析:
(1)C风格字符串:头文件#include <cstring>,常用的函数包括strcpy(s1, s2);strcat(s1, s2);strlen(s1);strcmp(s1, s2);strchr(s1, ch);strstr(s1, s2)。
(2)C++风格字符串:头文件#include <string>。
说明:C++运算符:算术运算符;关系运算符;逻辑运算符;位运算符;赋值运算符;杂项运算符。
19. C++继承与权限
解析:
(1)public => public继承 => public。 (2)public => protected继承 => protected。 (3)public => private继承 => private。 (4)protected => public继承 => protected。 (5)protected => protected继承 => protected。 (6)protected => private继承 => private。 (7)private => public继承 => 子类无权访问。 (8)private => protected继承 => 子类无权访问。 (9)private => private继承 => 子类无权访问。
说明:成员和类的默认访问修饰符是private。
20. 友元函数和友元类
解析:
(1)友元函数 类的友元函数可以访问类的所有私有(private)成员和保护(protected)成员,但是友元函数并不是类的成员函数。比如, friend void printWidth( Box box ); (2)友元类 友元类及其所有成员都是友元。比如friend class ClassTwo;
21. stringstream
标准头文件<sstream>定义了一个叫做stringstream的类,可以进行字符串与数值之间的相互转换。如下所示:
string mystr ("1204"); int myint; stringstream(mystr) >> myint;
说明:命令执行完毕后,变量myint存储的数值为1204。
22. 字符串和其它数据类型的转换
解析:
函数库cstdlib提供了3个有用的函数。如下所示: (1)atoi: 将字符串string转换为整型int。 (2)atol: 将字符串string转换为长整型long。 (3)atof: 将字符串string转换为浮点型float。
23. ANSI-C中的动态内存管理
解析:
(1)malloc函数:void *malloc(unsigned int num_bytes):动态申请size个字节的内存空间。 (2)calloc函数:void *calloc(unsigned n, unsigned size):用于向系统动态申请n个,每个占size个字节的内存空间,并把分配的内存全都初始化为零。 (3)realloc函数:void *realloc(void *p, unsigned size):将指针p所指向的已分配内存区的大小改为size。 (4)free函数:void free(void *p):释放指针p所指向的内存空间。
24. const char * what() const throw()
解析:const throw()是异常规格说明,它表示what()可以抛出异常的类型,类型说明放到()里面,比如throw(int)。如果里面没有类型,那么表示这个函数不抛出任何异常。通常函数后面不写throw()表示该函数可以抛出任何类型的异常。
25. C++多线程编程
解析:
(1)Linux下常用#include <pthread.h>,对应的Windows版本为POSIX Threads for Win32。
(2)C++准标准库中的#include <boost/thread.hpp>。
(3)C++11标准库中的#include <thread>。
(4)Win32多线程中的#include <windows.h>和#include <process.h>。
参考文献:
[1] cplusplus:http://www.cplusplus.com/
[2] C++的const类成员函数:http://blog.csdn.net/lihao21/article/details/8634876
[3] C++拷贝构造函数详解:http://blog.csdn.net/lwbeyond/article/details/6202256
